【问题标题】:Hungarian algorithm dead end匈牙利算法死胡同
【发布时间】:2016-06-07 18:47:03
【问题描述】:

我正在关注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 个零 => 转到下一行
  2. 选择 (2,1) 零并将 (5,1) 添加到暂停的零
  3. 第三行包含 >1 个零 => 转到下一行
  4. 选择 (4,6) 零
  5. 选择 (5,1) 零并将 (3,1) 添加到暂停的零
  6. 选择 (6,5) 零并将 (3,5), (1,5) 添加到暂停的零

现在,剩下的零是 (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=选中
  • ? = 我应该做什么

【问题讨论】:

    标签: java rows calculated-columns hungarian-algorithm


    【解决方案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 个作业,所以这是我们的解决方案。

    【讨论】:

    • Naaaah,我走了三分钟,我懒得看整个视频了。谢谢耶,真的很感激! :) 祝你好运!
    猜你喜欢
    • 2011-05-03
    • 2010-11-16
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 2015-06-15
    • 1970-01-01
    • 2017-03-09
    • 2018-06-14
    相关资源
    最近更新 更多