问题场景:
我需要为单个工作人员分配多个任务。
这是成本矩阵
我有6个任务和3个工作人员。
C(i,j)= 1,对于指示的工作人员,可以将工作人员分配给任务。
费用矩阵
TASK/WORKER WORKER1 WORKER2 WORKER3
TASK 1 1 1000 1000
TASK 2 1000 1 1000
TASK 3 1000 1000 1000
TASK 4 1 1000 1000
TASK 5 1000 1 1000
TASK 6 1000 1000 1
这里,worker1可以完成任务(TASK-1,TASK-4) worker2可以完成任务(TASK-2,TASK-5) worker3可以完成任务(TASK-6)
为了创建方形矩阵,我添加了虚拟工人:DWORKER1,DWORKER2和DWORKER3,如下所示,并为单元格值分配了非常大的值(1000000)。
TASK/WORKER WORKER1 WORKER2 WORKER3 DWORKER1 DWORKER2 DWORKER3
TASK 1 1 1000 1000 1000000 100000 1000000
TASK 2 1000 1 1000 1000000 100000 1000000
TASK 3 1000 1000 1000 1000000 100000 1000000
TASK 4 1 1000 1000 1000000 100000 1000000
TASK 5 1000 1 1000 1000000 100000 1000000
TASK 6 1000 1000 1 1000000 100000 1000000
我使用了scipy
包scipy.optimize.linear_sum_assignment
。如下:
from scipy.optimize import linear_sum_assignment
cost = np.array([[1,1000,1000,1000000,100000,1000000],[1000,1,1000,1000000,1000000,1000000],[1000,1000,
1000,1000000,100000,1000000],[1,1000,1000,1000000,1000000,1000000],[1000,1,1000,1000000,100000, 1000000],[1000,1000,1,1000000,1000000,1000000]])
row_ind, col_ind = linear_sum_assignment(cost)
col_ind的输出为array([5, 3, 4, 0, 1, 2])
输出显示(如果我没有错误):
- Assign 6th task to worker 1
- Assign 4th task to worker 2
- Assign 5th task to worker 3
- Assign 1st task to Dummy worker 1
- Assign 2nd task to Dummy worker 2
- Assign 3rd task to Dummy worker 3
我所期待的是,将任务(1,2和3)分配给真正的工人而不是假工人。 通过这种实施可能吗?或者我在这里遗漏了什么?
答案 0 :(得分:0)
匈牙利语算法用于解决分配问题,其中只有一个任务分配给每个工作人员。通过你提出的技巧,你确实会为每个虚拟工作者分配一个任务。
如果您只想将任务分配给真正的工作人员并分配多个任务,那就更容易了:对于每个任务,选择成本最低的工作人员。在您的示例中,这意味着工作人员1将执行任务1和4,工作人员2将执行任务2和5,工作人员3将执行任务6,任务3将由三个工作人员中的一个完成(取决于您如何处理平等的情况)。