<一覧に戻る

Primアルゴリズムの実装と用途

Primアルゴリズムは、重み付きグラフにおける最小全域木(MST: Minimum Spanning Tree)を求めるための効率的なアルゴリズムです。最小全域木とは、グラフ内のすべての頂点を含む部分グラフで、辺の総重みが最小になるものです。このアルゴリズムは、ネットワーク設計やクラスター分析など、さまざまな応用があります。

Primアルゴリズムの基本概念

Primアルゴリズムは、以下の手順で最小全域木を構築します。

  1. 任意の頂点を選び、それを初期の全域木に含める。
  2. 現在の全域木に接続されている辺の中で、最も重みの小さい辺を選び、その辺に接続された頂点を全域木に追加する。
  3. 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)

コードの解説

  1. インポート文: heapqは、Pythonの優先度付きキューを実装するためのモジュールで、効率的な最小ヒープを提供します。
  2. 関数定義: prim関数は、グラフと開始頂点を引数に取り、最小全域木を返します。
  3. 初期化: mstリストに最小全域木の辺を格納し、visitedセットで訪問済みのノードを管理します。min_heapには、初期ノードを重み0で追加します。
  4. メインループ: ヒープから最小重みの辺を取り出し、訪問済みでない場合のみ処理を行います。現在の頂点を訪問済みにし、最小全域木に追加します。隣接する頂点が未訪問の場合、ヒープに追加します。
  5. 結果の表示: 最後に、求めた最小全域木を表示します。

Primアルゴリズムの用途

Primアルゴリズムは、以下のような用途に利用されます:

  • ネットワーク設計: 通信ネットワークや電力網の最小コストでの配線設計。
  • クラスター分析: データ分析においてデータポイントをグループ化するための手法。
  • 道路網の設計: 都市計画において、最小コストでの道路設計。

このように、Primアルゴリズムは多くの実世界の問題に適用可能で、効率的に最小全域木を求める手段として重要です。

出力結果: