我正在尝试使用自定义启发式方法计算两个节点之间的最短路径长度。启发式方法测量两个节点之间的加权最短路径长度加上最短路径内的节点数。考虑一个交通问题,我需要在城市网络中找到两个城市之间的最短路径。最短路径是具有最小总距离(以天为单位)和城市最小中转次数(以天为单位)的路径。
我正在尝试使用带有a_star_path_length功能的networkx。下面是我已经尝试过的:
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')
假设有6个节点的图中每条边的权重如下:
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。
请帮帮忙。
发布于 2019-06-09 20:21:02
这里的问题是,您试图修改启发式,而不是实际的图形权重。重要的是,无论启发式是†,它仍然会找到一个权重最小的路径。
解决这个问题的方法是将运输号码并入权重中。
†通常,我认为某些启发式属性是有例外的。
https://stackoverflow.com/questions/56514349
复制相似问题