メモめもメモ

環境構築やプログラミングに関するメモ

PythonのNetworkXパッケージを使って重み付き有向グラフの最短経路をダイクストラ法で求める

Pythonのネットワーク計算パッケージ「NetworkX」を使用して重み付き有向グラフの最短経路をダイクストラ法で求めます。

NetworkXのインストール

下記のようにpipでインストールができます。

pip install networkx

今回はNetworkX2.2を使用しました。

グラフ

下図のノードAからノードEまでの最短経路を求めます。 有向グラフのため矢印を逆戻りすることはできません。 f:id:blackwhitebear:20181020220248p:plain

コード

# coding:utf-8

import networkx as nx

# ノード(頂点)のリスト
NODE_LIST = ["A", "B", "C", "D", "E"]

# エッジ(辺)のリスト
# (始点, 終点, 重み)
EDGE_LIST = [
    ("A", "B", 2),
    ("A", "C", 5),
    ("A", "D", 9),
    ("B", "C", 2),
    ("B", "D", 7),
    ("C", "D", 4),
    ("D", "E", 1)
]

# グラフの定義
DG = nx.DiGraph()
DG.add_nodes_from(NODE_LIST)
DG.add_weighted_edges_from(EDGE_LIST)

# 出発地ノードと目的地ノードを設定
start = "A"
end = "E"

# ダイクストラ法で最短経路とその重みを求める
shortest_path = nx.dijkstra_path(DG, start, end)
shortest_path_weight = nx.dijkstra_path_length(DG, start, end)

# 出力
print("Shortest Path:", shortest_path)
print("Weight:", shortest_path_weight)

出力結果

最短経路とその重みを求めることができました。

Shortest Path: ['A', 'B', 'C', 'D', 'E']
Weight: 9