我正在学习使用 networkx python模块来进行二分图的匹配。模块中有两个函数可以提供图形的最大基数匹配:
make
nx.maximal_matching()
请注意,虽然名称为nx.bipartite.maxmum_matching()
,但其文档确实声明了"在图表中找到最大基数匹配。"
由于我的图是二分图,我假设这两个图会给出相同的结果,至少两个边的数量相同。但是我的代码似乎暗示maximal_matching
给出了错误的答案:正如nx.maximal_matching()
建议的那样,可能还有一个边缘。
以下是我的工作代码:
nx.bipartite.maxmum_matching()
这是生成的情节。如图所示,subplot-2有6个边,3个有7.这是networkx的实现中的错误还是我在这里做错了什么?
PS:我的网络版是1.11版本
答案 0 :(得分:2)
networkx.maximal_matching
算法不会以您想要的方式提供最大基数匹配。它实现了一个简单的贪婪算法,其结果纯粹是最大的,因为它不能添加额外的边缘。
对于您想要的全球最大基数匹配,它的对应部分是networkx.max_weight_matching
答案 1 :(得分:1)
根据this bug report的答案,返回的匹配是最大的,而不是最大匹配。在他们的术语中(我不知道这是多么常见)意味着它给出了局部最优而不是全局最优。
因此,对于maximal_matching返回的匹配,仅保证通过向该匹配添加边(但仍然是匹配的)来使其不能变大。但是,不能保证不存在具有更多边缘的匹配。
答案 2 :(得分:0)
在图论的用语中,最大匹配和最大匹配是不同的(即使在二分图中)。最大匹配只是意味着你不能再添加任何边缘,如donkopotamus指出的那样。最大匹配意味着没有匹配的边缘多于它。这就是这些函数的名称。
也就是说,在图论中没有最大基数匹配这样的东西。但不幸的是,文档使用了“最大基数匹配”的措辞。这很容易让人感到困惑;或者更糟糕的是误解了算法的目的。