我尝试对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
答案 0 :(得分:0)
感谢您发布问题。
首先,对如何提问和有关您的代码的一些评论:
您应该编写一个独立的示例。这包括工作代码,玩具问题和预期的输出。在您的情况下,我错过了像
import networkx as nx
在顶部。同样,您在第2行和第17行引用类BFS_Tree
和Cycles
,而之前没有定义它们。
有一个错字。在第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页上提出了解决方案。
我希望这会有所帮助。