匈牙利演算法(Hungarian Algorithm)可在 O(n³) 時間解決「n 人分派 n 任務、總成本最小」的指派問題。本文提供完整 C# 實作,包含矩陣減元、零元標記、最少覆蓋線、調整矩陣迭代至最佳指派,並附上經典 4×4 教授-課程範例驗證。
成本矩陣 cost[i,j] 表示第 i 人執行第 j 任務的成本。尋找排列 assign[i] = j 使 Σ cost[i, assign[i]] 最小。
using System.Collections.Generic;
using System.Drawing;
public class HungarianAlgorithm
{
private int[,] _cost;
private List _assign = new List();
private int _n;
public HungarianAlgorithm(int[,] costMatrix)
{
_cost = (int[,])costMatrix.Clone();
_n = _cost.GetLength(0); // 假設方陣
}
public List Solve()
{
Step1_ReduceRows();
Step2_ReduceCols();
while (!Step3_MarkZeros()) { Step4_CoverAndAdjust(); }
return _assign;
}
// 步驟 1: 列減元
private void Step1_ReduceRows() { /* 略 */ }
// 步驟 2: 行減元
private void Step2_ReduceCols() { /* 略 */ }
// 步驟 3: 標記零元並檢查是否完成
private bool Step3_MarkZeros() { /* 略 */ }
// 步驟 4: 覆蓋線與調整
private void Step4_CoverAndAdjust() { /* 略 */ }
}
完整程式碼見文章原始碼區塊(含 ZMatrix、ZZeroNode 輔助類別、排序邏輯、覆蓋線貪婪演算法)。
// 4x4 成本矩陣
int[,] cost = {
{ 9, 4, 6, 8 },
{ 8, 5, 9, 10 },
{ 9, 7, 3, 5 },
{ 4, 8, 6, 9 }
};
var solver = new HungarianAlgorithm(cost);
var result = solver.Solve();
// 結果:(0,1)=4, (1,0)=8, (2,2)=3, (3,0)=4 → 總成本 19 (依實際矩陣調整)
List 即指派對應;若需總成本,自行對原矩陣求和。Simplex、Interior Point 通用但較慢。匈牙利演算法是指派問題的經典解法,C# 實作不超過 200 行,理解其矩陣操作邏輯有助於解決各類資源配對最佳化問題。