NetworkX-在断开的图中计算最大匹配项

时间:2019-02-25 17:15:44

标签: python networkx bipartite

我有两个二部图G和B,它们都有完全相同的节点,但边数不同。当我尝试在G(边缘数量较少)上运行nx.bipartite.maximum_matching时,出现错误Disconnected graph: Ambiguous solution for bipartite sets.,这与我之前收到的错误类似。

这里是G.nodes(data='True')

[(0, {'bipartite': 0}), (1, {'bipartite': 0}), (2, {'bipartite': 0}),
 (3, {'bipartite': 0}), (4, {'bipartite': 0}), (5, {'bipartite': 0}),
 (6, {'bipartite': 0}), (7, {'bipartite': 0}), (8, {'bipartite': 0}),
 (9, {'bipartite': 0}), (10, {'bipartite': 1}), (11, {'bipartite': 1}),
 (12, {'bipartite': 1}), (13, {'bipartite': 1}), (14, {'bipartite': 1}),
 (15, {'bipartite': 1}), (16, {'bipartite': 1}), (17, {'bipartite': 1}),
 (18, {'bipartite': 1}), (19, {'bipartite': 1})]

,它与B.nodes(data='True')相同。如您所见,两组节点的颜色是相同的。

以下是G的边缘:

[(0, 18), (1, 12), (2, 15), (3, 16), (3, 10), (4, 19), (5, 17),
 (5, 13), (6, 10), (6, 11), (7, 15), (8, 14), (9, 14)]

和B的边缘:

[(0, 18), (1, 12), (2, 12), (2, 15), (3, 16), (3, 10), (3, 18), (4, 19),
 (5, 17), (5, 13), (6, 10), (6, 11), (6, 18), (6, 13), (7, 18), (7, 19),
 (7, 15), (8, 10), (8, 14), (9, 14)]

其中G.edgesB.edges的子集。

我想找到nx.bipartite.maximum_matching(G)。我假设G无疑是二分的,因为其颜色已在其数据中指定。每个顶点都是某个边缘的一部分。

我不确定我在这里缺少什么连通性。

谢谢。

1 个答案:

答案 0 :(得分:1)

问题是您的图形未连接。例如,如果您查看节点118,它们可以属于任何一个集合(只要它们不在同一集合中)。 bipartite函数未考虑节点的bipartite属性。这在documentation中突出显示。以下是最相关的部分(我个人强调):

  

NetworkX没有自定义的二部图类,但是Graph()或DiGraph()类可用于表示二部图。但是,您必须跟踪每个节点属于哪个集合,并确保同一集合的节点之间没有边缘。 NetworkX中使用的约定是使用名为bipartite的节点属性(其值为0或1)来标识每个节点所属的集合。 双向函数的源代码中未强制执行此约定,但这只是一个建议。

     

...

     

但是,如果未连接输入图,则可能有不止一种颜色。这就是为什么我们要求用户传递一个包含一个二分节点集的所有节点的容器作为大多数二分函数的参数的原因。

但是,您可以显式声明属于一组的节点。使用参数top_nodes

u = [n for n in G.nodes if G.nodes[n]['bipartite'] == 0]
nx.bipartite.maximum_matching(G, top_nodes=u)