我试图使用匈牙利算法的以下实现:http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=hungarianAlgorithm。
我想修改此算法,以便我可以将一个集合与自身配对。也就是说,如果" a"分配给" b," " B"也被分配到" a。"我唯一的想法是改变以下内容。
for (int cx = x, cy = y, ty; cx != -2; cx = prv[cx], cy = ty)
{
yx[cy] = cx;
xy[cx] = cy;
}
以下内容:
for (int cx = x, cy = y, ty; cx != -2; cx = prv[cx], cy = ty)
{
yx[cy] = cx; yx[cx]=cy;
xy[cx] = cy; xy[cy]=cx;
}
因此算法总是检查配对是相互的路径。但是,我相当肯定这是错误的 - 代码通常是段错误的。
我尝试通过将if (max_match == n)
更改为更宽松的约束来解决问题,例如if (max_match >= n-1)
,以便算法满足于亚完美匹配。这有时会起作用,当它发生时,它会像我想要的那样创建一些相互对,但是有些顶点是未配对的。并且仍存在分段错误。
那么,有什么方法可以解决这个问题吗?还有其他更合适的算法吗?
答案 0 :(得分:0)
我认为你想要的是一个非二分图的最大匹配版本。在http://en.wikipedia.org/wiki/Blossom_algorithm有一个针对此描述的算法,最后一段讨论了加权情况。您希望最小成本匹配,但每个最大匹配具有相同的边数,因此如果您否定每个链接的成本,或从某个非常大的常量中减去成本,则将最小值转换为最大值。
一般的最大问题是足够恒定的,我认为你将难以得到匈牙利算法,因为如果你能用匈牙利算法做到这一点,人们就不会发现一般问题如此复杂。
答案 1 :(得分:0)
我不知道为什么你不能在“普通”匈牙利算法的两侧使用相同的集合,并在每个元素与自身的配对上分配“无限”。这将为您提供最大的配对,并保证没有人与自己匹配。
答案 2 :(得分:0)
这个问题被称为最优非二分匹配。经典参考是: DERIGS,U。(1988)。用最短路径技术解决非二分类匹配问题。运筹学年鉴13,225-261。 对于小型集合,更简单的方法可能就足够了。看到: https://gis.stackexchange.com/questions/179559/how-to-group-10k-points-into-closest-pairs 有一个R包nbpMatching可以解决这个问题。
顺便提一下,如果您只是尝试使用二分匹配算法并对与自己配对施加重罚,那么您就不能始终如一地进行配对。原因是更优化的安排可以是A与B' B配对,与C'和C搭配A'或类似的安排。