そのようなグラフの最短経路を計算するために利用可能なライブラリがあります。彼らはどうやってこれをしますか?より具体的には、ダイクストラのアルゴリズムを実行するためにグラフの必要な部分をどのようにロードしますか?
DB、ディスクから読み取るカスタムファイル形式、およびインメモリ設定を使用できます。
しかし、DBを使用した私の経験からすると、「単純な」リンクリスト形式に基づいて独自のファイル形式を記述するよりも、約5〜10倍遅く、多くのメモリを消費します。
良いことは、OSMを使用するいくつかのソフトウェアフレームワークがあり、それらがオープンソースであるため、コードを詳しく調べることができることです。たとえば、こちらを参照してください。GraphHopperオープンソースルーティングエンジンは、メモリから非常に簡単に切り替えることであるメモリ内の設定に(ディスクベース)を設定マップされた-両方の同じフォーマットを使用。「mmap」設定では、メモリが制限されたモバイルデバイスでの使用も許可され、サーバーなどの必要なRAMがある場合、モバイルデバイスははるかに高速に実行されます。たとえば、世界規模のグラフ(> 100mioノード)の場合、約8-10 GBのRAMが必要です。さらに、たとえば収縮階層を使用してすべてをさらに高速化する場合は、さらに多くのRAMが必要です。
この形式は非常に単純化されており、基本的に、必要なデータのみを保存し、いくつかのトリックを使用してコンパクトにします。詳細はこちらをご覧ください。免責事項:私はGraphHopperの著者です。
他の回答について:
ダイクストラスアルゴリズムは適用可能ですが、この問題には最適ではないと見なされます
「通常の」ダイクストラは非常に妥当なパフォーマンス(3mioノードの例のように国全体のクエリに対して1秒未満)を実行でき、「理論的な意味」で最適ですが、実稼働シナリオで高速にするには少し調整が必要です。また、Contraction Hierachiesなどの手法では、双方向の変更を使用して非常に優れたパフォーマンスを発揮します。
道路網は階層的で平面的です。
道路ネットワークは車の階層構造であり、平面ではありません(橋、トンネルなど)