旅客と貨物の分配

旅客貨物の分配は以前は"Cargodist"と呼ばれており、旅客や郵便物、その他すべての貨物を特定の目的地に向かわせる機能である。貨物はそれらの目的地に向かう車両にのみ積載される。 貨物分配はもともとパッチの機能だったが、OpenTTD 1.4.0より正式に実装された。

Contents

はじめに

元々のOpenTTDではある1か所で生み出された貨物を複数の目的地に分配するのは難しかった。そのようなことを実現するためには、それぞれの目的地ごとに異なる車両を利用するか、複雑な指令を組むかしかなかった。例えば街Aと街Bの間を往復する列車があったとしよう。それぞれの街にはいくつかのバス停からなるバス網があり、列車の駅もそれに含まれている。このようなとき、街Aのバス停や列車の駅から旅客を街Bのバス停や列車駅に届けたい、またはその逆を行いたいと考えたとする。元々のOpenTTDでは、街Aを走るバスが旅客を集め、列車の駅で転送することができる。その後、列車がその旅客を積載し、街Bの列車駅に転送する。さらに列車駅と統合されているバス停でバスが旅客を積載し、列車駅のバス停を中心としたスター型のバス網を組むことで、街Bの各バス停に旅客を輸送することができる。それぞれの車両は"転載して空荷のまま出発"の指示を持つことになり、この方法だと街Bの各バス停から街Aに向かうことはできないし、駅間や街中のバス停間で旅客の輸送ができない。もちろん、複雑な指令を組み合わせて追加のルートを走らせることで実現することはできる。しかし、駅や車両が増えるとこのような複雑なシステムを組むのは不可能に近くなる。

Cargodistは転送の処理と旅客の目的地の選択を自動的に行う。上記の例のような"転載して空荷のまま出発"のような指示は必要ないし、スター型のバス網を組む必要もない。街Aや街Bのバス網は列車の駅が指令に含まれていればシンプルなもので構わない。旅客はそれぞれ自分がどの車両でどこに行きたいかを考えており、これにより駅でより多くの旅客が待って混雑しているのを見ることになりかもしれない。

過去には様々なパッチによりこのような機能を実現しようとしていた。Cargodestプロジェクトとは対照的に、Cargodistでは、貨物のルート設定と異なるルートを選択することによる貨物量のバランスを取ることは切り離せないものとみなされていたため、一緒に解決された。また、輸送需要の定義は、上記の問題を解決するための前提条件と見なされ、最初に処理される。YACDとの主な違いは、Cargodistはマップ全体ではなく、たどり着ける目的地のみ考慮し、パフォーマンス上の理由からルート計画全体を別のスレッドで事前に計算される。

forumにはさらに詳細の情報がある。もしCargodistに関して質問がある場合はtt-forumへ投稿して質問すると良い。(訳者注 : 英語のみ。最終投稿は2019年)

動作モード

リンクグラフを表示したゲーム画面

駅情報ウィンドウ

Cargodistでは貨物と旅客の分配について3つの異なるモードがある。設定にある"環境⇒貨物配送先"からどのモードを選択するか設定することができる。

小マップやメイン画面での機能追加

小マップとメイン画面にリンクグラフを重ねて表示することができる。これは駅と有効な輸送リンクを表示するものである。リンクは容量に対して運ばれている貨物量に応じて異なる色の線で表示される。黄色と赤の影は選択した貨物でCargodistが有効になっている場合にのみ表示され、リンクグラフの計算はそこで輸送されている貨物量が少なすぎる場合に使われる。白や薄い緑の影はそこで輸送されている貨物量が多すぎる場合に使われる。その場合、いくつかの車両をそのルートから引き上げることができる。このようなリンクの場合は、貨物を輸送した後に空荷で戻ってきていることを意味するためである。

駅はプレイヤーの色の四角形で表示される。四角形がより大きいと、より多くの旅客や貨物が周辺の産業と家に生成、供給されていることを意味する。メイン画面のリンクグラフにの凡例は"マップ"メニューから開くことができる。そこではプレイヤーと貨物を選択することができる。小マップでのリンクグラフは自社のものに限られる。メニューに貨物を選択するための新しいサブメニューが追加されている。

駅情報ウィンドウの機能追加

