【发布时间】:2016-02-17 17:57:37
【问题描述】:
我正在研究车辆路线问题,到目前为止,最耗时的部分是使用真实的道路网络生成距离/时间矩阵。对于这个项目,我使用 localhost graphhopper 服务器,并且我曾经使用它来获取位置之间的成对距离和时间;一切都很容易解析。它返回个人驾驶指令以及总行程距离和时间。但是,对于 2000 个地点,这将是近 400 万次呼叫。
我有一种预感,想知道如果我要求它改为规划一条一次经过 100 个地点的路线,会不会更快。然后的目标是将 json 响应分解为 100 个块,就好像我进行了 100 次成对调用一样。事实证明,100 个位置的速度快了近 3 倍。除了试图跟踪我的矩阵的哪些部分是构建的有点头痛之外,响应没有为每个子路线提供明显的结构差异,而只是给出了您处于“中途停留”的指示,例如
{
"hints": {
"visited_nodes.average": "243.0",
"visited_nodes.sum": "3402"
},
"paths": [{
"instructions": [{
"distance": 315.637,
"sign": 0,
"interval": [0, 7],
"text": "Continue",
"time": 29848
}, {
"exit_number": 3,
"distance": 1460.234,
"sign": 6,
"turn_angle": -0.01,
"interval": [7, 27],
"text": "At roundabout, take exit 3",
"time": 96167
}, {
"distance": 1258.763,
"sign": 0,
"interval": [27, 30],
"text": "Continue onto Sheikh Zayed bin Sultan Street",
"time": 50350
}, {
"distance": 116.7,
"sign": 0,
"interval": [30, 31],
"text": "Continue",
"time": 4668
}, {
"distance": 3543.556,
"sign": 0,
"interval": [31, 57],
"text": "Continue onto Sheikh Zayed bin Sultan Street",
"time": 144812
}, {
"distance": 0,
"sign": 5,
"interval": [87, 88],
"text": "Stopover 1",
"time": 0
},
我目前的工作原型是不断总结每条指令的各个距离(米),但在重新开始记录距离之前使用正则表达式查找“中途停留”。
distance_matrix = []
sub_distance = []
for unit in response['paths'][0]['instructions']:
if bool(re.search('Stopover', unit['text'])) == False:
sub_distance.append(float(unit['distance'])/1000)
else:
distance_matrix.append(sum(sub_distance))
sub_distance = []
我的背景根本不是编程,而且我在 Python 中自学了不到一年。虽然这可行,但我想知道我是否错过了一种更自然(更快)的方式来做到这一点,但我无法通过谷歌找到任何相关的东西,因为我不太确定我在寻找什么。在我们目前的规模下,距离/时间矩阵可能已经需要大约 8 分钟的时间来计算,所以我愿意接受任何缩短时间的建议。一条路线中的点数似乎是有限制的,所以这个函数仍然会被调用数千次,所以它会加起来。提前致谢。
【问题讨论】: