Python 如何在图形中隔离这些(包括图像)路径?

Python 如何在图形中隔离这些(包括图像)路径?,python,graph,networkx,Python,Graph,Networkx,我有一个图,想从中分离出不同的路径。由于我无法用图形术语轻松表达这一点,下面是一个示意图: 在左侧是我的源图的高度简化表示。图中的节点只有两个邻居(显示为蓝色方块)。然后,它有两个以上邻居或正好一个邻居(显示为红点)的相交节点和结束节点 在右侧,用三种不同的颜色编码,是我想要隔离的路径。我想隔离所有连接红点的路径。生成的路径不得交叉(穿过)任何红点。每个边只能是一个不同结果路径的一部分。不应保留任何边(最短路径长度为1) 我相信这是图形世界中一项众所周知的任务。我已经在NetworkX中对图形

我有一个图,想从中分离出不同的路径。由于我无法用图形术语轻松表达这一点,下面是一个示意图:

左侧是我的源图的高度简化表示。图中的节点只有两个邻居(显示为蓝色方块)。然后,它有两个以上邻居或正好一个邻居(显示为红点)的相交节点和结束节点

右侧,用三种不同的颜色编码,是我想要隔离的路径。我想隔离所有连接红点的路径。生成的路径不得交叉(穿过)任何红点。每个边只能是一个不同结果路径的一部分。不应保留任何边(最短路径长度为1)

我相信这是图形世界中一项众所周知的任务。我已经在NetworkX中对图形进行了建模,这是我第一次使用它,但找不到合适的方法来实现这一点。我相信我可以用很难的方式编写代码,但如果有简单快速的方法,我会很乐意使用。谢谢

编辑:在随机浏览NetworkX文档后,我发现了这个方法。我现在的想法是

  • 迭代所有节点并识别红点(邻居数!=2)
  • 对红色圆点成对使用所有\u simple\u path(),收集生成的路径
  • 删除结果路径中的重复数据,扔掉所有包含红点的内容(起点和终点节点除外)
  • 当然,第二步不能很好地扩展。对于约2000个交叉点,这似乎仍然是可能的

    编辑2:所有简单路径似乎都太慢,无法以这种方式使用。

    我建议找到所有直节点(即恰好有两个邻居的节点),然后从这些节点的列表中随机选取一个直节点,并沿着其两条引线到达其两端,从而建立一个所有直路径的列表(第一个非直节点)

    代码:

    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)可以吗
    棒棒糖的圆形被认为是一条圆形的直线路径?我想是的,但一开始我很惊讶,所以我想指出这一点。谢谢!它工作起来很快。:)圆形部分应该可以。令人惊叹的!