【问题标题】:Symmetric Bipartite Matching of Elements in List列表中元素的对称二分匹配
【发布时间】:2017-08-05 06:39:09
【问题描述】:

从一个随机的整数列表开始,比如:

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

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

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

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

然后将其视为二分匹配问题如果 A[m] 匹配 B[n],则 A[n] 也必须匹配 B[m](再次,除了上面的匹配约束)。我想由此产生的流网络的可视化将是水平对称的(即沿源汇轴,因此是标题)。

我知道如何使用 MaxFlow 解决二分匹配问题,但不知道如何实现最后一个粗体约束。任何帮助都会非常,嗯,很有帮助。

【问题讨论】:

    标签: python algorithm optimization graph-theory matching


    【解决方案1】:

    附加约束(如果A[m] 匹配B[n]A[n] 也必须匹配B[m])从根本上改变了问题的性质。事实上,这个约束破坏了输入图的二分性,实际上把它变成了一个一般的无向图。因此,您正在寻找的是一种在一般图中找到最大匹配的算法。

    这个问题可以使用Edmonds Algorithm 来解决,它展示了一种与二分情况的最大流量解决方案不同的方法(尽管它确实使用了增广路径的概念)。该算法利用了二分匹配可以很容易解决的事实,并且在某种程度上尝试通过折叠奇数循环将输入图变成二分图(图是二分图当且仅当它没有奇数循环并且因此数图中的奇数循环测量输入图远非二分的程度)。上面的链接很好地解释了算法的具体工作原理。

    这里是a Python implementation of the algorithm。该算法对于稀疏图相当有效,但对于密集图效率不高。图的密度取决于有多少对条目 m, n 满足条件 (m + n) / gcd(m, n) 是 2 的幂。如果大多数对满足条件,则运行时间约为 O(n^4)。一般来说,运行时是O(E•V^2)

    【讨论】:

    【解决方案2】:

    结果证明这根本不是二分匹配问题,而是更一般的“非二分最大匹配”类。 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/

    祝未来的读者好运!

    【讨论】:

      猜你喜欢
      • 2016-11-25
      • 2017-10-23
      • 2018-04-15
      • 2018-02-03
      • 2018-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-16
      相关资源
      最近更新 更多