Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有办法计算NetworkX Dijkstra';具有自定义权重的OSMNX图的s算法?_Python_Networkx_Openstreetmap_Dijkstra_Osmnx - Fatal编程技术网

Python 有没有办法计算NetworkX Dijkstra';具有自定义权重的OSMNX图的s算法?

Python 有没有办法计算NetworkX Dijkstra';具有自定义权重的OSMNX图的s算法?,python,networkx,openstreetmap,dijkstra,osmnx,Python,Networkx,Openstreetmap,Dijkstra,Osmnx,我有以下问题:我想从之前从OSMNX提取的图中获得最短的dijkstra_路径。默认情况下,NetworkX的dijkstra_路径函数使用OSM边的长度作为权重,以获得最短路径 在我的例子中,我不希望获得最短距离路径,而是使用添加到OSM边的自定义权重来获得最短路径 我与您分享代码: import osmnx as ox import networkx as nx import numpy as np city_graph = ox.graph_from_place('Barcelona,

我有以下问题:我想从之前从OSMNX提取的图中获得最短的dijkstra_路径。默认情况下,NetworkX的dijkstra_路径函数使用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最短路径。源节点和目标节点充分分离,以避免在两个节点之间具有唯一的可能路径:

city_edges['test1'] = np.random.randint(1, 30000, city_edges.shape[0])
city_edges['test2'] = np.random.randint(200, 75000, city_edges.shape[0])

length_path = nx.dijkstra_path(city_graph, source = 30237607, target = 30254084, weight = 'length')
test1_path = nx.dijkstra_path(city_graph, source = 30237607, target = 30254084, weight = 'test1')
test2_path = nx.dijkstra_path(city_graph, source = 30237607, target = 30254084, weight = 'test2')
接下来,我们计算三条路线沿返回路径的总累计权重,以检查路线是否不同:

# 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)

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

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


谢谢

错误不在
网络中,而是在创建和分配自定义长度的方式中。您不会将自定义长度添加到
networkx
graph
city\u graph
,而是添加到一些其他变量。 因此,在使用两种自定义长度执行Dijkstra算法的过程中,
网络
未找到具有给定标签的任何边权重,并采用默认值
1
,这将导致相同的最短路径

请尝试以下示例中的类似操作:

将networkx导入为nx
随机输入
随机种子(42)
城市图=nx.完整的城市图(10)
对于城市中的u,v_图形边:
城市图[u][v][“自定义长度”]=random.randint(1,10)
打印(列表(城市图形边缘(数据=真))[0])
#(0,1,{'custom_length':2})

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

updated_city_graph = ox.gdfs_to_graph(city_nodes, city_edges)
然后将其与nx.dijkstra_path()一起使用


希望这有帮助。

太好了,谢谢!我已经试过了,效果如预期:)谢谢你的回答!我会考虑的:)
print(total_test2)
print(t1_test2)
print(t2_test2)
updated_city_graph = ox.gdfs_to_graph(city_nodes, city_edges)
test1_path = nx.dijkstra_path(updated_city_graph, source = 30237607, target = 30254084, weight = 'test1')
test2_path = nx.dijkstra_path(updated_city_graph, source = 30237607, target = 30254084, weight = 'test2')