使用 networkx 对边进行约束的图同构
Graph isomorphism with constraints on the edges using networkx
我想定义我自己的两个图的同构。我想检查两个图是否同构,因为每条边都有一些属性——基本上是放置每条边的顺序。我想知道是否可以使用以下方法:
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
这里具体回答问题中的问题,图表一模一样。请注意,我正在使用 networkx.MultiGraph 并考虑一些 'ordering' 来放置这些边缘。
import networkx as nx
G1,G2,G3,G4=nx.MultiGraph(),nx.MultiGraph(),nx.MultiGraph(),nx.MultiGraph()
G1.add_weighted_edges_from([(0, 1, 0), (0, 2, 1), (0, 3, 2)], weight='ordering')
G2.add_weighted_edges_from([(0, 1, 0), (0, 3, 1), (0, 2, 2)], weight='ordering')
G3.add_weighted_edges_from([(0, 1, 0), (0, 1, 1), (2, 3, 2)], weight='ordering')
G4.add_weighted_edges_from([(0, 1, 0), (2, 3, 1), (0, 1, 2)], weight='ordering')
def comparison(D1,D2):
return D1[0]['ordering'] == D2[0]['ordering']
nx.is_isomorphic(G1,G2, edge_match=comparison)
>True
nx.is_isomorphic(G3,G4, edge_match=comparison)
>False
我想定义我自己的两个图的同构。我想检查两个图是否同构,因为每条边都有一些属性——基本上是放置每条边的顺序。我想知道是否可以使用以下方法:
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
这里具体回答问题中的问题,图表一模一样。请注意,我正在使用 networkx.MultiGraph 并考虑一些 'ordering' 来放置这些边缘。
import networkx as nx
G1,G2,G3,G4=nx.MultiGraph(),nx.MultiGraph(),nx.MultiGraph(),nx.MultiGraph()
G1.add_weighted_edges_from([(0, 1, 0), (0, 2, 1), (0, 3, 2)], weight='ordering')
G2.add_weighted_edges_from([(0, 1, 0), (0, 3, 1), (0, 2, 2)], weight='ordering')
G3.add_weighted_edges_from([(0, 1, 0), (0, 1, 1), (2, 3, 2)], weight='ordering')
G4.add_weighted_edges_from([(0, 1, 0), (2, 3, 1), (0, 1, 2)], weight='ordering')
def comparison(D1,D2):
return D1[0]['ordering'] == D2[0]['ordering']
nx.is_isomorphic(G1,G2, edge_match=comparison)
>True
nx.is_isomorphic(G3,G4, edge_match=comparison)
>False