由於任務分配問題用回溯法和分支限界法的時間復雜度有點高,所以學習一下解決二分圖的匈牙利算法和KM算法。
(本文參考知乎大佬的講解,原文鏈接點這里)
1,什么是二分圖?
就是能分成兩組,U,V。其中,U上的點不能相互連通,只能連去V中的點,同理,V中的點不能相互連通,只能連去U中的點。這樣,就叫做二分圖。

1.匈牙利算法
匈牙利算法是一種在多項式時間內求解任務分配問題的組合優化算法。假設左邊的四張圖是我們在第N幀檢測到的目標(U),右邊四張圖是我們在第N+1幀檢測到的目標(V)。紅線連起來的圖,是我們的算法認為是同一行人可能性較大的目標。
第一步.
首先給左1進行匹配,發現第一個與其相連的右1還未匹配,將其配對,連上一條藍線。

第二步.
接着匹配左2,發現與其相連的第一個目標右2還未匹配,將其配對。

第三步.
接下來是左3,發現最優先的目標右1已經匹配完成了,怎么辦呢?
我們給之前右1的匹配對象左1分配另一個對象。
黃色表示這條邊被臨時拆掉)

可以與左1匹配的第二個目標是右2,但右2也已經有了匹配對象,怎么辦呢?
我們再給之前右2的匹配對象左2分配另一個對象(注意這個步驟和上面是一樣的,這是一個遞歸的過程)。

最后結果

最后是左4,很遺憾,按照第三步的節奏我們沒法給左4騰出來一個匹配對象,只能放棄對左4的匹配,匈牙利算法流程至此結束。藍線就是我們最后的匹配結果。至此我們找到了這個二分圖的一個最大匹配。
有一個很明顯的問題相信大家也發現了,按這個思路找到的最大匹配往往不是我們心中的最優。匈牙利算法將每個匹配對象的地位視為相同,在這個前提下求解最大匹配。這個和我們研究的多目標跟蹤問題有些不合,因為每個匹配對象不可能是同等地位的,總有一個真實目標是我們要找的最佳匹配,而這個真實目標應該擁有更高的權重,在此基礎上匹配的結果才能更貼近真實情況。
KM算法就能比較好地解決這個問題,我們下面來看看KM算法。
2.KM算法(Kuhn-Munkres Algorithm)
KM算法解決的是帶權二分圖的最優匹配問題。還是用上面的圖來舉例子,這次給每條連接關系加入了權重,也就是我們算法中其他模塊給出的置信度分值。

第一步
首先對每個頂點賦值,稱為頂標,將左邊的頂點賦值為與其相連的邊的最大權重,右邊的頂點賦值為0。

匹配的原則是只和權重與左邊分數(頂標)相同的邊進行匹配,若找不到邊匹配,對此條路徑的所有左邊頂點的頂標減d,所有右邊頂點的頂標加d。參數d我們在這里取值為0.1。
對於左1,與頂標分值相同的邊先標藍。

然后是左2,與頂標分值相同的邊標藍

然后是左3,發現與右1已經與左1配對。首先想到讓左3更換匹配對象,然而根據匹配原則,只有權值大於等於0.9+0=0.9(左頂標加右頂標)的邊能滿足要求。於是左3無法換邊。那左1能不能換邊呢?對於左1來說,只有權值大於等於0.8+0=0.8的邊能滿足要求,無法換邊。此時根據KM算法,應對所有沖突的邊的頂點做加減操作,令左邊頂點值減0.1,右邊頂點值加0.1。結果如下圖所示。

再進行匹配操作,發現左3多了一條可匹配的邊,因為此時左3對右2的匹配要求只需權重大於等於0.8+0即可,所以左3與右2匹配!

匈牙利算法得到的最大匹配並不是唯一的,預設匹配邊、或者匹配順序不同等,都可能會導致有多種最大匹配情況,所以有一種替代KM算法的想法是,我們只需要用匈牙利算法找到所有的最大匹配,比較每個最大匹配的權重,再選出最大權重的最優匹配即可得到更貼近真實情況的匹配結果。但這種方法時間復雜度較高,會隨着目標數越來越多,消耗的時間大大增加,實際使用中並不推薦
