问题场景:
- 任务数(n)大于工人数(m)。
我需要将多个任务分配给一个工人。
这是成本矩阵
我有 6 个任务和 3 个可用的工人。
C (i,j) = 1,对于指示的单元格,可以将工人分配给任务。
- C (i,j) = 1000,对于表示不能将工人分配给任务的单元格。
成本矩阵
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)
为了创建方阵,我添加了虚拟 WORKERS: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
我所期待的是,将 TASK(1、2 和 3)分配给真正的工人而不是假工人。通过这个实现有可能吗?或者我在这里遗漏了什么?