Networkx:如何在optimize_graph_edit_distance中使用node_match参数?

时间:2019-01-06 17:48:11

标签: python graph networkx

我正在尝试借助NetworkX上的optimize_graph_edit_distance算法比较两个图形:

optimize_graph_edit_distance(G1, G2,
    node_match=None,
    node_subst_cost=None,
    edge_match=None,
    node_del_cost=None,
    edge_subst_cost=None,
    edge_del_cost=None,
    edge_ins_cost=None,
    upper_bound=None)

我以字典的形式给了两个图上的每个节点一定数量的属性,借助node_match,我可以指定在匹配期间是否应将节点N1和N2视为相等。

函数node_match的调用方式应如下:

node_match(G1.nodes[n1], G2.nodes[n2])  >>n1 and n2 are node attribute dictionaries as input. 

我的问题是,每个图中有多个节点。因此,如何为该函数赋予所有其他属性字典以比较所有其他节点?

1 个答案:

答案 0 :(得分:0)

node_match是一个函数,如果在匹配过程中应将G1中的节点n1和G2中的n2视为相等,则返回True。例如:

import networkx as nx
G1 = nx.DiGraph()
G1.add_nodes_from([(0, {'label':'a'}), (1, {'label':'b'}),(2, {'label':'c'})])
G1.add_edges_from([(0,1),(0,2)])

G2 = nx.DiGraph()
G2.add_nodes_from([(3, {'label':'a'}), (4, {'label':'b'}),(5, {'label':'c'})])
G2.add_edges_from([(3,4),(3,5)])

print(G1.nodes())
print(G1.edges())

print(G2.nodes())
print(G2.edges())

for dist in nx.algorithms.similarity.optimize_graph_edit_distance(G1, G2, node_match=lambda a,b: a['label'] == b['label']):
    print(dist)

在这里,即使两个图中的节点标识符不同,距离也将为零。这是因为我们定义了将两个节点进行比较的函数,称为lambda a,b: a['label'] == b['label'],这意味着如果两个节点具有相同的“标签”值,则在匹配过程中它们被视为相等。

类似地,您可以实现希望的任何逻辑,而无需专门处理图形中的每一对节点。