074 渋滞する流れ星

二本までの路線を引いて、六つの星を夜の向こうへ届ける路線設計の玩具です。
一本ずつ流れ出す列、整った流れを眺める満足を中心にしています。
基本は重量7以内で全6星を32刻以内に配達。軽さ、早さ、見た目は別の任意目標です。

起動
Windows: Python 3を入れ、setup.batを一度実行し、play.batで遊びます。
macOS/Linux: Python 3でsetup.sh、その後play.sh。実行依存はPyxel＋標準ライブラリ。
検証環境はLinux/Python 3.12/Pyxel 2.9.9。Windows/macOSの実機は未検証です。
BATはASCII、パスを引用。UTF-8、空白と日本語を含むパス、別の作業場所を機械検査。

操作
SPACEで開始。矢印で駅、Zで選んだ駅を路線の末尾へ。Tabで路線1/2切替。
Backspaceで末尾削除。Enterで試運転、Spaceで一刻、Pで連続運転／停止。
Xで直前の編集・一刻を戻す。開始まで戻すと編集可能。Rで同じ需要を再開。
試運転中の矢印は星を選択（自動再生中はPで止めてから）。
1/2/3は状況、Bは比較、Hは説明、Mは表紙、Sは再現記録、F12は画像、Escで終了。
操作キーを全て離すまで次の操作は受け付けません。同時操作は不採用。
説明・結果中もキーの離しを追跡。説明中の時刻は停止します。

経路
駅A/B/X/Y/D/E。薄い線が設置可能辺、数字が長さです。長さは移動刻数と建設重量。
同じ物理辺を二路線で使っても重量は一回。最大2路線、各路線は同駅再訪なし・4辺まで。
2路線に属する駅だけが交差駅。画面の線が交わるだけの場所には駅も待機もありません。
初版では星が路線に沿って移動し、別の列車車両は走りません。

時刻と列
出現時刻rの星はr+1から出発。長さLの辺を時刻sに出発するとs+Lに到着。
普通駅到着tから次の出発はt+1、交差駅ならt+2。目的地なら即配達。
交差駅で同路線を進む場合も一拍。乗換で二重には待ちません。
有向物理辺は毎刻1星だけ進入でき、逆方向は別枠。交差駅は別の辺へ行く場合も毎刻1星だけ出発。
到着刻→星ID順で枠を予約し、全出発を同時適用。到着直後に再出発しません。
出発する星の経路は出現時に決定して固定。費用は辺長＋途中普通駅ごとの1刻＋途中交差駅の追加待機。
同費用は移動/乗換遷移数、駅ID列、路線ID列で決定。正の辺長なので往復経路を選びません。
経路選びの費用は途中の全駅で1刻を含み、交差駅だけ追加待機も加えます。表示の到着予定は出現刻＋初回1刻＋この費用。将来の列待ちは含まず、必ずその刻に届く保証ではありません。
次の一刻の予告は現在の路線を同じモデルで進めた結果です。

表示
□は追加一拍、●は出発/列待ち、×は接続なし。色だけに依存しません。
選んだ星は予定経路・実待機刻・実際の待機理由を表示。列待ちは交差枠/辺枠から生成。
総待機は各駅で到着/出現した刻を除き、出発できなかった刻の合計。一拍と容量待ちと接続なしを含みます。
前の実測行は終了した前試運転の状況/比較規則/配達数/時刻/重量/待機を保存。
条件が違うものを同じ実験とは扱わないため、状況と追加待機値を併記します。

試せる路線
A: A-DとB-Eは重量6、6刻で全配達。A-X-Y-DとB-X-Y-Eは重量5、13刻、総待機21。
B: A-DとB-Eだけでは交じった行先へ届きません。A-D-E-B一本は重量7、8刻、待機0。
C: 幹線共有は重量5、13刻、待機20。A-X-Y-EとB-Dへ分けると同じ重量5、7刻、待機0。
最も長い列だけが減ったときに全体改善とはせず、全便と各駅の実測を確認できます。
安全な直通、一本の路線も正当な達成。好みの線形を総合点へ潰しません。

比較
Bキーは交差駅到着の追加待機のみ1→0。交差駅出発枠、辺容量、需要、重量、目標は同じ。
比較版は経路費用と予告と説明も追加0で計算。全状況で共通路線が両版で全6星を配達。
比較版の速さだけでは人の面白さは分かりません。

検証・記録
model.pyはPyxelを使わない有限モデル、controller.pyは入力、app.pyは表示と記録。
python -m unittest -v test_model test_ui でテスト。experiments.pyは開発用有限列挙と方策比較。
路線反転と路線番号交換の重複だけ除いた全組を列挙。未設置・始点のみ・一本のみも含めます。
状況、規則版、意味入力、論理刻、正規化JSON SHA-256、終了状態を記録。
S出力はschema/version/labelと当時のソースSHA-256を含みます。
実操作はmedia/native_*、自動操作はmedia/automatic_*。原ソースと元ログを保持し、再検証は別資料へ。
動画は実際のPyxelを自動操作した無音素材。人の試遊・Windows実機・音の実聴は未確認。

権利
ソースLICENSE.txt。日本語文字はNoto Sans CJK由来の同梱ビットマップ、SIL OFL全文assets/NOTO-LICENSE.txt。
Pyxelのライセンス全文assets/PYXEL-LICENSE.txt。外部画像・音楽素材は使っていません。

開発中に設計追補を反映し、経路費用へ途中駅の通常1刻を含めるv1.1へ修正。旧撮影と当時のソースは保持。列挙には始点だけの路線も追加して、編集可能な構成を漏らさず検査しました。
