条件networkx路径查找

时间:2015-09-25 03:21:58

标签: python python-2.7 graph-theory networkx

我已经尽可能广泛地提出了问题标题,但以下是一个特殊的问题,它说明了我试图解决的实际问题。

假设gnetworkx.MultiGraph,其中每条边都是红色或蓝色。一个函数看起来像是g和两个节点,并有效地找到满足以下两个条件的路径:

  1. 第一个和最后一个边是红色,
  2. 沿路径的边缘颜色交替显示红色,蓝色,红色,蓝色......
  3. 注意:标准是这样的,路径可能不是标准networkx寻路函数返回的简单路径[s]的子集,因此不可能简单地过滤结果事后networkx.all_paths

    示例

    问题:在下图中,根据上面给出的条件,找到从ba的路径。

    A coloured multigraph

    Code to create such a graph.

    答案:bBAa,bBBbAa等。(bAa较短但不符合标准。)

    一个小例子

    问题:在下图中,根据上面给出的条件,找到从aa的路径。

    enter image description here

    答案:aAAa。

2 个答案:

答案 0 :(得分:1)

制作两个节点副本:X版本和Y版本。对于原始图形中a到b的每个红色边缘,将X_a连接到Y_b,将X_b连接到Y_a。同样,对于原始图形中从a到b的每个蓝色边缘,将Y_a连接到X_b,将Y_b连接到X_a。然后,要查找a和b之间所需的所有路径,请在X_a和Y_b之间找到所有简单路径(使用networkx的{​​{1}})。

例如,您问题中的路径实际上是:X_a - > Y_A - > X_A - > Y_A

all_simple_paths

打印

import networkx as nx


def bidirectional(l):
    for a, b in l:
        yield a, b
        yield b, a

red_edges = [('X' + a, 'Y' + b)
             for a, b in bidirectional(['bB', 'aA', 'cC'])]
blue_edges = [('Y' + a, 'X' + b)
              for a, b in bidirectional(
                      ['bA', 'BA', 'AA', 'BB', 'AC', 'BC', 'Bc', 'CC', 'Ca'])]

G = nx.DiGraph(red_edges + blue_edges)
paths = ["".join([n[1]
                  for n in path])
         for path in nx.all_simple_paths(G, 'Xb', 'Ya')]
print(paths)

请注意,我最终使用有向图来保持红色和蓝色链接之间的区别。

答案 1 :(得分:0)

我不能给你确切的答案。但是,我可以告诉你,你不能使用dijkstra。 Dijkstra的算法可以确定边缘成本值。激烈的操作是可交换的(顺序无关紧要)。但在您的问题中,订单确实很重要。例如,dijkstra将以相同的方式处理红蓝红或红红蓝的路径。 因此,通过使用Dijkstra将无法解决问题。