networkx maximal_matching()不返回最大匹配

时间:2017-05-21 07:14:02

标签: python graph networkx matching bipartite

我正在学习使用 networkx python模块来进行二分图的匹配。模块中有两个函数可以提供图形的最大基数匹配:

  1. make
  2. nx.maximal_matching()
  3. 请注意,虽然名称为nx.bipartite.maxmum_matching(),但其文档确实声明了"在图表中找到最大基数匹配。"

    由于我的图是二分图,我假设这两个图会给出相同的结果,至少两个边的数量相同。但是我的代码似乎暗示maximal_matching给出了错误的答案:正如nx.maximal_matching()建议的那样,可能还有一个边缘。

    以下是我的工作代码:

    nx.bipartite.maxmum_matching()

    这是生成的情节。如图所示,subplot-2有6个边,3个有7.这是networkx的实现中的错误还是我在这里做错了什么?

    PS:我的网络版是1.11版本

    enter image description here

3 个答案:

答案 0 :(得分:2)

networkx.maximal_matching算法不会以您想要的方式提供最大基数匹配。它实现了一个简单的贪婪算法,其结果纯粹是最大的,因为它不能添加额外的边缘。

对于您想要的全球最大基数匹配,它的对应部分是networkx.max_weight_matching

答案 1 :(得分:1)

根据this bug report的答案,返回的匹配是最大的,而不是最大匹配。在他们的术语中(我不知道这是多么常见)意味着它给出了局部最优而不是全局最优。

因此,对于maximal_matching返回的匹配,仅保证通过向该匹配添加边(但仍然是匹配的)来使其不能变大。但是,不能保证不存在具有更多边缘的匹配。

答案 2 :(得分:0)

在图论的用语中,最大匹配和最大匹配是不同的(即使在二分图中)。最大匹配只是意味着你不能再添加任何边缘,如donkopotamus指出的那样。最大匹配意味着没有匹配的边缘多于它。这就是这些函数的名称。

也就是说,在图论中没有最大基数匹配这样的东西。但不幸的是,文档使用了“最大基数匹配”的措辞。这很容易让人感到困惑;或者更糟糕的是误解了算法的目的。