(車両)トラフィックネットワーク内で最短経路を見つけるためのより良いアプローチはありますか?


8

プログラマの皆さん、

車両の通行をシミュレートするソフトウェアを開発しています。「割り当て」と呼ばれるプロセスの一部は、ルートへの車両の割り当てに関係しており、ある種の最短経路探索アルゴリズムを使用する必要があります。

伝統的に、人々はダイクストラでこれを行っており、特定の科学文献は、おそらくグラフの性質のために、A *や他の代替案は大幅な改善をもたらさないことを示しているようです。

したがって、ダイクストラも使用しています。小さな問題が発生しました。交通リンク(交差点間の道路のスパン)をエッジとして扱い、交差点をノードとして扱う場合、古典的な単方向グラフを取得できません。交差点に近づくと、頻繁に方向転換できるかどうかは従来のグラフでは、ノードから任意のエッジを取得できますが、

この問題は、リンクと交差のペア(「ラス」と呼ばれます)をノードとして表すことで簡単に解決できました。後続の「ラス」または選択したポイントに到達するにはリンクをたどる必要があるため、エッジがこのトラバーサルとして定義され、典型的なグラフが得られます。

次に、結果は単純なテーブルN x Nに格納されます。ここで、Nは「ラス」の数です。

これは(避けられない?)欠点です。シミュレーションの一般的なネットワークに2000の交差点がある場合、約6000リンク、つまりN = 3Vになります。明らかに、交差(V)で数えると、O(log(3V)*(3V + E))になります。

3(または9)は一定の要素であると主張するかもしれませんが、実際の観点からは、処理速度がかなり遅くなり、ストレージスペースが3V x 3Vに増加します。

これを再構成してパフォーマンスを向上させる方法を誰かが知っていますか?必ずしも別のアルゴリズムである必要はありません。おそらく、他の方法でグラフに合うようにデータ構造を再形成しますか?


NとVが何であるかはわかりません。Vは頂点(交差)の数であり、Nは頂点間の弧の数ですか?また、Eとは何ですか。
Mike Dunlavey、2012

どのリソースを読みましたか?IIRC、A *は、悲観的なヒューリスティックが与えられた場合、最短時間で最適パスを見つけることが証明されています。実際、A *は空/ 0ヒューリスティックでダイクストラに回帰します。
Steven Evers

また、どのグラフ表現を使用していますか?隣接リストを含む単方向グラフは、ノードとしてのエッジ/交差として道路を簡単に許可します(実際には、隣接マトリックスでも可能ですが、上/下の三角形ではなく完全なマトリックスでなければなりません)。TBH:多くのゲームプログラミングの文献をお勧めします。それはその分野で非常に効果的な問題であり、あなたが言及しているものと同じまたはより厳しいパフォーマンス制約があります。
Steven Evers

1
@SnOrfus:はい、ただし、単一の交差点を常に単一のノードとして表すことはできません。たとえば、交差点の場合、左折または直進はできるが右折はできないため、単純な隣接行列ではそれを表すことができません(ラウンドアバウトがある場合はさらに悪化します)。
ライライアン

@LieRyan:多分私はあなたを誤解しているかもしれませんが、それは右折がなく、同じ方法で表現されるべき交差点と違いはありません。
Steven Evers

回答:


6

ダイクストラの検索では、特定のノードと他のすべてのノードとの間の最短パスが検出されるため、A *よりもコストが高くなると思います。しかし、ノードから他のノードへのコストとパスを事前に計算しようとしているように見えますか?次に、ダイクストラの方法です。

より単純な表現については、いくつかのことが頭に浮かびます:

多くの交差点で、好きなように出入りできます。「左折禁止」などの制限があるのはサブセットだけです。したがって、「ラス」は、実際に必要な交差点にのみ使用できます。これにより、サイズが大幅に縮小されます。

「同等のラス」を探して組み合わせると、これを自動的に行うことができます。出てくるすべてのリンクが同じであれば、2つのラスは同等です。たとえば、「西から来る交差点X」と「南から来る交差点X」の両方が同じコストで同じセットの他のノードにつながる場合は、それらを1つのノードにマージします。

オンラインで計算するのではなく、最適なパスを事前計算する必要がある/本当にしたいですか?ビデオゲームは通常、これらのものをオンラインで計算します。

また、パスをどのように表現していますか?マトリックスでは、パスの最初のリンクのみを表す必要があります。たとえば、ボブの家からボブの仕事に行くには、最初のリンクを知っていれば十分です。彼らがそこに着いたら、最初のリンクからボブの仕事に行く方法をマトリックスで調べることができます。 2番目のリンクなど


「ラス」を組み合わせることは確かに興味深いアイデアです。そうです、すべてのノードペア間の最短パスを見つけて、パスを生成しています。典型的な交通シミュレーションでは、道路が使用されることはほとんどありません(そもそもなぜそこに道路があるのでしょうか?)。「オンライン」とは、リアルタイムのことですか?実際にできることは、「期待される」最短経路を計算することだけです。これは、車両が実際にそこに到着したときに、リンクの状態が正確にわからないためです。現在の条件に基づいて最短経路行列を更新します。
グレッグクラミダ

はい、「オンライン」とは、リアルタイムで、つまりボブが家を出て仕事に行きたいときに、A *を実行することを意味します。
マーティンC.マーティン

最短経路行列を更新する必要がある頻度に応じて、更新のために多くの作業を行い、更新を再度行う前にほとんどのセルを使用しない場合があります。ユースケースの詳細はわかりませんが、外部から見ると、A *は少なくとも試す価値があるようです。また、すべてのNノードが特定の時点で使用されますが、すべてのN ^ 2ペアが特定の時点で使用されるわけではありません。ボブのブロックにいる人々、彼らはいくつのユニークな目的地を持っていますか?
マーティンC.マーティン

ええ、私は同意します、A *はおそらく試す価値があります。一部のシミュレーションでは、各出発地の車両の一部をほぼすべての目的地にルーティングしていますが、すべての場合にはるかに多いわけではありません。特にトラフィックネットワーク用にA *を含むさまざまなヒューリスティックを使用している人々に関するいくつかの論文を見つけたので、これらを試してみることにします。マーティン、助けてくれてありがとう。
グレッグクラミダ

1

大きなグラフがあり、それをさらに大きくしました。Martinc C. Martinは、必要な場合にのみ旋盤を使用することを勧めたので、これには触れません。

あなたを助けることができるものの1つは、あなたのグラフをより小さなグラフに変形することです。

私を大いに助けた最初の単純化(私はヨーロッパの州の道路ネットワークで作業しました)は、度1と2のノードを再帰的に「削除」することでした。この方法では行き止まりの道路はなく、T交差点(元は3次)は2次になり、そのノードまたは削除されたcull de sac内のノードにパスしていない場合、これは興味深いことではありません。

その後、グラフを内部ノードとエッジの量が多く、他の部分との接続が最小限である部分に分割しようとすることができます。それらを見つけるために、シンクとソースが互いに(エッジで)遠く離れており、それらの近くのエッジに大きな容量があり、その間のどこかにあるエッジが小さい、最小限のカットを使用しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.