列表中元素的对称二分匹配

时间:2017-03-14 18:53:14

标签: python algorithm optimization graph-theory matching

从随机的整数列表开始,例如:

list = [2,5,7,1,3]

目标:最大限度地将列表中的每个条目与列表中的另一个条目配对。如果log_base_2((m + n)/ gcd(m,n))不是整数,则可以匹配值(m,n)的条目。即(7,3)是有效匹配,(1,3)不是。

我很确定这样做的一种方法是生成两个列表A和B,相当于初始列表:

A=B=list=[2,5,7,1,3]

然后将其视为一个双向匹配问题,附加约束条件是如果A [m]与B [n]匹配,那么A [n]也必须匹配B [m] (再次,除了上面的匹配约束)。我可以想象,所得流网络的可视化将是水平对称的(即沿着源 - 宿轴,因此是标题)。

我知道如何使用MaxFlow解决二分匹配问题,但无法弄清楚如何实现最后一个粗体约束。任何帮助都会非常,呃,乐于助人。

2 个答案:

答案 0 :(得分:1)

附加约束(如果A[m]匹配B[n],则A[n]也必须匹配B[m])从根本上改变问题的性质。实际上,该约束破坏了输入图的二分性,实际上将其转换为一般的无向图。因此,您正在寻找的是一种在一般图表中查找最大匹配的算法。

问题可以使用Edmonds Algorithm来解决,a Python implementation of the algorithm表现出与二分情形的最大流解决方案不同的方法(尽管它确实使用了增广路径的概念)。该算法利用了这样一个事实,即二分匹配可以很容易地解决,并且在某种程度上可以通过折叠奇数周期将输入图形转换为二分图(当且仅当它没有奇数周期且因此数字时,图形是二分的)图中的奇数周期测量输入图远远不是二分的程度。有关算法精确工作原理的详细信息,请参见上面的链接。

这是http://www.cs.bilkent.edu.tr/~guvenir/courses/CS101/op_precedence.html。该算法对于稀疏图是相当有效的,但对于密集图不是非常有效。图表的密度取决于有多少条对m, n满足条件(m + n) / gcd(m, n)是2的幂。如果大多数对满足条件,则运行时将约为O(n^4)。通常,运行时为O(E•V^2)

答案 1 :(得分:0)

事实证明这根本不是一个二分匹配问题 - 相反,它是更为一般的“非二分最大匹配”类。 Edmonds/'Blossom' algorithm提供解决方案(Snakile's answer pointed this out)。

经过一番搜索后,我找到了一个简单的Edmonds /'Blossom'算法实现,我用它来完成: http://code.activestate.com/recipes/221251-maximum-cardinality-matching-in-general-graphs/

它利用了Guido Van Rossum非常直观的Graph结构: https://www.python.org/doc/essays/graphs/

祝未来的读者好运!