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

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

[[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の次の目的地はどこでしょうか?

[[318187]]私たちはインテリジェント変革の時代に生きており、人工知能技術はあらゆる分野の人...

ハッカーがGSMアルゴリズムを破り、携帯電話ユーザーが盗聴の危険にさらされる

以下の記事では、主にハッカーがGSMアルゴリズムをクラックし、携帯電話ユーザーが盗聴の危険にさらされ...

HiLM-D: 自動運転のためのマルチモーダル大規模言語モデル

この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転...

仕事再開時に間接接触を避けるには?顔認識アクセス制御で徹底した予防と管理を実現

職場復帰の日が近づくにつれ、全国で生産や業務が徐々に再開されているが、同時に防疫活動も緩めてはならな...

研究によると、AIはより多くの雇用を生み出している

フォーブスによると、人工知能(AI)によって人間の仕事が失われ、広範囲にわたる人員削減が起こると広く...

私たち全員が失業するかもしれない:今後10年間でほぼすべての仕事が変化する

[[248203]]バイオテクノロジーの進歩により、人間の寿命は今後も延び続け、社会の家族構成、結婚...

企業における機械学習: 次の 1 兆ドル規模の成長はどこから来るのでしょうか?

ハリー・ポッターの世界では、組分け帽子は生徒の行動履歴、好み、性格に関するデータを取得し、そのデータ...

...

...

自然災害はサイバーセキュリティに影響を与える:異常気象や停電に対抗するにはAIが必要

10月28日、サンフランシスコのニュース予報では、29日の強風により再び停電が発生するだろうと報じら...

小売業における AI の ROI をマクロとミクロのレベルで測定

[[259079]] AI の応用により予測コストが大幅に削減され、企業はますます新しい、予想外の方...

...

Python を使用して画像からテーブルを抽出する

約 1 年前、私はファイルからデータ、主にテーブルに含まれるデータを抽出して構造化するタスクを割り当...

毎日のアルゴリズム: データストリームの中央値

[[431427]]この記事はWeChatの公開アカウント「3分でフロントエンドを学ぶ」から転載した...

AlphaFold2 の原理: 注意メカニズムが畳み込みネットワークに取って代わり、予測精度が 30% 以上向上

[[412540]]この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI...