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

Algorithm 匈牙利算法对多个赋值没有给出正确的结果,algorithm,optimization,scipy,hungarian-algorithm,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

问题场景:

  • 任务数(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可以执行任务(任务1、任务4) worker2可以执行任务(任务2、任务5) worker3可以执行任务(任务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\u sum\u赋值
。详情如下:

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的输出是
数组([5,3,4,0,1,2])

输出指示(如果我没有错):

我期望的是,将任务(1、2和3)分配给真正的工人,而不是虚拟工人。
通过这个实现,这是可能的吗?还是我遗漏了什么?

匈牙利算法是用来解决分配问题的,每个工人只分配一个任务。通过执行您提议的技巧,您将确实有1个任务分配给每个虚拟工作者

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

    - 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