匈牙利算法没有为多个赋值给出正确的结果

时间:2017-09-12 09:15:31

标签: algorithm optimization scipy hungarian-algorithm

问题场景:

  • 任务数量(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)

为了创建方形矩阵,我添加了虚拟工人: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

我使用了scipyscipy.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)分配给真正的工人而不是假工人。 通过这种实施可能吗?或者我在这里遗漏了什么?

1 个答案:

答案 0 :(得分:0)

匈牙利语算法用于解决分配问题,其中只有一个任务分配给每个工作人员。通过你提出的技巧,你确实会为每个虚拟工作者分配一个任务。

如果您只想将任务分配给真正的工作人员并分配多个任务,那就更容易了:对于每个任务,选择成本最低的工作人员。在您的示例中,这意味着工作人员1将执行任务1和4,工作人员2将执行任务2和5,工作人员3将执行任务6,任务3将由三个工作人员中的一个完成(取决于您如何处理平等的情况)。