我正在使用图编辑距离;根据定义,它是将原始图G1转换成同构于G2的最小花费总和;
图编辑操作通常包括:
- 插入顶点以向图中引入单个标记顶点; - 删除顶点以从图中删除单个(常常是不相关的)顶点; - 顶点替换以更改给定顶点的标签(或颜色); - 插入边以在一对顶点之间引入新的彩色边; - 删除边以从一对顶点之间移除单条边; - 边替换以更改给定边的标签(或颜色)。
现在我想要使用networkx提供的实现 - 我没有任何边标签,G1和G2的节点集合相同,而且我不想要同构于G2的图,我想要的是G2本身;
这主要是因为G1:1->2->3和G2: 3->2->1 在同构上是等价的,但如果节点代表某些事件,则从因果关系的角度来看,它们非常不同;
因此,在这种情况下,我一直在运行类似以下的测试:
图编辑操作通常包括:
- 插入顶点以向图中引入单个标记顶点; - 删除顶点以从图中删除单个(常常是不相关的)顶点; - 顶点替换以更改给定顶点的标签(或颜色); - 插入边以在一对顶点之间引入新的彩色边; - 删除边以从一对顶点之间移除单条边; - 边替换以更改给定边的标签(或颜色)。
现在我想要使用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)
但是它返回距离为零,这是有道理的,因为这两个图是同构的;
所以我尝试设置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)
如果我们假设删除或添加边缘/顶点的成本为1,则编辑距离应为4,因为我们可以:
- 删除G中的两个边,添加G2的两个边
如何计算编辑距离而不考虑同构而仅考虑等价性将更加合适?