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

时间:2014-07-21 13:14:49

标签: python graph networkx

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

遗憾的是,我的问题非常复杂。但是,我会尝试通过解释最简单的事情来缓解理解。通常,我需要找出组合以到达树结束的节点。

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

enter image description here


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

OAB
OCD
OED
OEF
OH
OGH

然而,我实际上搜索到达终端节点的“最短”或“最有利”路径。图(或边)不提供有关路径“成本”的任何信息。成本评估将根据找到的组合的结果进行。评估所发现的组合的“实际”成本在计算上非常昂贵。虽然该图表没有提供太多信息,但有一件事是清楚的:为了达到HOH在任何时候都是比OGH更好的选择。因此,可以从可能的组合列表中消除组合OGH。它基本上类似于距离度量。

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

才能获得这样的信息
- see each other
- see exactly the same nodes

如果仔细查看图,也可以识别CE是等效节点。因此,更具体地说明一下:OCDOED的组合实际上是相同的。将OCD添加到组合列表后,无需添加OED。从图中也可以看出,由于D和F是相同的,一旦将OCD添加到列表中,就不需要添加OCF

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

OAB
anyone of OCD, OED, OCF, OEF
OH

为了绘制该digram,我按照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。要做的第一步可能是在创建Graph对象之前简化(或减少)图形。获得简化图后,使用nx.all_simple_path命令,可以列出所有备用路径。我需要你帮助做这样的图减少。

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

1 个答案:

答案 0 :(得分:1)

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

所以,根据评论中提出的建议,我编写了自己的简化程序并删除了所有的冗余'创建图之前的节点。我只是通过转换集合中的列表然后通过比较它们是否相同来完成它。之后,我创建了图表并使用nx.all_simple_paths命令列出了所有解决方案。一旦我得到路径,这次我搜索是否有任何路径(如OGH)当最后一个字母,即索引[-2]被删除时产生的路径(OH)也在nx.all_simple_paths列表中。如果是,那么我删除了该解决方案。

我编写的脚本非常无组织,并且不涉及特殊技术。因此,我选择编写解决方案方法。