最短経路問題の探究: ダイクストラのアルゴリズム

最短経路問題の探究: ダイクストラのアルゴリズム

[[386543]]

前回、データ構造としてのグラフについて書きましたが、グラフ アルゴリズムのテスト ポイントは最短経路問題だけです。

最短経路問題

最短経路問題: エッジに重みが付けられたネットワークが与えられた場合、パス上のエッジの重みの合計が最小になるように、指定された開始点から指定された終了点までのパスを見つけます。


たとえば、上の図では、図のポイント 1 からポイント 4 までの最短経路の長さは 3 (1 から 2 から 4) になります。

最短経路問題はダイクストラ法で解かれることが多い。

ダイクストラアルゴリズム

ダイクストラ アルゴリズムは、1 つのノードから他のすべてのノードまでの最短パスを計算するために使用される、典型的な単一ソース最短パス アルゴリズムです。開始点を中心に層ごとに外側に広がり、終了点に到達するのが最大の特徴です。

例えば、上図のダイクストラアルゴリズムは、開始ノードから隣接ノードまでのすべてのパスを継続的に検索し、初期距離を最短距離に設定し、最も遠いノードまでの最短距離が解決されるまで、隣接ノードの最短距離を継続的に更新するプロセスです。

テキストの説明が明確ではありません。下のアニメーション画像を参照してください。


グラフ上の頂点は、訪問済みノードと未訪問ノードの 2 つのセットに分割されます。

ポイントが訪問先から外側に拡張されるたびに、拡張ルールは更新可能なポイント間の距離が最小になるようにすることです。

上の写真を例に挙げてみましょう


まず、隣接行列を使用して無向グラフを表します。

  1. 最大= 9999
  2.  
  3. g=[
  4. [0, 1, 4, 6],
  5. [最大, 0,最大, 2],
  6. [ MAX , MAX , 0, 1],
  7. [ MAX MAX MAX 、 0]
  8. ]

隣接行列g[0][1]=1は、最初のノードから2番目のノードまでの距離が1であることを意味します。

目的は、出発点1から他の点までの最短経路距離を見つけることです。

  1. n = 4 #4 ポイント
  2. # 訪問した場所を初期化する
  3. visitsd = [0] * (n) #ポイントが訪問されたかどうかを記録する
  4. # 最初のポイントを訪問しました
  5. 訪問数[0] = 1
  6. # ソースポイントから各ポイントまでの距離ノードセットを初期化します
  7. d = g[0]
  8.  
  9. iが範囲(2, n)内にある場合:
  10. # dをトラバースし、最小の重みを持つノードの位置を取り出す
  11. 最小重量 =最大 
  12. j範囲(2, n)内にある場合:
  13. d[j] < minWeigthかつvisited[j] == 0の場合:
  14. 最小重量 = d[j]
  15. k=j
  16. # kが1から最短距離にある点であることを示し、kが見つかったことをマークします
  17. 訪問数[k] = 1
  18. # このポイントでリラックスしましょう
  19. j範囲(2, n)内にある場合:
  20. d[j] > d[k] + g[k][j]かつvisited[j] == 0の場合:
  21. d[j] = d[k] + g[k][j]
  22.  
  23. iが範囲(1,n)内にある場合:
  24. 印刷(d[i])
  25.      
  26. 1
  27. 4
  28. 5

これまでのところ、ノード 1 から残りの 3 つのノードまでの最短距離は 1、4、および 5 です。

「重み付けされていないグラフ、つまりすべてのエッジの重みが等しいグラフにダイクストラのアルゴリズムを適用することは、BFS 検索と同等です。」

その他のソリューション

