当前位置: 首页 > 知识库问答 >
问题:

比较两个边和节点上有属性的小有向图

公西凯捷
2023-03-14

我想比较两个较小的有向python igraph图,包括边或节点上的所有属性及其值,以及边的方向。python igraph包中有这样的函数吗?

我看到了G1.isomorphic(G2)和相关的,但是它们似乎不适用于属性,也不适用于边缘的方向性

例子:

import igraph as ig
G1=ig.Graph(directed=True)
G2=ig.Graph(directed=True)
G1.add_vertices(2)
G2.add_vertices(2)
G1.vs[0]['gaga'] = 'gugu'
G2.vs[0]['gaga'] = 'gogo'
G1.add_edge(0,1)
G2.add_edge(1,0)

print G1.isomorphic_vf2(G2)
>>>True 

共有1个答案

仰翔
2023-03-14

您可以使用节点_compat_fn边_compat_fn参数将自定义比较函数传递给方法同构_vf2。从文件中:

node_compat_fn-一个函数,接收两个图和两个节点索引(一个来自第一个图,一个来自第二个图),如果两个索引给出的节点兼容(即它们可以相互匹配),则返回True,否则返回False。这可以用于基于节点特定的标准来限制同构集,这些标准太复杂,无法用节点颜色向量(即color1和color2参数)来表示。“无”表示每个节点都与其他节点兼容。

edge_compat_fn——一个函数,接收两个图和两个边索引(一个来自第一个图,一个来自第二个图),如果两个索引给出的边兼容(即它们可以相互匹配),则返回True,否则返回False。这可用于限制基于边缘特定标准的同构集,这些标准太复杂,无法用边缘颜色向量表示(即边缘颜色1和边缘颜色2参数)。“无”表示每条边都与其他节点兼容。

例子:

import igraph as ig
G1=ig.Graph(directed=True)
G2=ig.Graph(directed=True)
G1.add_vertices(2)
G2.add_vertices(2)
G1.vs[0]['gaga'] = 'gugu'
G2.vs[0]['gaga'] = 'gogo'
G1.add_edge(0,1)
G2.add_edge(1,0)

print G1.isomorphic_vf2(G2)

def cmp_nodes(g1, g2, i1, i2):
    return g1.vs[i1]['gaga'] == g2.vs[i2]['gaga']

print G1.isomorphic_vf2(G2, node_compat_fn=cmp_nodes)

下面是这个确切功能的包含单元测试

 类似资料:
  • 一个简单的背景:我正在构建一个语义图,使用带有邻接表的BGL有向图: 我需要做的事情之一,是处理一个较小的图(子图)到我的主图。 暗示我的lambda捕获参数应该是一对(我猜是一个实际的边?)。 所以,我的问题是:我怎样才能发现在顶点的外边中是否存在类似的边呢?

  • 我必须在这个图上执行一些任务。1)找到所有没有后继的顶点。2)给没有后继的顶点赋值。(我可以用顶点属性来做这件事)。3)回溯图并用子节点的最小值更新每一层的所有父节点(甚至是中间父节点)。 例如, 根据上面的DAG,顶点{2,5,6,7}没有任何后继或外边。假设我将分别为顶点{2,5,6,7}赋值{3,2,4,6}。

  • 问题内容: 我想比较两个JSON字符串,它们是一个巨大的层次结构,并且想知道它们的值在哪里不同。但是某些值是在运行时生成的,并且是动态的。我想从比较中忽略那些特定的节点。 我目前正在使用来自 org.SkyScreamer的JSONAssert 进行比较。它为我提供了不错的控制台输出,但没有忽略任何属性。 对于前。 现在这是动态的,应该忽略。就像是 如果有人建议使用JSONAssert解决方案,那

  • 为什么结构体作为map的值,不能通过map[key].成员属性 = "Xxx" 这种赋值 package main import "fmt" type Test struct { Name string } var list map[string]Test func main() { list = make(map[string]Test) name := Test

  • 问题内容: 我想使用XStream将对象序列化为这种形式的XML。 节点( 文本 )的值是序列化对象以及 att 属性上的字段。无需为此对象编写转换器就可以吗? 谢谢! 问题答案: 写一个转换器,应该类似于代码片段 在使用XStream时,注册转换器

  • 我有一个算法来寻找有向图从一个顶点u到任何其他顶点的边,它具有O(V+E)的时间复杂度(基于DFS)。我必须开发一个算法来找到O(VE)中任意两个顶点u和v之间的边。 你有什么建议或暗示来实现这一点吗? 如果我对每个顶点重复dfs-visite,那么只有第一次顶点是白色的,接下来的调用将不起作用。如果我在做之前重置颜色,那么算法将是O(v^2+VE)。 提前谢谢你!