Python 如何在图形中隔离这些(包括图像)路径?
我有一个图,想从中分离出不同的路径。由于我无法用图形术语轻松表达这一点,下面是一个示意图: 在左侧是我的源图的高度简化表示。图中的节点只有两个邻居(显示为蓝色方块)。然后,它有两个以上邻居或正好一个邻居(显示为红点)的相交节点和结束节点 在右侧,用三种不同的颜色编码,是我想要隔离的路径。我想隔离所有连接红点的路径。生成的路径不得交叉(穿过)任何红点。每个边只能是一个不同结果路径的一部分。不应保留任何边(最短路径长度为1) 我相信这是图形世界中一项众所周知的任务。我已经在NetworkX中对图形进行了建模,这是我第一次使用它,但找不到合适的方法来实现这一点。我相信我可以用很难的方式编写代码,但如果有简单快速的方法,我会很乐意使用。谢谢 编辑:在随机浏览NetworkX文档后,我发现了这个方法。我现在的想法是Python 如何在图形中隔离这些(包括图像)路径?,python,graph,networkx,Python,Graph,Networkx,我有一个图,想从中分离出不同的路径。由于我无法用图形术语轻松表达这一点,下面是一个示意图: 在左侧是我的源图的高度简化表示。图中的节点只有两个邻居(显示为蓝色方块)。然后,它有两个以上邻居或正好一个邻居(显示为红点)的相交节点和结束节点 在右侧,用三种不同的颜色编码,是我想要隔离的路径。我想隔离所有连接红点的路径。生成的路径不得交叉(穿过)任何红点。每个边只能是一个不同结果路径的一部分。不应保留任何边(最短路径长度为1) 我相信这是图形世界中一项众所周知的任务。我已经在NetworkX中对图形
def eachStraightPath(g):
straightNodes = { node for node in g.node if len(g.edge[node]) == 2 }
print straightNodes
while straightNodes:
straightNode = straightNodes.pop()
straightPath = [ straightNode ]
neighborA, neighborB = g.edge[straightNode].keys()
while True: # break out later if node is not straight
straightPath.insert(0, neighborA)
if neighborA not in straightNodes:
break
newNeighborA = (set(g.edge[neighborA]) ^ { straightPath[1] }).pop()
straightNodes.remove(neighborA)
neighborA = newNeighborA
while True: # break out later if node is not straight
straightPath.append(neighborB)
if neighborB not in straightNodes:
break
newNeighborB = (set(g.edge[neighborB]) ^ { straightPath[-2] }).pop()
straightNodes.remove(neighborB)
neighborB = newNeighborB
yield straightPath
g = nx.lollipop_graph(5, 7)
for straightPath in eachStraightPath(g):
print straightPath
如果图形非常大,并且不希望在内存中保存一组所有直线节点,则可以迭代这些节点,但检查下一个相邻节点是否为直线节点的可读性将降低(尽管可能更快)。这种方法的真正问题是,您必须引入一个检查,以防止直线路径被多次生成。顺便问一下,在您的规范中,对于
棒棒糖(3,4)可以吗
棒棒糖的圆形被认为是一条圆形的直线路径?我想是的,但一开始我很惊讶,所以我想指出这一点。谢谢!它工作起来很快。:)圆形部分应该可以。令人惊叹的!