使用lap.lapjv实现线性分配(我主要用来作为匈牙利算法的实现)

it2026-02-25  7

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

最新回复(0)