两个图在python中是同构的,没有导入吗

两个图在python中是同构的,没有导入吗,python,graph,graph-theory,isomorphism,Python,Graph,Graph Theory,Isomorphism,我正在编写一个函数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

我正在编写一个函数
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) 

我的所有方法目前都检查度序列是否相同,但图可以具有相同的度序列,而不是同构的。我不知道如何从这里完成检查。我不允许导入任何库。非常感谢您的帮助

最简单的可能实现就是对其进行暴力。我们需要在其中一个图中尝试所有可能的起点:

for all start points v1 in G1
    try to find an isomorphism rooted at v1 in G1 to any of v2 in G2
但是第二行是什么意思?!嗯,比如:

for each neighbour i in G1[v1]
    for each neighbour j in G2[v2]
        match(i, j)
请注意,我们还必须跟踪到目前为止已匹配的节点,并在找到匹配后立即返回true

我们可以通过使用度序列来改进事物,在每个图中必须有相同程度的明显顶点,所以只考虑它们作为匹配的候选。 当然,还有更为复杂的算法,但只有在需要速度或有大型图形时,这才真正重要。作为参考,考虑VF2算法:


图同构是一个困难的问题(推测在p和NP完全之间)。整本书都是关于它的。对于您来说,期望在堆栈溢出上描述一个图同构算法是不合理的(尽管针对小型图的某种暴力版本是合理的)。你决定使用什么算法?如果你不知道,研究一下。如果在实现过程中遇到特定的问题,请提出一个问题。所述问题在顶点上使用相同的名称,因此它很容易,并且不适合广义同构类难题。只需直接排序和比较。。。哪个OP已经意识到并尝试去做。@tom10我没有这样理解问题——没有限制说
“A”
只能映射到
“A”
,所以仍然存在
n潜在同构。@JohnColeman:也许我当时误解了。。当问题指出,“……顶点上使用的名称将是相同的”时,这意味着什么@JohnColeman:是的,这是一个有效的定义。我认为问题在于,对“同构”有两种定义。