我有以下问题:我想从我之前从OSMNX中提取的一个图中得到最短的dijkstra_路径。默认情况下,NetworkX的dijkstra_path函数使用OSM边的长度作为权重来获得最短路径。在
在我的例子中,我不想得到最短的距离路径,而是使用我添加到OSM边缘的自定义权重的最短路径。在
我和你分享密码:
import osmnx as ox
import networkx as nx
import numpy as np
city_graph = ox.graph_from_place('Barcelona, Catalunya, Spain', network_type='bike')
city_nodes, city_edges = ox.graph_to_gdfs(city_graph)
然后我们添加两个自定义(随机)权重作为新的边属性,然后考虑不同权重计算dijkstra最短路径。源节点和目标节点充分分离,以避免在两个节点之间具有唯一的可能路径:
^{pr2}$接下来,我们计算三条路径沿返回路径的总累积权重,以检查路径是否不同:
# LENGTH_PATH
total_length = 0
total_test1 = 0
total_test2 = 0
for i in range(len(length_path)-1):
total_length = total_length + city_edges.at[city_edges[(city_edges['u']==length_path[i])&(city_edges['v']==length_path[i+1])].index[0], 'length']
total_test1 = total_test1 + city_edges.at[city_edges[(city_edges['u']==length_path[i])&(city_edges['v']==length_path[i+1])].index[0], 'test1']
total_test2 = total_test2 + city_edges.at[city_edges[(city_edges['u']==length_path[i])&(city_edges['v']==length_path[i+1])].index[0], 'test2']
# TEST1_PATH
t1_length = 0
t1_test1 = 0
t1_test2 = 0
for i in range(len(test1_path)-1):
t1_length = t1_length + city_edges.at[city_edges[(city_edges['u']==test1_path[i])&(city_edges['v']==test1_path[i+1])].index[0], 'length']
t1_test1 = t1_test1 + city_edges.at[city_edges[(city_edges['u']==test1_path[i])&(city_edges['v']==test1_path[i+1])].index[0], 'test1']
t1_test2 = t1_test2 + city_edges.at[city_edges[(city_edges['u']==test1_path[i])&(city_edges['v']==test1_path[i+1])].index[0], 'test2']
# TEST2_PATH
t2_length = 0
t2_test1 = 0
t2_test2 = 0
for i in range(len(test2_path)-1):
t2_length = t2_length + city_edges.at[city_edges[(city_edges['u']==test2_path[i])&(city_edges['v']==test2_path[i+1])].index[0], 'length']
t2_test1 = t2_test1 + city_edges.at[city_edges[(city_edges['u']==test2_path[i])&(city_edges['v']==test2_path[i+1])].index[0], 'test1']
t2_test2 = t2_test2 + city_edges.at[city_edges[(city_edges['u']==test2_path[i])&(city_edges['v']==test2_path[i+1])].index[0], 'test2']
最后,我们打印三条路径的结果来检查dijkstra的性能:
print(total_length)
print(t1_length)
print(t2_length)
print(total_test1)
print(t1_test1)
print(t2_test1)
print(total_test2)
print(t1_test2)
print(t2_test2)
因此,正如您所见,dijkstra的性能在weight='length'和自定义随机权重之间是不同的。但是,当考虑两个不同的自定义权重时返回的路径是完全相同的,这是没有意义的。我尝试了多个源节点和目标节点,以及不同类型的自定义权重,结果在所有情况下都是一样的。在
为了解决这个问题,我想知道是否有人能解释为什么会发生这种情况,以及当使用两种不同的自定义权重时,我如何获得两种不同的路径和路径上的总成本。networkX是从OSM边缘获取自定义最短路径的最佳库还是应该使用其他库/软件?在
谢谢!在
您需要创建一个包含所有“自定义权重”的新图形,然后使用它。 新图形(已更新的城市图形)可以通过以下方式创建:
然后和它一起使用nx.dijkstra_路径(). 在
^{pr2}$希望这有帮助。在
错误不在
networks
中,而是在创建的方式中指定了自定义长度。您不会将自定义长度添加到networkx
图city_graph
,而是添加到其他一些变量中。 因此,在使用两个自定义长度的Dijkstra算法执行期间,networks
没有找到任何具有给定标签的边权重,并采用默认值1
,这将导致相同的最短路径。在尝试以下最小示例中的方法:
相关问题 更多 >
编程相关推荐