Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#302-ダイヤがうまく回らないのでとりあえず各停のみで走れるauto_operationを作る #339

Merged
merged 4 commits into from
Nov 18, 2022
Merged
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
159 changes: 80 additions & 79 deletions backend/auto_operation/DiaPlanner.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,44 +44,44 @@ def __init__(self, state: State) -> None:

# ダイヤ自動更新の初期値を記述
def setup(self) -> None:
# 初期値として、列車0は八王子経由の特急とする
# 初期値として、列車0は八王子経由の特急とする→各停に変更
self.setDia(0, "shinjuku_down", False, 5, "shinjuku_b2", "shinjuku_b1")
self.setDia(0, "sakurajosui_down", False, 0, "sakurajosui_b2", "sakurajosui_b5")
self.setDia(0, "chofu_down", False, 5, "chofu_b2", "chofu_b4")
self.setDia(0, "hachioji_down", False, 5, "chofu_b4", "hachioji_b1")
self.setDia(0, "hachioji_up", False, 5, "hachioji_b1", "hachioji_b2")
self.setDia(0, "chofu_up", False, 5, "hachioji_b2", "chofu_b5")
self.setDia(0, "sakurajosui_up", False, 0, "sakurajosui_b3", "sakurajosui_b6")
self.setDia(0, "sakurajosui_up", False, 0, "sakurajosui_b4", "sakurajosui_b6")
self.setDia(0, "shinjuku_up", False, 5, "sakurajosui_b6", "shinjuku_b2")

# 初期値として、列車1は八王子経由の普通とする
self.setDia(1, "shinjuku_down", False, 5, "shinjuku_b2", "shinjuku_b1")
self.setDia(1, "sakurajosui_down", True, 5, "sakurajosui_b1", "sakurajosui_b5")
self.setDia(1, "sakurajosui_down", False, 5, "sakurajosui_b2", "sakurajosui_b5")
self.setDia(1, "chofu_down", False, 5, "chofu_b2", "chofu_b4")
self.setDia(1, "hachioji_down", False, 5, "chofu_b4", "hachioji_b1")
self.setDia(1, "hachioji_up", False, 5, "hachioji_b1", "hachioji_b2")
self.setDia(1, "chofu_up", False, 5, "hachioji_b2", "chofu_b5")
self.setDia(1, "sakurajosui_up", True, 5, "sakurajosui_b4", "sakurajosui_b6")
self.setDia(1, "sakurajosui_up", False, 5, "sakurajosui_b4", "sakurajosui_b6")
self.setDia(1, "shinjuku_up", False, 5, "sakurajosui_b6", "shinjuku_b2")

# 初期値として、列車2は橋本経由の特急とする
# 初期値として、列車2は橋本経由の特急とする→各停に変更
self.setDia(2, "shinjuku_down", False, 5, "shinjuku_b2", "shinjuku_b1")
self.setDia(2, "sakurajosui_down", False, 0, "sakurajosui_b2", "sakurajosui_b5")
self.setDia(2, "chofu_down", False, 5, "chofu_b1", "chofu_b3")
self.setDia(2, "hashimoto_down", False, 5, "chofu_b3", "hashimoto_b1")
self.setDia(2, "hashimoto_up", False, 5, "hashimoto_b1", "hashimoto_b2")
self.setDia(2, "chofu_up", False, 5, "hashimoto_b2", "chofu_b5")
self.setDia(2, "sakurajosui_up", False, 0, "sakurajosui_b3", "sakurajosui_b6")
self.setDia(2, "sakurajosui_up", False, 0, "sakurajosui_b4", "sakurajosui_b6")
self.setDia(2, "shinjuku_up", False, 5, "sakurajosui_b6", "shinjuku_b2")

