【问题标题】:How to restrict certain paths in NetworkX graphs?如何限制 NetworkX 图中的某些路径?
【发布时间】:2011-12-20 11:43:20
【问题描述】:

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

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

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

节点 = [1,2,3,4]

这些边缘:

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

有没有办法阻止/限制 1 -> 2 -> 3 但仍然 允许 2 -> 3 & 1 -> 2。

这意味着:

  • 可以从 1 移动到 2

  • 可以从 2 到 3

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

这可以在 NetworkX 中实现吗?如果不是,Python 中是否有另一个图形库可以实现这一点?

谢谢。

【问题讨论】:

  • 我不知道这是否可以在 NetworkX 中完成,但一个(概念上)简单的方法是监视节点 1,如果使用它,则完全删除节点 3。

标签: python routing path-finding networkx


【解决方案1】:

有趣的问题,我从来没有听说过这个问题,可能是因为我对这个主题没有太多的背景,对 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 和 any_2 是否像 2 一样具有所有传入/传出边,除了 1_2 不会有 1_2->3,而 any_2 不会有 1->any_2?我问这个是因为两条边 1->2 和 2->3 的处理似乎有些不对称。
  • 我想知道的另一件事是,该问题不仅直接允许 1->2->3,而且间接也不允许。在您的设置中,如何禁止 1->2->5->6->7->3->4 之类的路径,以查找从 1 到 4 的路径?该路径间接包括1->2->3。
  • @yosukesabai:好点,我想我解决了你的第一点。关于第二条评论,我将问题解释为仅排除一条没有任何中间节点的受限路径。我不确定中间体的效果如何。
【解决方案2】:

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

  • 启发式设置为一个函数,当它遇到一个与您正在搜索的颜色不同的节点时,它会返回一个 might_as_well_be_infinity
  • weight=less_than_infinity。

【讨论】:

    猜你喜欢
    • 2014-08-26
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2015-10-01
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多