匈牙利算法死胡同

时间:2016-06-07 18:47:03

标签: java rows calculated-columns hungarian-algorithm

我正在关注Youtube of the Indian guy about the Hungarian problem上的教程。我堆叠在他决定下一步将选择哪些行和列的位置。他的榜样没有我面临的问题。这是我的例子表:

2 1 0 0 0 3
2 0 4 5 2 7
0 7 0 0 0 5
3 2 3 1 2 0
0 0 6 3 3 5
3 4 5 2 0 3

因此,让我们一步一步地开始行和列选择:

  1. 第一行包含> 1 zeros =>转到下一行
  2. 选择(2,1)零并将(5,1)添加到暂停的零
  3. 第三行包含> 1 zeros =>转到下一行
  4. 选择(4,6)零
  5. 选择(5,1)零并将(3,1)添加到暂停的零
  6. 选择(6,5)零并将(3,5),(1,5)添加到暂停的零
  7. 现在,剩下的零是(1,3),(1,4),(3,3),(3,4)

    我找不到处理它们的方法,也不能用列方式或行方式处理它们。我该怎么办?

    这是最后的表格:

    2     1     0?    0?    0(su) 3
    3     0(se) 4     5     2     7
    0(su) 7     0?    0?    0(su) 5
    3     2     3     1     2     0(se)
    0(se) 0(su) 6     3     3     5
    3     4     5     2     0(se) 3
    

    其中

    • su =已暂停
    • se =选择
    • ? =我想做什么

1 个答案:

答案 0 :(得分:1)

在这个特定的例子中,我们可以任意选择0.选择左上角给我们

2     1     0(se) 0(su) 0(su) 3
3     0(se) 4     5     2     7
0(su) 7     0(su) 0?    0(su) 5
3     2     3     1     2     0(se)
0(se) 0(su) 6     3     3     5
3     4     5     2     0(se) 3

然后我们可以选择最终的免费0并完成。

但这并不总是有效。考虑

0 0 0 0
0 0 0 0
0 0 1 2
0 0 3 4

(如果您更喜欢视频,我使用与here相同的问题,不过我实际上会解决它。)

我们不能从一开始就选择任何东西,所以我们随意选择第一个0。

0(se) 0(su) 0(su) 0(su)
0(su) 0     0     0
0(su) 0     1     2
0(su) 0     3     4

现在我们可以选择(1,3),因为它是行中唯一的免费0。

0(se) 0(su) 0(su) 0(su)
0(su) 0(su) 0     0
0(su) 0(se) 1     2
0(su) 0(su) 3     4

然后(3,1),因为它是列中唯一的0。

0(se) 0(su) 0(su) 0(su)
0(su) 0(su) 0(se) 0(su)
0(su) 0(se) 1     2
0(su) 0(su) 3     4

这给了我们3个总分配,但我们需要4个解决方案,并且没有更多的可用0分配。此时可能没有解决方案,因此我们需要继续使用匈牙利算法进行线条绘制步骤。

G. Srinivasan教授在我链接的视频中详细介绍了这一点,所以我将跳过结果。如果绘制的线数大于我们正在寻找的任务数量,我们将继续使用剩余的匈牙利算法;如果它少了,上一步出了点问题,你应该回去看看你的工作;但如果它是相同的(就像在这个例子中那样),那么我们知道这里有一个我们没有找到的最佳解决方案。

我对有问题的任意分配的解决方案是更随意的分配。第4行是此时唯一一个没有赋值的行,所以我们将从那里开始并分配它的第一个0(暂停的0现在无关紧要,所以我没有标记它们。)

0(se) 0     0     0
0     0     0(se) 0
0     0(se) 1     2
0(se) 0     3     4

这显然有问题,因为我们已经在第一列中进行了分配。要解决这个问题,我们需要将其中一个移到其他地方。幸运的是,第4行仍然没有赋值,并且(1,4)是零,所以我们可以将(1,1)中的赋值移动到(1,4)。

0     0     0     0(se)
0     0     0(se) 0
0     0(se) 1     2
0(se) 0     3     4

现在没有冲突,我们有4个任务,所以这是我们的解决方案。