Python 如何在networkx中使用自定义启发式计算*星?

Python 如何在networkx中使用自定义启发式计算*星?,python,networkx,shortest-path,a-star,Python,Networkx,Shortest Path,A Star,我试图用一个自定义的启发式算法计算两个节点之间的最短路径长度。启发式方法测量两个节点之间的加权最短路径长度加上最短路径内的节点数。考虑一个交通问题,我需要在城市网络中找到两个城市之间的最短路径。最短路径是具有最小总距离(以天为单位)和城市中最小公交次数(以天为单位)的路径 我正在尝试将networkx与一个_star _path _length函数一起使用。以下是我已经尝试过的: def distance(a,b): return ( nx.dijkstra_path_length(G,

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

我正在尝试将networkx与一个_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_星函数尝试了我的函数,但算法仍然更喜欢路由a-B-C-D-F,而不是a-E-F


请帮助。

这里的问题是您试图修改启发式,而不是实际的图形权重。实际上,A*算法返回的最小权重路径与Djikstra算法返回的路径相同,它的速度要比Djikstra快得多,因为它没有进行随机的广度优先搜索,但有一个启发式算法可以帮助它在图中的正确方向上进行引导。重要的是,不管启发式是什么,它仍然会找到最小权重路径†

解决此问题的方法是将运输编号合并到重量中。我认为这应该等于在图表中的每一个权重上加1(或者你想怎么加一跳的权重)


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

这里的问题是您试图修改启发式,而不是实际的图形权重。实际上,A*算法返回的最小权重路径与Djikstra算法返回的路径相同,它的速度要比Djikstra快得多,因为它没有进行随机的广度优先搜索,但有一个启发式算法可以帮助它在图中的正确方向上进行引导。重要的是,不管启发式是什么,它仍然会找到最小权重路径†

解决此问题的方法是将运输编号合并到重量中。我认为这应该等于在图表中的每一个权重上加1(或者你想怎么加一跳的权重)


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

谢谢您的解释!现在我更好地理解了A*算法中启发式的含义。也谢谢你的建议。事实证明,通过修改重量可以简化问题!谢谢你的解释!现在我更好地理解了A*算法中启发式的含义。也谢谢你的建议。事实证明,通过修改重量可以简化问题!