多くの場合、無向グラフの最短経路を取得するには、一連の点を入力し、開始点を入力する必要があります。

  1. インポート数学
  2. # グラフの頂点の数を仮定する
  3. V = 6
  4. # 配列をマークします。used[v] がFalseの場合、頂点がまだ訪問されていないことを意味します。これは S にあり、それ以外の場合は U にあります。
  5. 使用 = [ False   _範囲(V)]
  6. # 距離配列: distance[i]はソースポイントsからiまでの最短距離を表します。distance[s]=0
  7. 距離 = [ float ( 'inf' ) _範囲(V)]
  8. # cost[u][v]は辺e=(u,v)の重みを表し、存在しない場合はINFに設定されます
  9. # コスト受信テーブル
  10. コスト = [[ float ( 'inf' ) _範囲(V)] _範囲(V)]
  11.  
  12. def dijkstra(s):
  13. 距離[秒] = 0
  14. 真の場合:
  15. # ここでの v はセンチネルと同等であり、すべての開始点 s に対して統一された処理を実行します。
  16. v = -1
  17. # 未使用の頂点からの距離が最小の頂点を選択する
  18. u範囲(V)内にある場合:
  19. 使用されていない場合[u]かつ(v == -1または距離[u] < 距離[v]):
  20. v = u
  21. v == -1の場合:
  22. # これは、すべての頂点が S 内で維持されることを意味します。
  23. 壊す
  24. # 選択した頂点をSに追加し、同時に距離を更新します
  25. 使用[v] = 
  26. # U の各頂点から開始点 s までの距離を更新します。 U 内の頂点の距離を更新する理由は、前のステップで、最短経路を見つけるための頂点として k が決定されたため、k を使用して他の頂点の距離を更新できるためです。たとえば、(s, v) の距離は、(s, k) + (k, v) の距離よりも大きくなる可能性があります。
  27. u範囲(V)内にある場合:
  28. 距離[u] =最小(距離[u]、距離[v] + コスト[v][u])
  29.  
  30.  
  31. _が範囲(9)場合:
  32. v、u、w = リスト(map( int 、 input().split()))
  33. コスト[v][u] = w
  34. コスト[u][v] = w
  35. s = int (input( '出発地を入力してください:' ))
  36. ダイクストラ
  37. 印刷(距離)

テストケース

  1. 0 1 1
  2. 0 2 2
  3. 0 3 3
  4. 1 4 7
  5. 1 5 9
  6. 2 4 4
  7. 3 4 5
  8. 3 5 6
  9. 4 5 8
  10. 出発地を入力してください: 0
  11. [0、1、2、3、6、9]

テストケースでは、0 1 1 は最初の頂点から 2 番目の頂点までの距離が 1 であることを意味します。

隣接リストを使用したダイクストラのアルゴリズムの時間計算量は次のとおりです。そのため、多くの場合、最適化のためにヒープを使用したり、余分なスペースを最適化するためにハッシュ テーブルを使用したりします。

<<:  機械学習においてデータ品質はどの程度重要ですか?

>>:  ザッカーバーグの45分間の詳細なインタビュー:今後10年間のVRと脳コンピューターインターフェースへの野望を明らかにする

推薦する

Python が機械学習プロジェクトに最適な言語である理由は何ですか?

[[386401]] Python は安定性とメンテナンスのしやすさから、常に優れたパフォーマンス...

...

...

転移学習により、ディープラーニングは難しくなくなりました...

それほど遠くない過去には、データ サイエンス チームがディープラーニングを効果的に活用するには、いく...

教師なし学習アルゴリズム: 異常検出

外れ値とは何でしょうか? Hawkins (1980) は外れ値の基本的な定義を与えました: 外れ値...

ビジネスに人工知能を導入する際に考慮すべき3つの要素

最近、ますます多くの企業が人工知能に投資しています。しかし、成功するには、推論の解釈可能性、データ密...

2024 年にソフトウェア開発の生産性を向上させる 10 のベスト AI ツール

2023年までに、AIは複数の業界で広く採用されるようになります。 2024 年までに、ソフトウェア...

インテリジェントオートメーションの台頭:デジタル時代のAI、ロボット工学、製造業

人工知能 (AI)、ロボット工学、自動化の融合により、生産性、効率性、革新の新しい時代が到来していま...

リモートワークにおけるAIの活用事例

世界中の組織がリモートワークに移行する必要に迫られ、業務を維持するために技術的な対策が必要になりまし...

絶賛されていたGPT-3が充電開始します!ネットユーザー:値段が高す​​ぎる。もう行っちゃった。

少し前に絶賛されたGPT-3を覚えていますか?招待されたユーザーのみがテスト・使用できるもので、史上...

AIへの幻滅? AIの発展を妨げる8つのトレンド

それは「もし」ではなく「いつ」の問題です。以前の記事では、AI が革新的な可能性においてこれまでのテ...

グラフ分野における初のユニバーサルフレームワークが登場しました。 ICLR'24 Spotlightに選ばれ、あらゆるデータセットと分類問題を解決できる

普遍的なグラフモデルはありますか?分子構造に基づいて毒性を予測するだけでなく、ソーシャル ネットワー...

ディープラーニングの悪循環は驚くべき結果をもたらすだろう

[[191396]]カルロス・E・ペレスコンピレーション | 聖人、ワンショットオックスフォード大学...