匈牙利演算法講解

2021-08-29 13:54:14 字數 814 閱讀 3941

簡介匈牙利演算法是一種在多項式時間內求解任務分配問題的組合優化演算法,如果使用暴力窮舉求解分配解的話,則是乙個np的問題。

任務(目標):假設乙個非負矩陣,第i行第j列的元素表示第i個工人完成第j個任務需要耗費的精力(時間等),希望找到乙個最佳分配,使得所有工人完成所有的任務,同時總消耗量(cost)最小化。

匈牙利演算法的時間複雜度是o(n 3 ) o(n3)o(n^3)的

步驟給定n個工人和任務,以及包含分配給每個工人乙個任務的成本的n×n n×nn \times n矩陣,尋找成本最小化分配。

第一步對矩陣所有行,將該行所有數減去該行最小的值,得到新的矩陣,新矩陣中每行至少有乙個0,如果他們都分配在不同的列上,則結束分配。否則進行第二步。

第二步對於第一步得到的矩陣,對於其所有列,減去該列的最小值,因此每行每列至少包含乙個0,大部分情況下,這一步可以完成分配,如果不行,則進行第三步。、

第三步使用盡可能少的行或列來覆蓋矩陣中的所有0,一種可行的方法如下:

盡可能多地分配任務。即從第一行開始,如果有0就分配,同時劃掉這一行和這一列;之後的行中如果有不能分配的,則不進行分配。

畫圖標記所有未分配的行

標記所有新標記的行中0所在的對應列。

標記所有在新標記的列中0所在的行。

對所有未分配的行重複上述過程。

經過上述步驟,所有的0都能被以最小的線所覆蓋。

第四步從上一步中未被覆蓋的元素中找到最小值,然後把這些元素都減去這個最小值,給直線交叉點的元素加上這一最小值。

第五步重複第三步和第四步,直到所有任務都被分配。

注意第三步有很多做法,下面參考鏈結中的做法也不盡相同。

參考鏈結

匈牙利演算法講解 1

匈牙利演算法是由匈牙利數學家edmonds於1965年提出,因而得名。匈牙利演算法是基於hall定理中充分性證明的思想,它是部圖匹配最常見的演算法,該演算法的核心就是尋找增廣路徑,它是一種用增廣路徑求二分圖最大匹配的演算法。等等,看得頭大?那麼請看下面的版本 通過數代人的努力,你終於趕上了剩男剩女的...

匈牙利演算法

匈牙利演算法 edmonds演算法 步聚 1 首先用 標記x中所有的非m頂點,然後交替進行步驟 2 3 2 選取乙個剛標記 用 或在步驟 3 中用 yi 標記 過的x中頂點,例如頂點xi,如果xi與y為同一非匹配邊的兩端點,且在本步驟中y尚未被標記過,則用 xi 去標記y中頂點y。重複步驟 2 直至...

匈牙利演算法

匈牙利演算法用來解決二分圖的最大匹配問題。乙個典型的最大匹配問題的描述如下 乙個公司有n項工作,m個員工。每個員工能勝任n項工作中的幾項 0 n 工作。問題是,如何分配才能使得被處理的工作數最大。當然,如果公司裡人員很多,每項工作都有很多員工可以勝任,那麼使每項工作都有人處理的方案是顯而易見的。但遇...