首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 實作匈牙利演算法:指派問題最佳化求解

     編輯:關於C#

匈牙利演算法(Hungarian Algorithm)可在 O(n³) 時間解決「n 人分派 n 任務、總成本最小」的指派問題。本文提供完整 C# 實作,包含矩陣減元、零元標記、最少覆蓋線、調整矩陣迭代至最佳指派,並附上經典 4×4 教授-課程範例驗證。

問題定義

成本矩陣 cost[i,j] 表示第 i 人執行第 j 任務的成本。尋找排列 assign[i] = j 使 Σ cost[i, assign[i]] 最小。

演算法步驟

  1. 列減元:每列減去該列最小值。
  2. 行減元:每行減去該行最小值。
  3. 零元標記:優先選零元較少的列,標記第一個未被覆蓋的零,同列同行其他零劃叉。
  4. 最佳指派檢查:若標記數 = n,完成;否則進入步驟 5。
  5. 最少覆蓋線:劃出最少水平/垂直線覆蓋所有零元。
  6. 矩陣調整:找未被覆蓋的最小值 k,未覆蓋元素減 k,覆蓋線交點加 k,回步驟 3。

核心類別實作


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 (依實際矩陣調整)

關鍵實作細節

  • 方陣假設:非方陣需補虛擬列/行(成本設極大值)。
  • 覆蓋線最小化:屬於 NP-hard 子問題,此處採用貪婪策略(優先覆蓋零元較多的列/行),實務上對中小規模矩陣足夠;嚴格最佳解可轉換為最大二分圖匹配(Kőnig 定理)。
  • 數值穩定:整數矩陣無浮點誤差問題。
  • 擴充:回傳 List 即指派對應;若需總成本,自行對原矩陣求和。

應用場景

  • 人員排班、機器指派、車輛調度。
  • 影像特徵點匹配、物件追蹤。
  • 資源分配、排程最佳化。

替代方案

  • Google OR-Tools:工業級 CP-SAT 求解器,支援更大規模、約束條件豐富。
  • 線性規劃:Simplex、Interior Point 通用但較慢。
  • 最小費用最大流:圖論建模,同樣 O(n³) 級別。

匈牙利演算法是指派問題的經典解法,C# 實作不超過 200 行,理解其矩陣操作邏輯有助於解決各類資源配對最佳化問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved