我想定义我自己的两个图的同构。我想检查两个图是否同构,因为每条边都有一些属性——基本上是放置每条边的顺序。我想知道是否可以使用以下方法:
networkx.is_isomorphic(G1,G2, edge_match=some_callable)
通过某种方式定义函数some_callable()
。
例如,下面的图是同构的,因为您可以重新标记节点以从另一个节点获取一个节点。
即重新标记[2<->3]。
但是,下面的图不是同构的。
无法通过重新标记节点来从另一个节点获取一个节点。
最佳答案
给你。这正是 edge_match
选项的用途。我将创建 3 个图,前两个是同构的(即使权重具有不同的名称 --- 我已经设置了比较函数来解释这一点)。第三个不是同构的。
import networkx as nx
G1 = nx.Graph()
G1.add_weighted_edges_from([(0,1,0), (0,2,1), (0,3,2)], weight = 'aardvark')
G2 = nx.Graph()
G2.add_weighted_edges_from([(0,1,0), (0,2,2), (0,3,1)], weight = 'baboon')
G3 = nx.Graph()
G3.add_weighted_edges_from([(0,1,0), (0,2,2), (0,3,2)], weight = 'baboon')
def comparison(D1, D2):
#for an edge u,v in first graph and x,y in second graph
#this tests if the attribute 'aardvark' of edge u,v is the
#same as the attribute 'baboon' of edge x,y.
return D1['aardvark'] == D2['baboon']
nx.is_isomorphic(G1, G2, edge_match = comparison)
> True
nx.is_isomorphic(G1, G3, edge_match = comparison)
> False
关于python - 使用networkx对边进行约束的图同构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58096816/