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

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

[[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と脳コンピューターインターフェースへの野望を明らかにする

推薦する

AI業界の「第2の成長曲線」を牽引する清華大学傘下のRealAIが第3世代のAI製品をリリース

12月9日、清華大学人工知能研究所、北京市知源人工知能研究所、北京市瑞来スマートテクノロジー株式会社...

VB.NET バブルソートアルゴリズムの詳細な説明

VB.NET を学習する場合、中国語の情報が非常に少なく、大多数のプログラマーのニーズを満たすのが難...

...

GenAI Security: Microsoft Copilot でデータ侵害を防ぐ方法

Microsoft の Copilot は、世界で最も強力な生産性向上ツールの 1 つと言われていま...

AIと機械学習モデルをトレーニング、テスト、維持する方法

AI および機械学習モデルの作成に必要なスキルセットをより深く理解するには、機械学習ソフトウェアによ...

人工知能は依然として人気があり、大学入試では3年連続で最も人気のある選択肢となっている。

百度がこのほど発表した「百度人気検索・2022年大学入試ビッグデータ」レポートによると、人工知能は3...

2020年の人工知能の概要と2021年のトレンド

過去2年間、中国は世界の継続的なイノベーションの最前線に立ってきました。2020年の疫病は、人工知能...

AppleはAI競争で遅れをとり、市場価値ランキングはAmazon、Google、Microsoftに追い抜かれる可能性も

米国現地時間9月8日木曜日、投資会社ニーダム・セキュリティーズは、アマゾン、グーグル、マイクロソフト...

...

世界の AI 人材レポートが発表されました: 清華大学が 3 位、北京大学が 6 位にランクイン!シリコンバレーが40万人を解雇、プログラマーの面接は12回

先ほど、グローバル AI 人材レポートが発表されました。世界のトップクラスの AI 人材のうち、約半...

TensorFlow 2.8.0が正式にリリースされ、多くのバグが修正され、50以上の脆弱性パッチがリリースされました

最近、TensorFlow は公式バージョン 2.8.0 をリリースしました。バージョン 2.7 の...

IDC: AIソリューションへの世界的な支出は3年以内に5000億ドルを超える

IDC は、2024 年以降の世界の情報技術 (IT) 業界予測レポートを発表しました。 IDC は...

機械学習に関する9つの誤解

機械学習のようにテクノロジーが大々的に宣伝されると、多くの誤解が生じます。ここでは、機械学習が提供で...

レポート:中国の人工知能産業は2022年までに300億ドル近くの価値に達する

中国の新世代人工知能産業の規模は着実に拡大している。新世代の AI アプリケーション シナリオの実装...