如何限制NetworkX图中的某些路径?

时间:2011-11-02 16:20:30

标签: python routing path-finding networkx

我正在尝试使用Dijkstra和A Star算法(在有向NetworkX图中)计算2点之间的最短路径。

目前它工作正常,我可以看到计算出的路径,但我想找到一种方法限制某些路径

例如,如果我们有以下节点:

nodes = [1,2,3,4]

有了这些边缘:

edges =((1,2),(2,3),(3,4))

是否有阻止/限制 1 - >的方法2 - > 3 但仍允许2 - > 3& 1 - > 2

这意味着:

  • 可以从1到2

  • 旅行
  • 可以从2行进3

  • 不能直接或间接从1到3 ..(即限制1-> 2-> 3路径)。

这可以在NetworkX中实现..如果没有,Python中还有另一个允许这个图形库的图形库吗?

感谢。

2 个答案:

答案 0 :(得分:4)

有趣的问题,我从来没有听说过这个问题,可能是因为我没有太多关于这个主题的背景知识,也没有太多关于NetworkX的经验。但是,我确实对算法有所了解。这可能只是最天真的方式,我很高兴听到一个更聪明的算法。

我们的想法是,您可以使用限制规则将图形转换为所有边有效的新图形,使用以下算法。

路径限制(1,2,3)可以分为两个规则:

  • 如果你过来(1,2)然后删除(2,3)
  • 如果你离开(2,3)然后删除(1,2)

要将其放入图表中,您可以为每种情况插入节点2的副本。我将在相应情况下的有效边缘之后调用新节点 1_2 2_3 。对于两个节点,您将复制所有传入和传出边缘减去限制边缘。

例如:

Nodes = [1,2,3,4]
Edges = [(1,2),(2,3),(4,2)]

有效路径应仅为4-> 2-> 3而不是1-> 2-> 3。所以我们扩展图表:

Nodes = [1,1_2,2_3,3,4] # insert the two states of 2
Edges = [ # first case: no (1_2,3) because of the restriction 
          (1,1_2), (4, 1_2)
          # 2nd case, no (1,2_3)
          (2_3,3), (4,2_3)]

此图表中唯一有效的路径是4-> 2_3-> 3。这简单地映射到原始图中的4-> 2-> 3。

我希望如果你找不到现有的解决方案,这个答案至少可以帮助你。较长的限制规则会使状态节点数量呈指数级增长,因此该算法过于简单,或者问题很难; - )

答案 1 :(得分:2)

您可以为节点1设置节点数据{color = ['blue']},节点2具有{color = ['red','blue']},node3具有{color = ['red']} 。然后使用networkx.algorithms。 astar_path()方法设置

  • 启发式设置为一个函数,当遇到一个没有你要搜索的相同颜色的节点时,它返回一个might_as_well_be_infinity
  • 重量= less_than_infinity。