我编码的霍顿算法无法正常工作

时间:2019-05-10 03:46:04

标签: python python-3.x networkx graph-theory

我尝试对Horton算法进行编码,以得出无权无向2连通图的最小周期基础。 但是,基础经常覆盖图形的所有边缘。 我猜该程序可以正确设置Horton。 那么如何解决我的代码以使其正常工作?

for v in G.nodes():
    T = BFS_Tree(G,v)
    for x,y in G.edges():
        path_vtox = nx.shortest_path(T,source=v,target=x)
        path_vtoy = nx.shortest_path(T,source=v,target=y)
        if set(path_vtox) & set(path_vtoy) == {v}:
            cycel = []
            for i in range(len(path_vtox)-1):
                cycle.append(path_vtox[i],path_vtox[i+1])
            for i in range(len(path_vtoy)-1):
                cycle.append(path_vtoy[i],path_vtoy[i+1])
            cycle.append((x,y))
            g = nx.Graph()
            g.add_edges_from(cycle)
            try:
                nx.find_cycle(g)
                Cycles.append(cycle)
            except:
                pass

1 个答案:

答案 0 :(得分:0)

感谢您发布问题。

首先,对如何提问和有关您的代码的一些评论: 您应该编写一个独立的示例。这包括工作代码,玩具问题和预期的输出。在您的情况下,我错过了像 import networkx as nx在顶部。同样,您在第2行和第17行引用类BFS_TreeCycles,而之前没有定义它们。 有一个错字。在第7行中,应该说cycle而不是cycel。 最重要的是,我希望能得到一个简短的示例,说明如何定义图G以及如何将其作为代码输出。

现在,即使我可能遗漏了一些概念,我也将尝试谈一谈该算法。 霍顿是否设置了最短长度的循环基础? 通常,假设所有边都是某个周期的一部分,那么当底数可以覆盖图形的所有边时,我看不到任何问题。还是说基础元素覆盖了图形的所有边缘,但应该更短? 我找不到霍顿算法的唯一参考,并假设您是从p实现的。 the original paper中的360。在本参考中,霍顿将算法描述为:

1)找到每对点x,y之间的最小路径P(x,y)

2)对于图中的每个顶点v和边{x,y},创建周期C(v,x,y)= P(v,x)+ P(v,y)+ {x,y },并计算其长度。可以忽略P(v,x)和P(v,y)的顶点共同不同于v的简并情况。

3)按重量排序循环

4)使用贪婪算法从这组循环中找到最小循环基础

在您的代码中,我只看到实现的步骤1)和2)。 3)对于未加权的情况来说是微不足道的,因为每个周期都由其长度加权。但似乎缺少步骤4)。霍顿在参考文献的第362页上提出了解决方案。

我希望这会有所帮助。