使用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