【发布时间】:2014-06-16 06:37:54
【问题描述】:
我正在尝试实现Hungarian Algorithm,但我被困在step 5 上。基本上,给定一个n X n 数字矩阵,我怎样才能找到最小数量的垂直+水平线,以便覆盖矩阵中的零?
在有人将此问题标记为与this 重复之前,此处提到的解决方案不正确,而其他人则为also ran into the bug in the code posted there。
我不是在寻找代码,而是我可以绘制这些线条的概念......
编辑: 请不要发布简单(但错误)的贪心算法: 鉴于此输入:
(0, 1, 0, 1, 1)
(1, 1, 0, 1, 1)
(1, 0, 0, 0, 1)
(1, 1, 0, 1, 1)
(1, 0, 0, 1, 0)
我选择,第 2 列显然(0 索引):
(0, 1, x, 1, 1)
(1, 1, x, 1, 1)
(1, 0, x, 0, 1)
(1, 1, x, 1, 1)
(1, 0, x, 1, 0)
现在我可以选择第 2 行或第 1 列,它们都有两个“剩余”零。如果我选择 col2,我最终会得到不正确的解决方案:
(0, x, x, 1, 1)
(1, x, x, 1, 1)
(1, x, x, 0, 1)
(1, x, x, 1, 1)
(1, x, x, 1, 0)
正确的解决方案是使用 4 行:
(x, x, x, x, x)
(1, 1, x, 1, 1)
(x, x, x, x, x)
(1, 1, x, 1, 1)
(x, x, x, x, x)
【问题讨论】:
-
如果有帮助,请检查wikipedia article 的第 3 步。
-
我在发帖之前看到了维基百科的文章,不,它没有帮助。当他们在第 3 步中“最初分配尽可能多的任务然后执行以下操作”时,它的级别太高了......
-
复制我现在丢失的评论:有一种很好的方法可以测试匈牙利算法(或任何其他原始对偶算法)的输出。修改实现以返回每一行和每一列的潜力。检查势能是否有效:每个矩阵条目大于或等于(对于最小成本匹配)行势能和列势能之和。检查匹配对应的条目是否等于行电位和列电位之和。
-
您搜索的内容称为矩阵的
zero-term rank。 -
我想你的两个链接的内容是从第一条评论链接的维基百科文章中抄袭的,这(IMO)不是很好。
标签: algorithm matrix matching greedy hungarian-algorithm