我正在尝试借助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.
我的问题是,每个图中有多个节点。因此,如何为该函数赋予所有其他属性字典以比较所有其他节点?
答案 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']
,这意味着如果两个节点具有相同的“标签”值,则在匹配过程中它们被视为相等。
类似地,您可以实现希望的任何逻辑,而无需专门处理图形中的每一对节点。