Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用networkx计算两个多重图形之间的图形编辑距离?_Python_Python 3.x_Networkx - Fatal编程技术网

Python 如何使用networkx计算两个多重图形之间的图形编辑距离?

Python 如何使用networkx计算两个多重图形之间的图形编辑距离?,python,python-3.x,networkx,Python,Python 3.x,Networkx,假设我有两个图G和H: G=nx.multi-digraph() G.add_节点(0,id='a',f='none') G.add_节点(1,id='b',f='k') G.添加_边(0,1,r='bicycle') G.添加边(1,0,r='bicycle\u r') G.添加_边(1,0,r='bicycle_rr') H=nx.multi-digraph() H.add_节点(0,id='a',f='none') H.add_节点(1,id='b',f='k') H.add_边(0,1,

假设我有两个图G和H:

G=nx.multi-digraph()
G.add_节点(0,id='a',f='none')
G.add_节点(1,id='b',f='k')
G.添加_边(0,1,r='bicycle')
G.添加边(1,0,r='bicycle\u r')
G.添加_边(1,0,r='bicycle_rr')
H=nx.multi-digraph()
H.add_节点(0,id='a',f='none')
H.add_节点(1,id='b',f='k')
H.add_边(0,1,r='bicycle')
H.add_边(1,0,r='bicycle_r')
networkx
为我们提供了一个非常简单的api来计算相同类型的两个图形之间的编辑距离,即
nx.graph\u edit\u距离(G,H,node\u match=node\u match,edge\u match=edge\u match)
。对于
node\u match
edge\u match
,我只是将它们定义为所有标签的精确匹配(即
id
f
用于节点,而
r
用于边缘)。这在这里并不重要,因为在我的示例中,两个图之间没有替换操作

G和H之间的编辑距离应为1,因为G在节点1和0之间还有一条边。但是,
nx.graph\u edit\u distance
返回的答案是0。它似乎忽略了两个图节点之间的多条边。我用简单的有向图(即
nx.DiGraph()
)进行了尝试,效果很好。但我真的不知道如何告诉距离计算器考虑删除多条边

我认为当应用于多个图形时,
nx.graph\u edit\u distance
有问题。我试过在多个图上
nx.is_同构
。此函数返回两个图形是否同构(即距离是否为0),并接受与
nx.graph\u edit\u distance
完全相同的输入。它们都有
节点匹配
边缘匹配
。正如文档所建议的那样,
edge\u match
的输入应该是
G1[u1][v1],G2[u2][v2]
,但是,当我检查
nx的
edge\u match
输入时,图形编辑距离和
nx.是否同构,我发现
nx.graph\u edit\u distance
中的
edge\u match
的输入边没有multi-graph中的边形状,而
nx.graph\u edit\u distance中的
edge\u match
的输入边形状是同构的。我认为这可能是networkx的一个严重缺陷

编辑: 我检查了networkx的源代码。现在我很确定这是一只虫子。
edge\u match
的用法与文档中的声明不一致

elif边缘匹配:
C[0:m,0:n]=np.数组([1-int(边匹配(G1.边[g],G2.边[h]))
对于挂起中的g\u g对于挂起中的h\u h]
).重塑(m,n)
下面是我对
节点匹配
边缘匹配
的实现:

def节点匹配(n1,n2):
如果n1['id']==n2['id']和n1['f']==n2['f']:
返回真值
其他:
返回错误
def edge_匹配(e1、e2):
如果e1['r']==e2['r']:
返回真值
其他:
返回错误
def多重边缘匹配(e1、e2):
如果e1.keys()!=e2.keys():
返回错误
对于e1.keys()中的k:
如果e1[k]['r']!=e2[k]['r']:
返回错误
返回真值

请注意,根据文档,对于多图,
edge\u match
不应该起作用,因为在多图中,G[u1][u2]首先由边id索引,因此我定义了
multi\u edge\u match
。但是,
nx.graph\u edit\u distance(G,H,node\u match,multi\u edge\u match)
将导致运行错误。我们只能调用
nx.graph\u edit\u distance(G,H,node\u match,edge\u match)
,然后得到意外的结果。
而对于
nx.is\u同构
,我们只能调用
nx.is\u同构(G,H,node\u match,multi\u edge\u match)
而不是
nx.is\u同构(G,H,node\u match,edge\u match)
,这就是我所期望的。因此,我认为
nx.graph\u edit\u distance
的实现可能不适用于多个图。如果没有错误,至少与文档不一致。

请包括您的
node\u match
edeg\u match
功能。我怀疑问题在于您对这些函数的实现,但如果您不包括它们,我们就无法打折。@spinkus是有道理的。我已经用这些函数更新了我的问题。我正在Python3.7上使用NX2.4。graph\u edit\u distance给出1,有无节点匹配或边匹配,我认为您不需要。