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