详细的匈牙利算法(赋值问题)问题

时间:2011-08-05 22:46:37

标签: algorithm graph variable-assignment graph-algorithm

我已经实现了匈牙利算法,这是this article所描述的分配问题的解决方案,但它在几个百分比的随机成本矩阵上失败了。

我花了几周的时间调试它(我在问this question时开始,但不是全职)。我采用算法失败的随机成本矩阵,并使用旧的笔和纸执行算法,并将其与我的实现进行比较,看看出了什么问题。这导致了我现在纠正的一些错误,但是我遇到了一个例子,当我手工解决它时,我没有得到正确的解决方案。对于任何感兴趣的人:该示例的costmatrix是{{0,6,4,3},{3,2,1,2},{0,7,6,4},{3,8,5,3}},正确的解决方案的总和为9=4+2+0+3(按此顺序)。在那个例子中,最终匹配的边缘不在平等子图上,我认为这是不可能的,表明出现了问题。

要么我不完全理解解决方案,这是一个可行的选择,或者在所提出的解决方案中的微妙的错误,我将在下面详细说明。

我意识到我必须引入一些术语,但由于这是一个详细的问题,我不打算详细解释所有概念,因为任何需要这种解释的人都可能无法回答我的问题。

  • 问题的输入是加权完整的二分图,每个分区上有n个节点。
  • 提供的方法指定查找n扩充路径。
  • 扩充路径是在不匹配的节点处开始和结束的交替路径。
  • 交替路径是在相等子图上匹配的不匹配边之间交替的路径。
  • 这些交替路径以广度优先的方式生长,仅在以下任何一种情况下停止:
    • 找到扩充路径或
    • 交替路径不能再生长。
  • 关于可能的错误的关键事实:算法会记住交替路径遇到的节点,这会影响与此问题无关的部分的算法。

当找到增强路径时,所提出的方法表示停止增长交替路径。我认为这是不正确的。我认为所有交替路径都需要增长到找到的增强路径的成本。请注意,交替路径以广度优先的方式生长,因此这只会增加路径,其成本可以与找到的路径相关联。这个小的改变可能导致一些节点被标记为“由交替路径访问”,否则将不会被标记,这将进一步影响算法。

实际问题: 我是否应该考虑交替路径的成本等于增强路径的成本(并从同一节点开始)?这与所提出的方法相反,该方法表示一旦找到增强路径就会停止,而不管成本与其他路径的关系如何。

1 个答案:

答案 0 :(得分:2)

在“The Stanford GraphBase”中查看匈牙利算法的演示,您可以跟踪其向解决方案的进展,为成本矩阵的一行中的每个单元格或成本矩阵的列中的每个单元格添加常量,当你在改变的矩阵中有一套完整的独立零时,看到你有一个解决方案。

我刚读过您所提到的论文一次。是否找到扩充路径允许您增加更改矩阵中的独立零的数量?如果是这样,那么找到n个扩充路径,如图3中的步骤2,将找到一个好的解决方案,因为你必须有n个独立的零。如果是这样,那么您可以通过检查找到的每个扩充路径是否添加一个独立的零来检查算法的实现,即使在有其他路径可以找到但却没有找到的情况下也是如此。