我有一个组合问题,可以视为网络搜索问题。为了可视化和使用已经实现的功能,我决定使用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
为了绘制该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
命令,可以列出所有备用路径。我需要你帮助做这样的图减少。
我的图表并不深,它们通常与示例中给出的大小相同。
答案 0 :(得分:1)
我已经阅读了完整的模块手册,并尝试了不同的搜索算法,但我无法找到现有的实现,或者针对这种特定情况的任何解决方法。
所以,根据评论中提出的建议,我编写了自己的简化程序并删除了所有的冗余'创建图之前的节点。我只是通过转换集合中的列表然后通过比较它们是否相同来完成它。之后,我创建了图表并使用nx.all_simple_paths
命令列出了所有解决方案。一旦我得到路径,这次我搜索是否有任何路径(如OGH
)当最后一个字母,即索引[-2]被删除时产生的路径(OH
)也在nx.all_simple_paths
列表中。如果是,那么我删除了该解决方案。
我编写的脚本非常无组织,并且不涉及特殊技术。因此,我选择编写解决方案方法。