匈牙利算法:每个工人多个工作

时间:2018-01-05 06:42:50

标签: python algorithm linear-programming hungarian-algorithm

匈牙利算法的扩展是否适合为每个工作人员分配多个工作?在最简单的形式中,算法将单个作业分配给单个工作者。

我的申请是一个利润最大化问题,有3名工人和180个工作岗位。我也会添加约束(分配给每个工作者的最少50个工作)。

我已经设法使用Python中的mungres库来实现匈牙利语算法,该算法非常有效。我只是在努力寻找与每个工人的多项任务相关的文献。

https://pypi.python.org/pypi/munkres

https://en.wikipedia.org/wiki/Hungarian_algorithm

https://en.wikipedia.org/wiki/Generalized_assignment_problem

我已尝试过评论中列出的标准numpy方法,但无法将其扩展到每个工作人员的多个分配。如果我的矩阵是矩形(即3个工人和4个工作),则仅将前3个工作分配给工人。我也尝试添加虚拟变量来创建一个方形矩阵,但是然后将工作分配给那些虚拟工作者而不是实际工作者

3 个答案:

答案 0 :(得分:3)

方法1

这样做的一个简单方法是制作每个工人的50个克隆并正常解决问题。

要查找工人1的工作,您可以收集分配给工人1克隆的所有工作。只有50个克隆,因此工人1将被分配到最多50个工作。

方法2

这种分配问题可以表示为最小成本流问题,如果工人找到工作,就会有从工人到工作的流量。

在这个配方中,每个工人的供应量为1个流量单位。然后,您可以通过简单地根据需要增加容量来增加作业数量。

这种方法可能更有效(因为图表更小)但需要修改基础算法,而方法1应该无法实现。

答案 1 :(得分:0)

检查:https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.optimize.linear_sum_assignment.html

  

线性和指派问题也称为最小权重   在二分图中匹配。问题实例由a描述   矩阵C,其中每个C [i,j]是匹配顶点i的代价   第一个部分集(“工人”)和第二个集合的顶点j(a   “工作”)。目标是找到一份完整的工人分配工作   最低成本。

答案 2 :(得分:0)

这可以通过将其表示为具有[50,inf)界限的工人的运输问题来解决。如果我错了,请纠正我,彼得的解决方案中的方法1是一个人最多可以做50次,而不是最少做一次。