# 初期値として、列車3は橋本経由の普通とする
self.setDia(3, "shinjuku_down", False, 5, "shinjuku_b2", "shinjuku_b1")
self.setDia(3, "sakurajosui_down", True, 5, "sakurajosui_b1", "sakurajosui_b5")
self.setDia(3, "sakurajosui_down", False, 5, "sakurajosui_b2", "sakurajosui_b5")
self.setDia(3, "chofu_down", False, 5, "chofu_b1", "chofu_b3")
self.setDia(3, "hashimoto_down", False, 5, "chofu_b3", "hashimoto_b1")
self.setDia(3, "hashimoto_up", False, 5, "hashimoto_b1", "hashimoto_b2")
self.setDia(3, "chofu_up", False, 5, "hashimoto_b2", "chofu_b5")
self.setDia(3, "sakurajosui_up", True, 5, "sakurajosui_b4", "sakurajosui_b6")
self.setDia(3, "sakurajosui_up", False, 5, "sakurajosui_b4", "sakurajosui_b6")
self.setDia(3, "shinjuku_up", False, 5, "sakurajosui_b6", "shinjuku_b2")

# ダイヤ自動更新のルールを記述. 毎update時によぶ
Expand All @@ -104,77 +104,78 @@ def update(self) -> None:
# self.setDia(1, 1, False, 0, 2, 4)
# print("[DiaPlanner.update] wait flag switched!")

# 桜上水下り線で退避していた列車の退避終了処理
waitingTrain = self.__state.getTrainInSection(
self.__state.getSectionById("sakurajosui_b1")
) # 桜上水下り退避線にいる列車
if waitingTrain is not None and self.getDia(waitingTrain.id, "sakurajosui_down").wait:
for train in self.__state.trainList:
# sectionが変化した瞬間だけ、mileageがprevmileageより小さくなることを利用し、桜上水を出発した下り列車がいるか判断。いれば、追い抜きに成功したので、退避していたほうの退避フラグをリセット
if (
train.currentSection.id == "sakurajosui_b5"
and train.mileage < train.prevMileage
):
self.setDia(
waitingTrain.id,
"sakurajosui_down",
False,
5,
"sakurajosui_b1",
"sakurajosui_b5",
)
print(f"[DiaPlanner.update] train {waitingTrain.id} wait finish!")
# 退避を終えて出発した各停列車の退避フラグを再びTrueに戻す
sakurajosuiDepartedTrain = self.__state.getTrainInSection(
self.__state.getSectionById("sakurajosui_b5")
) # 桜上水下りを出発後の列車を取得
if sakurajosuiDepartedTrain is not None and (
sakurajosuiDepartedTrain.id == 1 or sakurajosuiDepartedTrain.id == 3
): # 各停列車なら
self.setDia(
sakurajosuiDepartedTrain.id,
"sakurajosui_down",
True,
5,
"sakurajosui_b1",
"sakurajosui_b5",
)

