有没有办法从OSMNX图中计算NetworkX Dijkstra的算法,并有自定义的权重?

2024-05-18 11:41:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下问题:我想从我之前从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)

enter image description here

print(total_test1)
print(t1_test1)
print(t2_test1)

enter image description here

print(total_test2)
print(t1_test2)
print(t2_test2)

enter image description here

因此,正如您所见,dijkstra的性能在weight='length'和自定义随机权重之间是不同的。但是,当考虑两个不同的自定义权重时返回的路径是完全相同的,这是没有意义的。我尝试了多个源节点和目标节点,以及不同类型的自定义权重,结果在所有情况下都是一样的。在

为了解决这个问题,我想知道是否有人能解释为什么会发生这种情况,以及当使用两种不同的自定义权重时,我如何获得两种不同的路径和路径上的总成本。networkX是从OSM边缘获取自定义最短路径的最佳库还是应该使用其他库/软件?在

谢谢!在


Tags: path路径cityindexlengthattotal权重
2条回答

您需要创建一个包含所有“自定义权重”的新图形,然后使用它。 新图形(已更新的城市图形)可以通过以下方式创建:

updated_city_graph = ox.gdfs_to_graph(city_nodes, city_edges)

然后和它一起使用nx.dijkstra_路径(). 在

^{pr2}$

希望这有帮助。在

错误不在networks中,而是在创建的方式中指定了自定义长度。您不会将自定义长度添加到networkxcity_graph,而是添加到其他一些变量中。 因此,在使用两个自定义长度的Dijkstra算法执行期间,networks没有找到任何具有给定标签的边权重,并采用默认值1,这将导致相同的最短路径。在

尝试以下最小示例中的方法:

import networkx as nx
import random

random.seed(42)

city_graph = nx.complete_graph(10)

for u,v in city_graph.edges:
    city_graph[u][v]["custom_length"] = random.randint(1, 10)

print(list(city_graph.edges(data=True))[0])
# (0, 1, {'custom_length': 2})

相关问题 更多 >