使用lap.lapjv實現線性分配(我主要用來作為匈牙利演算法的實現)

我有一隻大鵝發表於2020-10-22

使用lap.lapjv實現線性分配(我主要用來作為匈牙利演算法的實現)

lapjv演算法是一種最佳任務分配方法,可以應用的地方很多。需要輸入一個分數方陣,最終獲得一列最佳分配數值。如 n 個數值,要實現其最佳的配對,那麼配對就需要根據n*n的一個分數方陣來計算,以總體最小代價實現任務分配,每一個數值不會重複分配。這裡不討論如何構建分數矩陣。如下圖,依據分數矩陣,以最小代價給每一個工人分配任務。
在這裡插入圖片描述
例1
以上工人分配顯然不是最佳,那麼最佳方式是怎麼樣的呢?下面用程式碼來看看:

>>> import lap
>>> from lap import lapjv
>>> import numpy as np
>>> a = np.array([[1,2,3,4],[2,4,6,8],[3,6,9,12],[4,8,12,16]])
>>> a
array([[ 1,  2,  3,  4],
       [ 2,  4,  6,  8],
       [ 3,  6,  9, 12],
       [ 4,  8, 12, 16]])
>>> c,x,y = lapjv(a)
>>> c
20.0
>>> x
array([3, 2, 1, 0])
>>> y
array([3, 2, 1, 0])

由此可以看出,最佳分配為:a-s,b-r,c-q,d-p, 總代價最小為20.

程式碼測試二:

>>> import lap
>>> from lap import lapjv
>>> import numpy as np
>>> a = np.array([[0.1,0.6,0.3],[0.2,0.1,0.6],[0.5,0.2,0.9]])
>>>
>>> c,x,y = lapjv(a)
>>> c
0.7
>>> x
array([2, 0, 1])
>>> y
array([1, 2, 0])
>>>

這裡返回三個值:
c: 賦值的代價,如果return_cost為False,則不返回。
x: 一個大小為n的陣列,用於指定每一行被分配到哪一列。
y: 一個大小為n的陣列,用於指定每列被分配到哪一行。

在這裡插入圖片描述
行索引分配[2,0,1]: cost = 0.3+0.2 +0.2 = 0.7

列索引分配 [1,2,0]:cost = 0.2 + 0.2 +0.3 =0.7

相關文章