【发布时间】:2018-05-23 01:04:24
【问题描述】:
我正在编写一个函数is_iso(graph1, graph2),它将两个图作为其输入,然后确定这两个图是否同构。
我可以假设这两个图将具有相同数量的顶点,并且顶点上使用的名称将相同。
is_iso({“A” : [“B”, “C”], “B” : [“A”], “C” : [“A”]}, {“A” : [“B”], “B” : [“A”, “C”], “C” : [“B”]}) 应该返回 True
is_iso({“A” : [“B”, “C”], “B” : [“A”, “C”], “C” : [“A”, “B”]}, {“A” : [“B”, “C”], “B” : [“A”], “C” :[“A”]}) 应该返回 False
def is_iso(graph1,graph2):
for vertex in graph1:#loops through every vertex in graph1
seq1 += [len(graph1[vertex])]#adds the degree of each vertex to the list
for vertex in graph2: #loops through every vertex in graph2
seq2 += [len(graph2[vertex])]#adds the degree of each vertex to the list
return sorted(seq1) == sorted(seq2)
我所有的方法目前都检查度数序列是否相同,但图可以具有相同的度数序列并且不是同构的。我不确定如何从这里完成检查。我不允许导入任何库。非常感谢任何帮助!
【问题讨论】:
-
图同构是一个难题(推测在 P 和 NP 完全之间)。整本书都写过它。您期望在 Stack Overflow 上描述图同构算法是不合理的(尽管某些版本的小图蛮力是足够合理的)。你决定使用什么算法?如果你不知道——研究一下。如果您在实施过程中遇到特定问题,请提出问题。
-
上述问题在顶点上使用相同的名称,因此它很容易并且不适合困难问题的广义同构类。只需直接排序和比较... OP 已经实现并尝试做的事情。
-
@tom10 我不这么理解这个问题——没有限制说
"A"只能映射到"A",所以仍然有n!潜在的同构。 -
@JohnColeman:也许我误解了......当问题指出“......顶点上使用的名称将是相同的”时还有什么意思
-
@JohnColeman:是的,这是一个有效的定义。我认为问题在于labeled graphs 的“同构”有两种定义。
标签: python graph graph-theory isomorphism