我正在尝试使用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中还有另一个允许这个图形库的图形库吗?
感谢。
答案 0 :(得分:4)
有趣的问题,我从来没有听说过这个问题,可能是因为我没有太多关于这个主题的背景知识,也没有太多关于NetworkX的经验。但是,我确实对算法有所了解。这可能只是最天真的方式,我很高兴听到一个更聪明的算法。
我们的想法是,您可以使用限制规则将图形转换为所有边有效的新图形,使用以下算法。
路径限制(1,2,3)可以分为两个规则:
要将其放入图表中,您可以为每种情况插入节点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()方法设置