Python 列出所有可能的';最短';路径

Python 列出所有可能的';最短';路径,python,graph,networkx,Python,Graph,Networkx,我有一个组合问题,可以看作是一个网络搜索问题。为了可视化和使用已经实现的函数,我决定使用networkx包(实际上我没有足够的时间以其他方式实现它) 不幸的是,我的问题相当复杂。但是,我会试图通过解释最简单的事情来简化理解。通常,我需要找出到达树结束的节点的组合 下图显示了一个简单的示例: 在这种情况下,B、D、F、H是终端节点,而起点用O表示。因此,路径组合可以是: OAB OCD OED OEF OH OGH 但是,我实际上是在搜索到达终端节点的“最短”或“最有利”路径。图表(或边缘)

我有一个组合问题,可以看作是一个网络搜索问题。为了可视化和使用已经实现的函数,我决定使用networkx包(实际上我没有足够的时间以其他方式实现它)

不幸的是,我的问题相当复杂。但是,我会试图通过解释最简单的事情来简化理解。通常,我需要找出到达树结束的节点的组合

下图显示了一个简单的示例:


在这种情况下,
B
D
F
H
是终端节点,而起点用
O
表示。因此,路径组合可以是:

OAB
OCD
OED
OEF
OH
OGH
但是,我实际上是在搜索到达终端节点的“最短”或“最有利”路径。图表(或边缘)没有给出任何关于路径“成本”的信息。将根据发现的组合结果进行成本评估。评估发现的组合的“实际”成本在计算上非常昂贵。尽管图表没有提供太多信息,但有一点是明确的:为了达到
H
OH
在任何时候都是比
OGH
更好的选择。因此,可以从可能的组合列表中删除组合
OGH
。它本质上类似于距离度量

实际上,还有一点,
D
F
对应于等效点(它们是不同的节点,但对于我的应用程序具有相同的含义)。然而,只有当两个节点

- see each other
- see exactly the same nodes
如果仔细查看该图,还可以发现
C
E
是等效节点。因此,更具体地说:
OCD
OED
的组合实际上是相同的。一旦将
OCD
添加到组合列表中,就不需要添加
OED
。从图中还可以看出,由于D和F相同,一旦将
OCD
添加到列表中,就不需要添加
OCF

总之,这种情况下的解决方案是:

OAB
anyone of OCD, OED, OCF, OEF
OH
为了勾画这幅图,我遵循networkx教程,然后创建了以下代码:

import networkx as nx
import matplotlib.pyplot as plt

graph = [('O', 'A'), ('O', 'C'),  ('O', 'E'),  ('O', 'G'),  ('O', 'H'),  
         ('A', 'B'), ('A', 'O'),
         ('B', 'A'),
         ('C', 'D'), ('C', 'E'), ('C', 'F'), ('C', 'O'),
         ('D', 'E'), ('D', 'C'), ('D', 'F'),  
         ('E', 'C'), ('E', 'D'), ('E', 'F'), ('E', 'O'),
         ('F', 'C'), ('F', 'D'), ('F', 'E'),
         ('G', 'H'), ('G', 'O'), 
         ('H', 'G'), ('H', 'O')]

G=nx.DiGraph()
for edge in graph:
    G.add_edge(edge[0], edge[1])

pos=nx.graphviz_layout(G,prog='dot')
nx.draw(G, pos)
plt.show()
所以,我的问题是使用任何工具箱列出这样的序列,但最好是networkx。要做的第一步可能是在创建图形对象之前简化(或减少)图形。获得简化图后,使用
nx.all_simple_path
命令,可以列出所有备选路径。我需要你的帮助来做这样的图形简化


我的图并不深,它们通常与示例中给出的大小相同

我已经阅读了完整的模块手册,并尝试了不同的搜索算法,但我找不到现有的实现,也找不到针对这种特定情况的任何解决方法

因此,根据从评论中获得的建议,我编写了自己的简化程序,并在创建图之前删除了所有“冗余”节点。我只是将列表转换成集合,然后比较它们是否相同。之后,我创建了图形,并使用
nx.all\u simple\u path
命令列出了所有解决方案。一旦我得到了路径,这次我搜索是否有任何路径(如
OGH
),当最后一个字母之前的字母,即索引[-2]被删除时,结果路径(
OH
)也在
nx的列表中。所有简单路径
。如果是的话,我就把这个解决方案去掉了


我编写的脚本非常杂乱无章,不涉及特殊技术。因此,我选择编写解决方案方法。

我尝试了BFS和DFS。但我只能得到一个结果。不是所有可能的组合。你写道:“为了达到H,OH在任何时候都比‘OGH’更好。”。为什么?@JohnB我假设是因为
OGH
OH
的超集,但这假设所有边缘成本都是相等的。否则,在不实际计算成本的情况下,就无法“减少冗余”。@JohnB使用路径长度作为度量标准,它距离
OH
只有一个跃点,而
OGH
只有两个跃点(如果我正确理解OP的话)