解决车辆路径问题的集体版本

时间:2020-07-12 16:00:08

标签: algorithm graph-theory dijkstra

我在寻找以下问题的算法时遇到了麻烦:

在权重为w的无向加权图中,需要有一个包裹从s传递到t。图的所有节点都计为桩号。每个站点都有特定类型的车辆,具有给定的速度v和行驶距离d。车辆需要集体工作才能交付包裹。因此,如果当前行驶距离为10的车辆沿配重4的边缘行驶,则行驶距离将缩短为6。如果车辆无法沿整个边缘行驶,则必须在车站停靠。包裹可以在任何地方移交。

我必须找到最快的路径(通过优化距离/速度)来将包裹从s运送到t。

我一直在浏览许多有关车辆路径问题版本的科学论文,但找不到能解决我的问题的论文。

我尝试通过使用w / v的权重来使用djikstra的修改版本解决此问题,但是我不知道何时将节点标记为已访问。如果有人对算法有解决办法的想法,我将很高兴。

1 个答案:

答案 0 :(得分:2)

我将“状态”编为

  • 包含该软件包的节点n
  • 到达目的地的时间
  • 您曾经去过那里的速度和行驶范围

起始状态为s,时间0,从s出发的全程汽车。要找到给定状态的后继状态,请遵循以下逻辑:

  • 对于每个e,是n的传出边;并且仅在当前汽车的续航里程足够的情况下,使用
  • 创建两个新的后继状态n1n2
node[n1] = node[n2] = target[e]
time[n1] = time[n2] = time[n] + length[e] / car_speed[n]
car_speed[n1] = car_speed[n]
car_range[n1] = car_range[n] - length[e]
car_speed[n2] = target[e].car_speed
car_range[n2] = target[e].car_range

然后,您在此使用A *,以time作为成本和适当的启发式方法,最后找到最佳路线和时间。由于我不确定最好的启发式方法(时间是距离/速度,但是速度因汽车而异...),因此您可以使用空启发式方法,它可以扩展比平时更多的节点,但永远不会高估。

这个想法是从到达的每个节点有两种方法可以进行:切换汽车或保持到达的汽车。由于您不知道最好的决定是什么,因此请对两者进行测试,然后看看哪种方法更好。

从内存角度出发,假设您只对达到目标的最短时间感兴趣,并且您选择的启发式方法为null或可允许且一致,那么您最多只需要保持2*V个开放状态对于具有V个节点的图-因为已经访问过的节点将不再需要再次访问(将它们标记在某个地方,以避免再次访问它们时对其进行处理),因此可以丢弃旧状态而不会产生不良影响

[在以前的版本中,我混淆了成本和启发式方法;我进行了修改,以澄清我建议使用空启发式和按时间计算的费用]