我已经尽可能广泛地提出了问题标题,但以下是一个特殊的问题,它说明了我试图解决的实际问题。
假设g
是networkx.MultiGraph
,其中每条边都是红色或蓝色。一个函数看起来像是g
和两个节点,并有效地找到满足以下两个条件的路径:
注意:标准是这样的,路径可能不是标准networkx
寻路函数返回的简单路径[s]的子集,因此不可能简单地过滤结果事后networkx.all_paths
。
示例
问题:在下图中,根据上面给出的条件,找到从b
到a
的路径。
答案:bBAa,bBBbAa等。(bAa较短但不符合标准。)
一个小例子
问题:在下图中,根据上面给出的条件,找到从a
到a
的路径。
答案:aAAa。
答案 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将无法解决问题。