一、問題描述
問題描述:n個人分配n項任務,乙個人只能分配一項任務,一項任務只能分配給乙個人,將一項任務分配給乙個人是需要支付報酬,如何分配任務,保證支付的報酬總數最小。
問題數學描述:
二、例項分析---窮舉法
在講將匈牙利演算法解決任務問題之前,先分析幾個具體例項。
以3個工作人員和3項任務為例項,下圖為薪酬圖表和根據薪酬圖表所得的cost矩陣。
利用最簡單的方法(窮舉法)進行求解,計算出所有分配情況的總薪酬開銷,然後求最小值。
total_cost1 = 250 + 600 + 250 = 1100; x00 = 1,x11 = 1,x22 = 1;
total_cost2 = 250 + 350 + 400 = 1000; x00 = 1,x12 = 1,x21 = 1;
total_cost3 = 400 + 400 + 250 = 1050; x01 = 1,x10 = 1,x22 = 1;
total_cost4 = 400 + 350 + 200 = 950; x01 = 1,x12 = 1,x20 = 1; //最優分配
total_cost5 = 350 + 400 + 400 = 1150; x02 = 1,x10 = 1,x21 = 1;
total_cost6 = 350 + 600 + 250 = 1150; x02 = 1,x11 = 1,x22 = 1;
對於任務數和人員數較少時,可利用窮舉法計算結果。
若將n任務分配給n個人員,其包含的所有分配情況數目為n!,n增大時,窮舉法將難以完成任務。
三、匈牙利演算法
下面簡要介紹匈牙利演算法。
其基本的理論基礎是針對cost矩陣,將cost矩陣的一行或一列資料加上或減去乙個數,其最優任務分配求解問題不變。
演算法的基本步驟如下:
四、例項分析---匈牙利演算法
下面結合具體例項,分析匈牙利演算法如何解決任務分配問題。
以n = 4為例項,下圖為cost列表和cost矩陣。
step1.從第1行減去75,第2行減去35,第3行減去90,第4行減去45。
step2.從第1列減去0,第2列減去0,第3列減去0,第4列減去5。
step3.利用最少的水平線或垂直線覆蓋所有的0。
step4.由於水平線和垂直線的總數是3,少於4,進入step5。
step5.沒有被覆蓋的最小值是5,沒有被覆蓋的每行減去最小值5,被覆蓋的每列加上最小值5,然後跳轉到步驟3.
step3.利用最少的水平線或垂直線覆蓋所有的0。
step4.由於水平線和垂直線的總數是3,少於4,進入step5。
step5.沒有被覆蓋的最小值是20,沒有被覆蓋的每行減去最小值20,被覆蓋的每列加上最小值20,然後跳轉到步驟3.
step3.利用最少的水平線或垂直線覆蓋所有的0。
step4.由於水平線和垂直線的總數是4,演算法結束,分配結果如下圖所示。
其中,黃色框表示分配結果,左邊矩陣的最優分配等價於左邊矩陣的最優分配。
五、參考資料
任務分配問題 回溯演算法
要求把n項任務分配給 n個人,每個人完成每項任務的成本不同,要求分配成本最小的最優分配方案。include define n 205 using namespace std int c n n int x n int bestm n int n int bmin 999999999 int sum ...
任務分配問題
任務分配問題是在加權 二分圖中尋找最大 或最小 加權匹配的問題。隱藏 分為以下幾類 這些問題都是組合優化的研究物件。有一些員工要完成一些任務。各個員工完成不同任務所花費的時間都不同。每個員工只分配一項任務。每項任務只被分配給乙個員工。怎樣分配員工與任務以使所花費的時間最少?婚配問題 有一些男人和一些...
任務分配問題
題目要求 輸入 第一行是操作員的人數n 4 輸出 完成所有任務的最短時間。測試用例 test input expected output time limitation memory limitation extra process number test case 1 view plain 4 3...