我已经实现了匈牙利算法,这是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
扩充路径。当找到增强路径时,所提出的方法表示停止增长交替路径。我认为这是不正确的。我认为所有交替路径都需要增长到找到的增强路径的成本。请注意,交替路径以广度优先的方式生长,因此这只会增加路径,其成本可以与找到的路径相关联。这个小的改变可能导致一些节点被标记为“由交替路径访问”,否则将不会被标记,这将进一步影响算法。
实际问题: 我是否应该考虑交替路径的成本等于增强路径的成本(并从同一节点开始)?这与所提出的方法相反,该方法表示一旦找到增强路径就会停止,而不管成本与其他路径的关系如何。
答案 0 :(得分:2)
在“The Stanford GraphBase”中查看匈牙利算法的演示,您可以跟踪其向解决方案的进展,为成本矩阵的一行中的每个单元格或成本矩阵的列中的每个单元格添加常量,当你在改变的矩阵中有一套完整的独立零时,看到你有一个解决方案。
我刚读过您所提到的论文一次。是否找到扩充路径允许您增加更改矩阵中的独立零的数量?如果是这样,那么找到n个扩充路径,如图3中的步骤2,将找到一个好的解决方案,因为你必须有n个独立的零。如果是这样,那么您可以通过检查找到的每个扩充路径是否添加一个独立的零来检查算法的实现,即使在有其他路径可以找到但却没有找到的情况下也是如此。