ダイクストラ法
ダイクストラ法 は、最短経路問題 を解くアルゴリズムの1つです。
ダイクストラ法 には次のような特徴があります。
- コストが最小になる頂点 を探しながら最短経路を求める。
- マイナスの値 の場合は使えないが、ベルマンフォード法よりも高速に解を求めることができる。
次のようなグラフを考えてみます。
[グラフ]

ソースコード
ソースコードでは、グラフの情報を次の入力例のように定義してみます。
- 頂点は名前(頂点名)をもち、それぞれの頂点は隣の頂点情報(edge)と自分のコスト(cost)情報を持っています。
- 隣の頂点情報は、頂点名(辞書型データのキー)とそこに移動するためのコスト(辞書型データのバリュー)があり、複数存在することがあります。
- 頂点自体がもっているコストは、そこに辿りつくためのコストであり、初期値としてはスタート地点が0、それ以外は無限大を設定しておきます。
ダイクストラ法 では、コストが最もコストが小さくなる頂点 を選択することを繰り返して探索する方法です。
一度チェックしたした頂点は チェック済み として、チェックしていない頂点 の中からコストが最も小さいものを順番に確認していきます。
最も小さいコストの頂点が複数ある場合は、そのうちどれか1つを選択してチェックしていきます。
[Google Colaboratory]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| nodes = { 'Start':{'edge':{'B':4, 'C':3}, 'cost':0}, 'B': {'edge':{'C':1, 'D':1, 'E':5}, 'cost':float('inf')}, 'C': {'edge':{'F':2}, 'cost':float('inf')}, 'D': {'edge':{'E':3}, 'cost':float('inf')}, 'E': {'edge':{'Goal':2}, 'cost':float('inf')}, 'F': {'edge':{'E':1, 'Goal':4}, 'cost':float('inf')}, 'Goal': {'edge':{}, 'cost':float('inf')} }
while len(nodes): min_cost = min([node_info['cost'] for src, node_info in nodes.items()]) for name, node_info in nodes.items(): if node_info['cost'] == min_cost: min_node_name = name break
for dst, cost in node_info['edge'].items(): if dst in nodes and nodes[dst]['cost'] > nodes[min_node_name]['cost'] + cost: nodes[dst]['cost'] = nodes[min_node_name]['cost'] + cost
if min_node_name == 'Goal': print('解:最小コストは', nodes['Goal']['cost']) break
del nodes[min_node_name]
|
[実行結果]
解:最小コストは 8
頂点Start から 頂点Goal までの最小コストは 8 であることを導き出すことができました。