我开始与IDE Jupyter &&的Python 3.6工作,并在问题已经提出。 我通过IDE中,彼得森子汉弥尔顿路径来绘制,但我不知道该怎么做。
我显示有关所述图信息:
- 彼得森图: https://en.wikipedia.org/wiki/Petersen_graph
- Hypohamiltonian图: https://en.wikipedia.org/wiki/Hypohamiltonian_graph
任何想法如何,您可以进行评论?
非常感谢你。
我开始与IDE Jupyter &&的Python 3.6工作,并在问题已经提出。 我通过IDE中,彼得森子汉弥尔顿路径来绘制,但我不知道该怎么做。
我显示有关所述图信息:
任何想法如何,您可以进行评论?
非常感谢你。
为了计算Petersen图的Hamilton图,我们可以使用该解决方案从这个答案
petersen = {1: [2,5,6], 2: [3,1,7], 3: [4,2,8], 4: [5,3,9], 5: [1,4,10],
6: [1,8,9], 7:[2,9,10], 8: [3,10,6], 9: [4,6,7], 10: [5,7,8]}
我忘了Petersen图是否是同构于任何其顶点排列的,所以我会认为他们不是。 因此,而不是搜索对形成我们将添加连接到原始图的每个顶点两个新的顶点路径的两端顶点。 因此,如果在原始图中存在哈密尔顿路径,它会在这个扩展的图中存在 - 只是切断了两个额外的顶点(-1)和(-2)。
# Add two new vertices (-1) and (-2)
for k in petersen:
petersen[k].append(-1)
petersen[k].append(-2)
petersen[-1] = list(range(1,11))
petersen[-2] = list(range(1,11))
现在,我们可以从申请职位的算法:
def find_all_paths(graph, start, end, path=[]):
path = path + [start]
if start == end:
return [path]
if not start in graph:
return []
paths = []
for node in graph[start]:
if node not in path:
newpaths = find_all_paths(graph, node, end, path)
for newpath in newpaths:
paths.append(newpath)
return paths
for path in find_all_paths(petersen, -1, -2):
if len(path) == len(petersen):
print(path[1:-1])
[1, 2, 3, 4, 5, 10, 7, 9, 6, 8]
[1, 2, 3, 4, 5, 10, 8, 6, 9, 7]
[1, 2, 3, 8, 6, 9, 4, 5, 10, 7]
[1, 2, 3, 8, 6, 9, 7, 10, 5, 4]
[1, 2, 7, 9, 6, 8, 3, 4, 5, 10]
[1, 2, 7, 9, 6, 8, 10, 5, 4, 3]
...
由于该算法返回给定顶点之间的所有路径的列表中,我们将它们过滤只有汉弥尔顿路径,切断多余的顶点。
当然,这可能是更有效的,但我离开的优化,无论你或别人。 对于这样一个小图彼得森它的工作速度不够快在我看来。
画画
我们随机选择一个路径,并将其存储在ham_path
变量。
import random
ham_paths = [path[1:-1] for path in find_all_paths(petersen, -1, -2)
if len(path) == len(petersen)]
ham_path = random.choice(ham_paths)
然后,我们将使用networkx
包绘制图形和选择的道路。
import networkx
g = networkx.Graph()
for k, vs in petersen.items():
for v in vs:
if v in [-1, -2] or k in [-1, -2]:
continue
if abs(ham_path.index(k) - ham_path.index(v)) == 1:
g.add_edge(k,v, color='red', width=1.5)
else:
g.add_edge(k,v, color='black', width=0.5)
我们创建了一个networkx
图表,每一个在哈密尔顿路径边缘会被用红色和大胆。 在另一方面,每隔边缘会更薄和黑色。 我们也不希望我们的图中额外的顶点。
pos = networkx.circular_layout(g)
edges = g.edges()
colors = [g[u][v]['color'] for u,v in edges]
widths = [g[u][v]['width'] for u,v in edges]
networkx.draw(g, pos, edges=edges, edge_color=colors, width=widths)