我正在使用图形编辑距离;根据定义,将原图G1变换成与G2同构的图的最小成本和;
图形编辑操作通常包括:
现在我想使用networkx的实现 - 我没有任何边标签,G1和G2的节点集是相同的,我不想要与G2同构的图,但我想要G2本身;
这主要是因为G1:1->2->3和G2:3->2->1是同构的,但如果节点代表一些事件,从因果关系的角度来看,它们是非常非常不同的;
因此,在这种情况下,我一直在运行如下测试:
import networkx as nx
G=nx.DiGraph()
G.add_node(1)
G.add_node(2)
G.add_node(3)
G.add_edges_from([(1, 2),(2,3)])
G2=nx.DiGraph()
G2.add_node(1)
G2.add_node(2)
G2.add_node(3)
G2.add_edges_from([(3, 2),(2, 1)])
nx.graph_edit_distance(G,G2)
Run Code Online (Sandbox Code Playgroud)
但它返回距离为零,这是有道理的,因为图彼此同构;
所以我尝试设置node_match但仍然没有成功
import networkx as nx
def nmatch(n1, n2):
return n1==n2
G=nx.DiGraph()
G.add_node(1)
G.add_node(2)
G.add_node(3)
G.add_edges_from([(1, 2),(2,3)])
G2=nx.DiGraph()
G2.add_node(1)
G2.add_node(2)
G2.add_node(3)
G2.add_edges_from([(3, 2),(2, 1)])
nx.graph_edit_distance(G,G2, node_match=nmatch)
Run Code Online (Sandbox Code Playgroud)
如果我们假设删除或添加边/顶点的成本为 1,则编辑距离应为 4,因为我们可以:
在不考虑同构但真正等价的情况下计算编辑距离如何合适?