Kuhn-Munkersアルゴリズムの概要
Kuhn–Munkres アルゴリズム(ハンガリアン法とも呼ばれる)は、重み付き二部グラフにおける最小(または最大)重み完全マッチングを求めるためのアルゴリズムである。
このアルゴリズムでは、二部グラフにおいて、各ノードを1対1で対応づける完全マッチングを構成し、その合計コスト(重み)を最小化(または最大化)することを目的としている。これは、タスクと作業者の対応づけやリソースと需要の割り当てといった状況において、最も効率的な割り当て(Assignment)を求める問題であり、「割当問題(Assignment Problem)」として知られている。
この問題では、グラフは2つの頂点集合 U(例:作業者)と V(例:タスク)から構成される二部グラフとし、各辺には、対応する作業とタスクの組み合わせにかかるコスト(あるいは得られる利得)が割り当てることができる。アルゴリズムの目的は、UとVの各ノードを一対一にマッチングし、そのうえで総コストを最小化(または総利得を最大化)するような最適なマッチングを求めることにある。
以下に、このアルゴリズムの主なステップを示す。
ステップ1: 行の正規化
各行(作業者)について、その最小値を行全体から引く。これにより、各行に少なくとも1つのゼロ要素が出現する。
ステップ2: 列の正規化
続いて各列(タスク)に対しても同様に、最小値を引いてゼロの数を増やす。これにより、マッチング候補となる0の数が全体に広がる。
ステップ3: 0のカバリング
行または列に沿って線を引き、すべての0要素を最小の本数の線でカバーする。この線の数が最小になるよう工夫する。
ステップ4: 最適性の判定
0をカバーするために必要な線の本数が、行列のサイズ(n)と一致していれば、現在のマッチングは最適と判定できる。
ステップ5: 改善ステップ(必要な場合)
もし線の本数がn未満であれば、カバーされていない要素の中で最小値を見つけ、その値をすべての要素から適切に加減することで、新たな0を生成する。
その後、ステップ3に戻り、再び繰り返す。
この一連の操作によって、最終的に最小コストで完全なマッチングを得ることができる。これはハンガリアン法(Hungarian Algorithm)として知られている。
このアルゴリズムの時間計算量は O(n³)である。ここで n は、ノードの数(作業者やタスクの数)を表す。つまり、作業者とタスクの数が増加すると、計算にかかる時間はnの3乗に比例して増加する。このため、アルゴリズムは中規模までの問題に適しており、大規模な問題に対してはさらなる最適化や近似アルゴリズムの検討が必要となる。
この問題は、「最小コストマッチング」として以下のように定式化される\[\min_{X}\sum_{i=1}^n\sum_{j=1}^nC_{i,j}\cdot X_{i,j}\]制約条件は以下のように表される。
この数式は、全ての作業者と仕事の1対1の割当の中で、総コスト ∑C<sub>i,j</sub> を最小にするようなMを見つけることを目的としたものとなる。
ハンガリアン法(Hungarian Algorithm)は、多くのプログラミング言語で利用可能なライブラリとして実装されており、割当問題を効率的に解くことができる。以下に代表的な言語とライブラリを示す。
-
Python:
scipy.optimize
モジュールに含まれるlinear_sum_assignment()
関数が代表的。これはハンガリアン法に基づいており、与えられたコスト行列に対して最小コストの完全マッチングを求める。 -
C++:Kuhn-Munkres アルゴリズム(ハンガリアン法)をベースとした実装が多数存在。関数名としては
blossom
やkm_match()
などが用いられることが多く、競技プログラミングでも広く利用されている。 -
JavaScript:
hungarian-algorithm
という名前の軽量な npm ライブラリが提供されており、ブラウザやNode.js環境でもハンガリアン法を簡単に実行できる。
このように、主要な言語でハンガリアン法の実装が整備されており、用途に応じた導入が可能である。
関連するアルゴリズム
Kuhn–Munkresアルゴリズム(ハンガリアン法)に関連するアルゴリズムは、マッチング問題・最適化問題・ネットワークフローといった分野にまたがっている。以下に目的別に体系的に分類してそれらを述べる。。
1. マッチング関連アルゴリズム
- Kuhn–Munkres(ハンガリアン法)
-
問題:重み付き二部グラフの最小コスト完全マッチング
-
時間計算量:\(O(n^3)\)
-
- Hopcroft–Karp法
-
問題:非加重の二部グラフにおける最大マッチング
-
特徴:一度に複数の増加路を探索して高速化
-
時間計算量:\(O(\sqrt{V\cdot E})\)
-
- Edmonds’ Blossom Algorithm
-
問題:**一般グラフ(非二部グラフ)**の最大マッチング
-
特徴:奇数長サイクル(ブロッサム)を縮約
-
時間計算量:\(O(V^3)\)
-
- Gabow’s Algorithm / Micali–Vazirani Algorithm
-
問題:Blossom法の高速版(一般グラフ対応)
-
時間計算量:\(O(\sqrt{V\cdot E})\)
-
2. 最大フロー・最小費用流との関連アルゴリズム
-
Ford–Fulkerson Algorithm
-
問題:最大フロー問題
-
特徴:増加パスに沿ってフローを送る基本手法。シンプルだが、容量が実数のとき無限ループの可能性あり。
-
-
Edmonds–Karp Algorithm
-
問題:最大フロー問題
-
特徴:Ford-Fulkerson に BFS を組み合わせ、最短パスでフローを更新。計算量は\(O(VE^2)\)。
-
-
Dinic’s Algorithm
-
-
問題:最大フロー問題
-
特徴:レベルグラフ(BFS)+ブロッキングフロー(DFS)による効率的処理。計算量は\(O(E\sqrt{V})\)
-
-
-
Cycle Canceling Algorithm
-
問題:最小費用流問題
-
特徴:負のコストサイクルを検出し、それを打ち消すようにフローを再構成。収束はするが遅い。
-
-
Successive Shortest Path Algorithm
-
問題:最小費用流問題
-
特徴:毎回、最短コストの経路にフローを追加する。反復的な Dijkstra 利用などにより精度は高い。
-
-
Kuhn–Munkres Algorithm(ハンガリアン法)
-
問題:二部グラフにおける最小コスト完全マッチング(割当問題)
-
特徴:完全二部グラフかつ1対1割当に限定した、最小費用流の特殊ケースとして実装可能。
-
計算量:\(O(n^3)\)
-
このように、Kuhn–Munkres法は最小費用流アルゴリズムの特化版と位置づけられ、他のネットワークフローアルゴリズムと理論的にも実装的にも強く関連している。
3. 安定マッチング(目的が異なる)
- Gale–Shapley アルゴリズム(安定結婚問題)
-
問題:安定なマッチング(誰も他の相手を望まない)を求める
-
入力:順位リスト(希望順)
-
出力:安定性を保証するマッチング
-
- Stable Roommate Algorithm
-
一般グラフでの安定マッチング(部屋割り、チーム編成など)
-
これらは コスト最小化ではなく「安定性の最大化」 を目的とするため、Kuhn–Munkresとは目的が異なりますが、マッチングという点では関連がある。
4. 他の割当問題アルゴリズム
-
Auction Algorithm(Bertsekas)
-
並列・分散処理に適した設計
-
入札と価格調整を繰り返す動的プロセス
-
Kuhn–Munkresより柔軟で、大規模・リアルタイムな応用に強い
-
-
Hungarian Algorithm for Maximization
-
最大化問題にも対応可能
-
コスト行列を利得行列(gain matrix)に変換して、最小化問題として処理する
-
-
Greedy Assignment(貪欲法)
-
各作業者がその時点で最も安い(あるいは最も利得の高い)仕事を選ぶ
-
高速だが最適解は保証されない(近似解)
-
総当たり(brute-force)と比べ計算量は削減されるが、精度はケース依存
-
応用実装例
Kuhn–Munkresアルゴリズム(ハンガリアン法)の応用実装例として、「タスク割り当て問題(Assignment Problem)」を使ったPythonによる実装について述べる。
応用シナリオ:作業者とタスクの最適割当
問題設定:
-
3人の作業者(Alice, Bob, Charlie)と3つのタスク(T1, T2, T3)
-
各作業者が各タスクを完了するのにかかるコスト(時間・お金など)が行列で与えられる
-
各作業者に 1つのタスク を割り当て、総コストを最小化したい
実装(Python × SciPy)
import numpy as np
from scipy.optimize import linear_sum_assignment
# コスト行列(行:作業者、列:タスク)
# 例:cost[i][j] は i番目の作業者が j番目のタスクを行うコスト
cost = np.array([
[9, 2, 7], # Alice
[6, 4, 3], # Bob
[5, 8, 1] # Charlie
])
# Kuhn-Munkresアルゴリズム(最小コストマッチング)を実行
row_ind, col_ind = linear_sum_assignment(cost)
# 結果表示
total_cost = cost[row_ind, col_ind].sum()
print("割当結果:")
for i, j in zip(row_ind, col_ind):
print(f"作業者 {i} → タスク {j}(コスト: {cost[i][j]})")
print(f"総コスト: {total_cost}")
出力例:
割当結果:
作業者 0 → タスク 1(コスト: 2)
作業者 1 → タスク 2(コスト: 3)
作業者 2 → タスク 0(コスト: 5)
総コスト: 10
行列の読み替えイメージ
T1 | T2 | T3 | |
---|---|---|---|
Alice | 9 | 2 | 7 |
Bob | 6 | 4 | 3 |
Charlie | 5 | 8 | 1 |
→ AliceにT2、BobにT3、CharlieにT1を割り当てると最適(総コスト最小)
他の応用シナリオ
分野 | 応用例 | 備考 |
---|---|---|
工場 | ロボットと作業工程の割当 | 各ロボットの適性・距離によるコスト |
教育 | 学生と研究室の割当 | スコアや希望度をコストに反映 |
医療 | 医師と患者の診察スケジューリング | 各医師の専門性や負担からコスト算出 |
NLP | 文中の主語と述語の対応付け | 類似度ベースの利得最大化にも対応可 |
画像処理 | 物体追跡で前後フレーム間の対応付け | 距離・形状差をコストに反映 |
方法:
-
利得行列Gに対して、コスト行列を\(C=max(G)-G\)に変換して最小化する
profit = np.array([
[10, 3, 5],
[2, 8, 7],
[6, 4, 9]
])
cost = profit.max() - profit
row_ind, col_ind = linear_sum_assignment(cost)
補足
-
SciPyの
linear_sum_assignment()
はKuhn–Munkres法の効率的な実装 -
行列サイズが大きい場合でも O(n³) 時間で解けるため、現実的な規模にも対応
具体的な適用事例
Kuhn–Munkresアルゴリズム(ハンガリアン法)は、現実の多くの「1対1割り当て問題」に応用されています。以下に、具体的な適用事例について述べる。
1. 工場・製造業:ロボット/機械と作業工程の割り当て
概要:
-
-
各作業に必要なスキル・位置情報・時間が異なる。
-
各ロボットの移動距離や性能に応じた「作業コスト行列」が定義できる。
-
事例:
-
-
自動車工場での組立作業の最適配置
-
半導体工場のウェハー処理機と処理ジョブのマッチング
-
目的:総作業時間やエネルギー消費の最小化
2. 教育・アカデミア:学生と研究室/教授の割り当て
概要:
-
-
各学生の希望・成績と、各研究室の受け入れ条件を元に「満足度行列」を作成。
-
利得最大化問題として処理。
-
事例:
-
-
大学の配属決定システム(研究室選択)
-
日本の大学の推薦入試の自動化
-
目的:満足度最大化・公平な配属
3. 医療:医師・看護師と患者の割当
概要:
-
-
各医師の専門性・患者の重症度・待機時間からコストを定義。
-
緊急性や治療効率を優先した割当が可能。
-
事例:
-
-
救急搬送での病院選定(処置可能+搬送時間)
-
医師スケジューリングと患者マッチング
-
目的:治療負荷の平準化、診療効率の最大化
4. コンピュータビジョン:物体追跡(Object Tracking)
概要:
-
-
前後のフレーム間での物体の対応関係を推定。
-
類似度行列や距離行列をもとに、最小総誤差のマッチングを求める。
-
事例:
-
-
マルチオブジェクトトラッキング(MOT)における検出とトラックの対応付け
-
車両追跡、防犯カメラでの人物動態分析
-
目的:IDスイッチ(誤認識)の最小化
5. 自然言語処理(NLP):要素対応・翻訳アライメント
概要:
-
-
2文間の単語や句を「意味の近さ」や「文法的一致」に基づき対応させる。
-
類似度行列を利得行列として使う。
-
事例:
-
-
機械翻訳における文のアライメント
-
文中の主語・述語・目的語の関係対応付け
-
目的:翻訳品質や意味解析の精度向上
6. 物流・倉庫:荷物と配送車両の割当
概要:
-
-
荷物の重さ、距離、緊急度と車両の容量・位置に基づいて割当コストを定義。
-
事例:
-
-
ラストワンマイル配送の割当最適化
-
倉庫内のAGV(自律搬送ロボット)の移動タスク割当
-
目的:配送効率の最大化、コストの最小化
7. イベント・試験運営:部屋と試験の割当
概要:
-
-
各部屋の収容人数、必要設備、場所などに基づいて最適な試験会場を選定。
-
事例:
-
-
TOEICや大学入試の会場割当
-
カンファレンスのセッションと部屋の対応付け
-
目的:座席配置・設備利用の最適化
拡張的応用(AI・自動化)
-
AIスケジューラへの組み込み
-
業務や作業タスクを自動的に作業者へ割り当てるエージェントに応用
-
シフト管理、配送計画、人員配置などの最適化に利用
-
-
レコメンドシステムにおけるユーザーと商品の最適マッチ
-
トップN商品と各ユーザーとの相性スコア行列を用いて、最適な割当を構築
-
限られた枠(在庫、表示枠など)への高効率な推薦配置
-
-
マルチエージェント協調問題(Multi-Agent Planning)
-
複数のAIエージェントが資源・目標・タスクを互いに調整しながら最適に割当
-
ロボット群制御、分散AIタスク分担、交通・物流システムなどに応用
-
参考文献
1. 原典論文(Foundational Papers)
-
Harold W. Kuhn (1955)
-
Journal: Naval Research Logistics Quarterly
-
内容:割当問題に対する最初の多項式時間アルゴリズムを提案。線形計画と二部グラフマッチングの関係を解説。
-
James Munkres (1957)
-
Title: Algorithms for the Assignment and Transportation Problems
-
Journal: Journal of the Society for Industrial and Applied Mathematics
-
内容:Kuhn法の改良。現在の「Kuhn–Munkres法」の形式を確立。
-
2. 教科書・学習用書籍(Textbooks & Learning Resources)
-
『Introduction to Algorithms (CLRS)』
-
著者:Cormen, Leiserson, Rivest, Stein
-
内容:第29章「マッチングとフロー」でハンガリアン法の理論と背景を解説。
-
-
『Combinatorial Optimization: Algorithms and Complexity』
-
著者:Christos Papadimitriou, Kenneth Steiglitz
-
内容:線形計画と割当問題の理論を詳解。ハンガリアン法の応用も収録。
-
-
『アルゴリズム図鑑』
-
著者:石田保輝
-
内容:ハンガリアン法を図でわかりやすく説明。入門者向けに最適。
-
3. 実装リソース・チュートリアル(Implementations & Tutorials)
-
SciPy
-
内容:PythonによるKuhn–Munkresアルゴリズムの高速実装。
-
-
内容:C++実装と理論解説。競技プログラミングにも対応。
-
-
-
内容:Python, C++, Javaなど多言語実装あり(MITライセンス)
-
4. 応用事例・研究論文(Applications & Research Studies)
-
Bertsekas, D. P. (1988)
-
Title: The Auction Algorithm: A Distributed Relaxation Method for the Assignment Problem
-
内容:Kuhn–Munkres法に対する分散的代替アルゴリズム。
-
-
Combinatorial Optimization(Cook, Cunningham, Pulleyblank, Schrijver)
-
内容:割当問題、マッチング、線形計画などの応用と理論を網羅。企業最適化事例も含む。
-
-
分野別の具体的事例:
-
コンピュータビジョン:Multi-Object Tracking using Hungarian Algorithm(CVPR系論文)
-
自然言語処理:Statistical MTでの Word Alignment に応用
-
教育経済学:学生–学校割当問題(Matching Students to Schools)
-
コメント