駅情報ウィンドウでは待機している貨物の供給源、次の中継点、想定される目的地と、その駅を経由する貨物についての同様の情報を表示する。ただし、貨物が全てその通りに輸送されることを期待してはならない。貨物が経路上で分割されることはないが、車両に積載する際に、その車両に合わせた量に分割される。これはその駅にある正確な貨物量を把握するのが難しいことを意味する。ただし、長期的に見ればすべての貨物が正しい宛先に配送される。

貨物は供給源の駅ごと、次の中継点事、目的地ごとに、駅情報ウィンドウ上部の"グループ分け"のドロップダウンメニューによりグループ化可能である。貨物グループの末尾にある小さな"+"、"-"のボタンをクリックすることで、サブグループを開いたり閉じたりすることができる。また、グループとサブグループ内では、駅ごとや貨物の量ごとにソートすることができる。グループ分けの下の"並べ替え"はその中のドロップダウンメニューの条件(積込待ち、到着予定)に合わせて並べ替えを行うものである。

設定

ある貨物を分配するように設定してから、貨物癌実際に分配されるまではゲーム内時間で数日かかる。これは分配は周期的に計算されており、最初の計算が終わらないと分配先が決定されないからである。この計算はリンクグラフをもとに行われる。リンクグラフは輸送網の貨物ごとに接続される。"はじめに"に記載した例では、街Aと街Bにあるすべての駅は一つのリンクグラフを形成する。街Cにバス網があって、そのバス網が街Aや町Bに接続されていない場合、街Cのバス網は別のリンクグラフを形成する。ゲーム内に多くのリンクグラフが存在するほど、計算にかかる時間は長くなる。

どの程度の頻度で新しいリンクグラフを計算するかと、各計算にどの程度の時間をかけるかは、設定の"環境⇒貨物配送先"にある項目から変更できる。この設定により、間接的に同時に計算される最大のリンクグラフの量を決定する。リンクグラフの計算は別々のスレッドで行われ、メインゲームからは切り離されている。これらのスレッドはネットワークの同期を維持するために事前に定義されたタイミングで合算される。ほとんどのコンピュータ上のゲームでは、再計算時間と更新期間はさらに小さい値に設定することが可能であり、これによりリンクグラフの更新の遅れによる指令のずれを小さくすることができる。しかし、これらの設定を小さくしすぎると、ゲームはリンクグラフの計算スレッドを待つために周期的に"停止"してしまう。初期設定は低スペックのコンピュータで非常に巨大なゲームをプレイする場合に合わせてあるので、このような事態はまず起きない。設定にはもう一つ、リンクグラフの計算精度を決定するものがある。より正確に計算させると、より計算に時間がかかるようになる。この設定を変更する場合は、上記の時間間隔とバランスを取る必要がある。

距離効果の設定は遠くにある駅よりどれだけ多くの貨物を近くの駅に配送するかを決定するものである。高収容力経路より速達経路を優先法話の設定はデバッグ目的以外では変更しない方が良い。

制限

Cargodistでは、リンクパスの形成中は"全て降ろす"、"転送"、"積載なし"、"荷下ろし無し"、"荷積み無し"の指示を考慮に入れていなかった。現在もこれらの指示を持つ車両と持たない車両が混在している場合には、関連するリンクの容量は正確に推測されない。しかし、指令によりどの供給源からの貨物をこれらのリンクで輸送するかは把握できる。これはこれらの指示により経路の存在しない貨物を扱うことができないことを意味する。

Conditional orders are problematic by definition. You can create an undecidable problem for the link graph creation algorithm by having a vehicle's orders depend on load percentage. The shape of the link graph determines which cargo a vehicle will load. The cargo loaded then determines which way it goes and that in turn determines the shape of the link graph. Some of the other conditions' outcomes are very hard to predict in advance without simulating the whole game up to the point when they are to be evaluated normally. The link graph creation and cargo routing algorithms handle that pragmatically and always load greedily. That means they'll load cargo for any station that can potentially be reached with the given conditionals and they won't unload cargo that goes to one of those stations.

The algorithm used to evaluate the conditions and load/unload based on that but this strategy was suboptimal as the same cargo would be loaded and unloaded at the same station.

With the latest changes (in OpenTTD 1.4) you can do things like this, without creating any problems:

Go to LOADING STATION
Go to DROP1
If load percentage equals 0 go to LOADING STATION
Go to DROP2
If load percentage equals 0 go to LOADING STATION
Go to DROP3