从随机的整数列表开始,例如:
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解决二分匹配问题,但无法弄清楚如何实现最后一个粗体约束。任何帮助都会非常,呃,乐于助人。
答案 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/
祝未来的读者好运!