Section 10 / 12
Primアルゴリズムの実装と用途
Primアルゴリズムは、重み付きグラフにおける最小全域木(MST: Minimum Spanning Tree)を求めるための効率的なアルゴリズムです。最小全域木とは、グラフ内のすべての頂点を含む部分グラフで、辺の総重みが最小になるものです。このアルゴリズムは、ネットワーク設計やクラスター分析など、さまざまな応用があります。
Primアルゴリズムの基本概念
Primアルゴリズムは、以下の手順で最小全域木を構築します。
- 任意の頂点を選び、それを初期の全域木に含める。
- 現在の全域木に接続されている辺の中で、最も重みの小さい辺を選び、その辺に接続された頂点を全域木に追加する。
- 2の操作を全ての頂点が全域木に追加されるまで繰り返す。
Primアルゴリズムの実装
以下に、PrimアルゴリズムのPythonによる実装を示します。
import heapq
def prim(graph, start):
mst = [] # 最小全域木を格納するリスト
visited = set() # 訪問済みのノードを保持するセット
min_heap = [(0, start)] # (重み, 頂点)のタプルを保持する最小ヒープ
while min_heap:
weight, current_vertex = heapq.heappop(min_heap) # 最小重みの辺を取り出す
if current_vertex in visited:
continue # 既に訪問済みの頂点はスキップ
visited.add(current_vertex) # 現在の頂点を訪問済みにする
mst.append((weight, current_vertex)) # 最小全域木に追加
for neighbor, edge_weight in graph[current_vertex]: # 隣接する頂点を確認
if neighbor not in visited:
heapq.heappush(min_heap, (edge_weight, neighbor)) # ヒープに追加
return mst
# グラフの定義(隣接リスト形式)
graph = {
'A': [('B', 1), ('C', 4)],
'B': [('A', 1), ('C', 2), ('D', 5)],
'C': [('A', 4), ('B', 2), ('D', 1)],
'D': [('B', 5), ('C', 1)],
}
# Primアルゴリズムの実行
mst_result = prim(graph, 'A')
print("最小全域木:", mst_result)
コードの解説
- インポート文:
heapqは、Pythonの優先度付きキューを実装するためのモジュールで、効率的な最小ヒープを提供します。 - 関数定義:
prim関数は、グラフと開始頂点を引数に取り、最小全域木を返します。 - 初期化:
mstリストに最小全域木の辺を格納し、visitedセットで訪問済みのノードを管理します。min_heapには、初期ノードを重み0で追加します。 - メインループ: ヒープから最小重みの辺を取り出し、訪問済みでない場合のみ処理を行います。現在の頂点を訪問済みにし、最小全域木に追加します。隣接する頂点が未訪問の場合、ヒープに追加します。
- 結果の表示: 最後に、求めた最小全域木を表示します。
Primアルゴリズムの用途
Primアルゴリズムは、以下のような用途に利用されます:
- ネットワーク設計: 通信ネットワークや電力網の最小コストでの配線設計。
- クラスター分析: データ分析においてデータポイントをグループ化するための手法。
- 道路網の設計: 都市計画において、最小コストでの道路設計。
このように、Primアルゴリズムは多くの実世界の問題に適用可能で、効率的に最小全域木を求める手段として重要です。