# 桜上水上り線で退避していた列車の退避終了処理
waitingTrain = self.__state.getTrainInSection(
self.__state.getSectionById("sakurajosui_b4")
) # 桜上水上り退避線にいる列車
if waitingTrain is not None and self.getDia(waitingTrain.id, "sakurajosui_up").wait:
for train in self.__state.trainList:
# sectionが変化した瞬間だけ、mileageがprevmileageより小さくなることを利用し、桜上水を出発した上り列車がいるか判断。いれば、追い抜きに成功したので、退避していたほうの退避フラグをリセット
if (
train.currentSection.id == "sakurajosui_b6"
and train.mileage < train.prevMileage
):
self.setDia(
waitingTrain.id,
"sakurajosui_up",
False,
5,
"sakurajosui_b4",
"sakurajosui_b6",
)
print(f"[DiaPlanner.update] train {waitingTrain.id} wait finish!")
# 退避を終えて出発した各停列車の退避フラグを再びTrueに戻す
sakurajosuiDepartedTrain = self.__state.getTrainInSection(
self.__state.getSectionById("sakurajosui_b6")
) # 桜上水上りを出発後の列車を取得
if sakurajosuiDepartedTrain is not None and (
sakurajosuiDepartedTrain.id == 1 or sakurajosuiDepartedTrain.id == 3
): # 各停列車なら
self.setDia(
sakurajosuiDepartedTrain.id,
"sakurajosui_up",
True,
5,
"sakurajosui_b4",
"sakurajosui_b6",
)
# いったん追い抜き関係アルゴリズムをコメントアウト
# # 桜上水下り線で退避していた列車の退避終了処理
# waitingTrain = self.__state.getTrainInSection(
# self.__state.getSectionById("sakurajosui_b1")
# ) # 桜上水下り退避線にいる列車
# if waitingTrain is not None and self.getDia(waitingTrain.id, "sakurajosui_down").wait:
# for train in self.__state.trainList:
# # sectionが変化した瞬間だけ、mileageがprevmileageより小さくなることを利用し、桜上水を出発した下り列車がいるか判断。いれば、追い抜きに成功したので、退避していたほうの退避フラグをリセット
# if (
# train.currentSection.id == "sakurajosui_b5"
# and train.mileage < train.prevMileage
# ):
# self.setDia(
# waitingTrain.id,
# "sakurajosui_down",
# False,
# 5,
# "sakurajosui_b1",
# "sakurajosui_b5",
# )
# print(f"[DiaPlanner.update] train {waitingTrain.id} wait finish!")
# # 退避を終えて出発した各停列車の退避フラグを再びTrueに戻す
# sakurajosuiDepartedTrain = self.__state.getTrainInSection(
# self.__state.getSectionById("sakurajosui_b5")
# ) # 桜上水下りを出発後の列車を取得
# if sakurajosuiDepartedTrain is not None and (
# sakurajosuiDepartedTrain.id == 1 or sakurajosuiDepartedTrain.id == 3
# ): # 各停列車なら
# self.setDia(
# sakurajosuiDepartedTrain.id,
# "sakurajosui_down",
# True,
# 5,
# "sakurajosui_b1",
# "sakurajosui_b5",
# )

# # 桜上水上り線で退避していた列車の退避終了処理
# waitingTrain = self.__state.getTrainInSection(
# self.__state.getSectionById("sakurajosui_b4")
# ) # 桜上水上り退避線にいる列車
# if waitingTrain is not None and self.getDia(waitingTrain.id, "sakurajosui_up").wait:
# for train in self.__state.trainList:
# # sectionが変化した瞬間だけ、mileageがprevmileageより小さくなることを利用し、桜上水を出発した上り列車がいるか判断。いれば、追い抜きに成功したので、退避していたほうの退避フラグをリセット
# if (
# train.currentSection.id == "sakurajosui_b6"
# and train.mileage < train.prevMileage
# ):
# self.setDia(
# waitingTrain.id,
# "sakurajosui_up",
# False,
# 5,
# "sakurajosui_b4",
# "sakurajosui_b6",
# )
# print(f"[DiaPlanner.update] train {waitingTrain.id} wait finish!")
# # 退避を終えて出発した各停列車の退避フラグを再びTrueに戻す
# sakurajosuiDepartedTrain = self.__state.getTrainInSection(
# self.__state.getSectionById("sakurajosui_b6")
# ) # 桜上水上りを出発後の列車を取得
# if sakurajosuiDepartedTrain is not None and (
# sakurajosuiDepartedTrain.id == 1 or sakurajosuiDepartedTrain.id == 3
# ): # 各停列車なら
# self.setDia(
# sakurajosuiDepartedTrain.id,
# "sakurajosui_up",
# True,
# 5,
# "sakurajosui_b4",
# "sakurajosui_b6",
# )

# 指定した列車の、指定した駅に対するダイヤを取得
def getDia(self, trainId: int, stationId: Station.StationId) -> Dia:
Expand Down