プログラマの皆さん、
車両の通行をシミュレートするソフトウェアを開発しています。 「割り当て」と呼ばれるプロセスの一部は、ルートへの車両の割り当てに関係しており、ある種の最短経路探索アルゴリズムを使用する必要があります。
伝統的に、人々はこれをダイクストラのもので行い、特定の科学文献は、おそらくグラフの性質が原因で、A *や他の代替案が大幅な改善をもたらさないことを示しているようです。
したがって、ダイクストラも使用しています。小さな問題が発生しました。交通リンク(交差点間の道路のスパン)をエッジとして扱い、交差点をノードとして扱う場合、古典的な単方向グラフを取得できません。交差点に近づくと、頻繁に方向転換できるかどうかは従来のグラフでは、ノードから任意のエッジを取得できます。
リンクと交差のペア(「ラス」と呼ばれます)をノードとして表すことで、この問題を簡単に解決しました。後続の「ラス」または選択したポイントに到達するにはリンクをトラバースする必要があるため、エッジはこのトラバーサルとして定義され、典型的なグラフが得られます。
次に、結果はN x Nという単純なテーブルに格納されます。Nは「ラス」の数です。
これは(避けられない?)欠点です。たとえば、シミュレーションの一般的なネットワークに2000の交差がある場合、約6000のリンク、つまりN = 3Vになります。明らかに、交差(V)の観点から数えると、O(log(3V)*(3V + E))までです。
3(または9)は一定の要因であると主張するかもしれませんが、実際の観点からは、処理速度がかなり遅くなり、ストレージスペースが3V x 3Vに増加します。
パフォーマンスを改善するためにこれをどのように再構成できるかについて誰かが何か知っていますか?必ずしも別のアルゴリズムである必要はありません。おそらく、他の方法でグラフに合うようにデータ構造を再形成しますか?
ダイクストラの検索では、特定のノードとall他のノードとの間の最短パスが検出されるため、A *よりもコストが高くなると思います。しかし、任意のノードから他のノードへのコストとパスを事前に計算しようとしているように見えますか?次に、ダイクストラの方法です。
より単純な表現については、いくつかのことが頭に浮かびます:
多くの交差点では、好きなように出入りできます。 「左折禁止」などの制限があるのはサブセットだけです。したがって、「ラス」は、実際に必要な交差点にのみ使用できます。これにより、サイズが大幅に縮小されます。
「同等のラス」を探して組み合わせると、これを自動的に行うことができます。出てくるすべてのリンクが同じであれば、2つのラスは同等です。例えば。 「西から来る交差点X」と「南から来る交差点X」の両方が同じコストで同じセットの他のノードにつながる場合は、それらを1つのノードにマージします。
オンラインで計算するのではなく、最適なパスを事前計算する必要がある/本当にしたいですか?ビデオゲームは通常、これらをオンラインで計算します。
また、パスをどのように表現していますか?マトリックスでは、パスの最初のリンクのみを表す必要があります。たとえば、ボブの家からボブの仕事に行くには、最初のリンクを知っていれば十分です。彼らがそこに着いたら、最初のリンクからボブの仕事に行く方法をマトリックスで調べることができます。 2番目のリンクなど.
大きなグラフがあり、それをさらに大きくしました。 Martinc C. Martinは、必要な場合にのみ旋盤を使用することを勧めたので、これについては説明しません。
あなたを助けることができるものの1つは、あなたのグラフをより小さなグラフに変形することです。
私を大いに助けた最初の単純化(私はヨーロッパの州の道路ネットワークで作業しました)は、度1と2のノードを再帰的に「削除」することでした。この方法では行き止まりの道路はなく、T交差点(元は3度)は2度になり、そのノードまたは削除されたcull de sacのノードにパスしていない場合、これは興味深いことではありません。
その後、内部ノードとエッジの量が多く、他の部分との接続が最小限の部分にグラフを分割することを試みることができます。それらを見つけるために、シンクとソースが互いに(エッジで)遠く離れており、それらの近くのエッジに大きな容量があり、その間のどこかにあるエッジが小さいという最小限のカットを使用しました。