分配問題與匈牙利算法

分配問題與匈牙利算法

例1

假如你是個玩具工廠的銷售經理,你現在有三個銷售人員要去不同城市見買家。你的銷售人員分別在在奧斯丁,得克薩斯州;波士頓、馬里蘭州;和芝加哥,伊利諾伊州。你想讓他們飛往其他三個城市:丹佛,埃德蒙頓,法戈。下面的表格顯示了這些城市之間飛機票的費用.。

From \ To Denver Edmonton Fargo
Austin 250 400 350
Boston 400 600 350
Chicago 200 400 250

你應該讓你的銷售人員前往哪個城市以獲取最小的費用?
可以用一個花費矩陣來代表上圖數據:

250400200400600400350350250(1)

讓我們看一下可能的分配方案:
這裏寫圖片描述
總共需要花費 250 + 600 + 250 = 1100.
以下是另一種分配方案:
這裏寫圖片描述
總共需要花費 250 + 350 + 400 = 1000.
檢查完所有六種可能的分配方案後我們得到最有的分配方案是:
這裏寫圖片描述
總共需要花費 400 + 350 + 200 = 950.
即你的銷售人員應該從奧斯汀飛往埃德蒙頓,從波斯頓飛往法戈,從芝加哥飛往丹佛。
遍歷所有可能的情況對於此問題是可行的,但是如果是從十個城市飛往另外十個城市呢?那麼便有n!種可能的情況,顯然,遍歷不可行。

定理

如果從成本矩陣的任一行或列的所有項中添加或減去數字,那麼,所得矩陣的最優分配也是原始矩陣的最優分配。

匈牙利算法

下面的算法將上述定理應用到一個給定的n×n成本矩陣上求出最優分配。

  1. 每行的所有數字減去該行的最小項
  2. 每列的所有數字減去該列的最小項
  3. 使用橫線或者豎線穿過矩陣中的所有0,並記錄達成此目的所需的最少線路總數
  4. 如果線路總數等於矩陣的行數或者列數n,那麼一種最優的分配是可能的,完成。如果總數小於n,執行下一步
  5. 找到線路未覆蓋的地方的最小項,存在未覆蓋的項的行減去該項,然後將該項添加到覆蓋的列中

例2

題目同例1
解題方法:
第一步:第一行減去250,第二行減去350,第三行減去200
這裏寫圖片描述
第二步:第一列減去0,第二列減去150,第三列減去0
這裏寫圖片描述
第三步:劃線以包含全部0
這裏寫圖片描述
第四步:劃線數等於行數,最優分配找到。每行每列選擇一個0,對應的原矩陣數字相加即爲最小分配。
選擇0

最小分配

例3

一家建築公司有四個大型推土機位於四個不同的車庫。推土機被轉移到四個不同的建築工地。推土機和建設用地之間的距離如下(單位:公里)。

推土機 \ 工地 A B C D
1 90 75 75 80
2 35 85 55 65
3 125 95 90 105
4 45 110 95 115

我們應該怎麼分配推土機使得推土機總共行駛的里程最小?
第一步:第一行減去75,第二行減去35,第三行減去90,第四行減去45
這裏寫圖片描述
第二步:第一列減去0,第二列減去0,第三列減去0,第四列減去5。
這裏寫圖片描述
第三步:劃線以包含全部0
這裏寫圖片描述
第四步:因爲線路總數小於4,故執行第五步
第五步:注意到5是未覆蓋區域的最小值,存在未覆蓋區域的行每行減去5
這裏寫圖片描述
然後被覆蓋的列每列加5
這裏寫圖片描述
然後再執行步驟3:劃線以包含全部0
這裏寫圖片描述
因爲線路數量小於4,執行步驟5:注意到20是未覆蓋區域的最小值,存在未覆蓋區域的行每行減去20
這裏寫圖片描述
然後覆蓋的每列加20
這裏寫圖片描述
跳轉到步驟3:劃線覆蓋所有0
這裏寫圖片描述
第四步:因爲最小線路總數等於4,故存在最優分配
這裏寫圖片描述
每行每列選擇一個0,對應的原矩陣數字相加即爲最小分配。
這裏寫圖片描述
故推土機1去工地D,推土機2去工地C,推土機3去工地B,推土機4去工地A。

備註

最大分配問題只需將第一步的每行減去該行最小值改爲該行的最大值減去此行每一項,其他步驟相同。

發佈了40 篇原創文章 · 獲贊 10 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章