如何在networkx中使用自定义试探法计算A *星?

时间:2019-06-09 11:52:38

标签: python networkx shortest-path a-star

我正在尝试使用自定义试探法计算两个节点之间的最短路径长度。启发式方法测量两个节点之间的加权最短路径长度加上最短路径内的节点数。考虑一个交通问题,我需要在城市网络中找到两个城市之间的最短路径。最短路径是指具有最小总距离(以天为单位)和最小过境次数(以天为单位)的路径。

我正在尝试将networkx与a_star_path_length函数一起使用。这是我已经尝试过的:

def distance(a,b):
    return ( nx.dijkstra_path_length(G,a,b, 'day') + len(nx.dijkstra_path(G, a, b)) )

nx.astar_path_length(G, 'A', 'F', heuristic=distance, weight='day')

假设具有六个节点的图形中每个边的权重如下:

A,B --> 1 day
B,C --> 1 day
C,D --> 1 day
D,F --> 1 day
A,E --> 4 day
E,F --> 1 day

对于每个访问的节点,我需要花费1天。

因此,城市A和城市F之间的最短路径如下:     A-> E-> F

结果应为(4 +1)+(1 +1)=7。

路径A-B-C-D-F的距离可能最短。但是由于多次过境,它们不再是最短的路径。

我使用a_star函数尝试了我的函数,但是算法仍然更喜欢路由A-B-C-D-F,而不是A-E-F。

请帮助。

1 个答案:

答案 0 :(得分:1)

这里的问题是您试图修改试探法,而不是实际的图形权重。 A *算法实际上的确返回了最小权重路径,就像Djikstra的算法一样,它的执行速度比Djikstra快得多,因为它没有进行随机的广度优先搜索,但是具有启发性来指导它图中正确的方向。重要的是,无论启发式算法是什么,它仍然找到最小的权重路径。

解决此问题的方法是将运输编号纳入重量。我相信这应该等于将图表中的每个权重加1(或者您想对一个跃点加权)。

†通常,我认为某些启发式属性是个例外。