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

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

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

ブログ    
ブログ    

推薦する

Ant Groupが、プログラマー向けAIアシスタントの新たな競合製品となるオープンソースコードモデルCodeFuseを発表

9月8日現在、コード作成を支援できるAI製品はすでに数多く市場に出回っている。本日の外灘大会サブフォ...

IntelがBigDLディープラーニングフレームワークをリリース、CPUを使ってGPUを攻撃する予定

[51CTO.com クイック翻訳] 先週、Intel は分散型ディープラーニング用のオープンソース...

...

...

テスラが自社開発したスーパーコンピュータDojo!日本の「富岳」に代わる世界初の

[[406953]]自動車メーカー、自動運転企業、バッテリーおよびエネルギー貯蔵企業として、テスラは...

人工知能、ディープラーニング、マシンビジョン、理解すべき概念

人工知能の概念は長年提唱されてきたが、最近の流行は「人間対機械」の競争で囲碁の世界的名人、イ・セドル...

若者は人工知能とうまく付き合うことを学ぶべきだ

人工知能技術と他の技術の最大の違いは、人間の頭脳労働の一部を代替できるだけでなく、一部の分野では人間...

2017年中国・米国データサイエンス比較レポート:Pythonが年間平均給与11万ドルで1位

[[208216]] ***ニュースによると、Kaggleは最近、機械学習とデータサイエンスに関する...

...

GAN はたった 1 枚の画像でトレーニングできます。 Adobe が画像生成方法を改善 | オープンソース

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

ICDM の選択: データ マイニングの代表的なアルゴリズム トップ 10

2006 年 12 月、国際的に有名な学術組織である IEEE 国際データマイニング会議 (ICD...

機械学習専用サーバーの重要性の高まり

機械学習は、さまざまな方法で Web ホスティング業界を変えています。 AWS などの多くのサードパ...

AIが伝染病と闘う: 時折の恥ずかしさの裏に究極の防壁が現れる

人類と新型コロナウイルスとの戦いは今も続いていますが、この間、さまざまな「人工知能+」アプリケーショ...

...

Baidu PaddlePaddleがソフトウェアグリーンアライアンス開発者会議に登場。最新の2つの成果は産業実装に直接つながるものだった。

11月19日、アリババ、百度、ファーウェイ、テンセント、網易など国内有名企業が企画・主催する201...