编程语言
首页 > 编程语言> > python-networkx maximal_matching()不返回最大匹配

python-networkx maximal_matching()不返回最大匹配

作者:互联网

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

> nx.maximal_matching()
> nx.bipartite.maxmum_matching()

请注意,尽管其名称为maximal_matching,但其doc确实声明“在图中找到最大基数匹配”.

由于我的图是二分图,因此我假设这2个图将给出相同的结果,至少两个都具有相同的边数.但是我的代码似乎建议nx.maximal_matching()给出错误的答案:正如nx.bipartite.maxmum_matching()所建议的那样,可能还有一个优势.

下面是我的工作代码:

import networkx as nx
from networkx import bipartite    

def plotGraph(graph,ax,title):    
    pos=[(ii[1],ii[0]) for ii in graph.nodes()]
    pos_dict=dict(zip(graph.nodes(),pos))
    nx.draw(graph,pos=pos_dict,ax=ax,with_labels=True)
    ax.set_title(title)
    return   

if __name__=='__main__':    
    #---------------Construct the graph---------------
    g=nx.Graph()
    edges=[
            [(1,0), (0,0)],
            [(1,0), (0,1)],
            [(1,0), (0,2)],
            [(1,1), (0,0)],
            [(1,2), (0,2)],
            [(1,2), (0,5)],
            [(1,3), (0,2)],
            [(1,3), (0,3)],
            [(1,4), (0,3)],
            [(1,5), (0,2)],
            [(1,5), (0,4)],
            [(1,5), (0,6)],
            [(1,6), (0,1)],
            [(1,6), (0,4)],
            [(1,6), (0,6)]
            ]

    for ii in edges:
        g.add_node(ii[0],bipartite=0)
        g.add_node(ii[1],bipartite=1)

    g.add_edges_from(edges)

    #---------------Use maximal_matching---------------
    match=nx.maximal_matching(g)    
    g_match=nx.Graph()
    for ii in match:
        g_match.add_edge(ii[0],ii[1])

    #----------Use bipartite.maximum_matching----------
    match2=bipartite.maximum_matching(g)    
    g_match2=nx.Graph()
    for kk,vv in match2.items():
        g_match2.add_edge(kk,vv)

    #-----------------------Plot-----------------------
    import matplotlib.pyplot as plt
    fig=plt.figure(figsize=(10,8))

    ax1=fig.add_subplot(2,2,1)
    plotGraph(g,ax1,'Graph')

    ax2=fig.add_subplot(2,2,2)
    plotGraph(g_match,ax2,'nx.maximal_matching()')

    ax3=fig.add_subplot(2,2,3)
    plotGraph(g_match2,ax3,'bipartite.maximum_matching()')

    plt.show()

这是生成的图.如图所示,子图2具有6条边,而3具有7条边.这是networkx实施中的错误,还是我在这里做错了什么?

PS:我的networkx是1.11版

enter image description here

解决方法:

networkx.maximal_matching算法没有按照您期望的方式提供最大基数匹配.它实现了一个简单的贪心算法,其结果纯粹是在没有其他边缘可以添加的意义上最大化的.

对于您打算进行的全局最大基数匹配,它的对应项是networkx.max_weight_matching

标签:matching,graph,networkx,bipartite,python
来源: https://codeday.me/bug/20191111/2019261.html