车辆路线问题 - 如何完成/确定何时访问某些位置?

问题描述

我有 VRP 问题。我有车辆起始位置和距离矩阵。我希望在访问某些位置时终止/完成解决方案。

所以我不希望它实际访问 location_matrix 的每个索引,但是如果访问“必须访问”旁边的不同索引以获得更好的解决方案,那么我没有问题。因为你知道有时直接从 1 到 3 比 1-2-3 慢。 (访问 2 不是必需的,但为了快捷方式)

我定义了一个成本为 0 的虚拟仓库,我用它作为结束,因为如果你使用开始,你必须定义结束。我把结束 000 这基本上是结束位置。您可能会问为什么没有放置“工作”位置。但这意味着他们必须到此为止。所以它似乎不是最佳的,因为例如一辆车可能真的靠近两个“JOB”位置,但如果它终止/结束,因为它有 END 定义的车辆将停止。

我不知道如何进行这项工作。基本上我想要的是,如果某些位置被访问一次就终止 - 这就是解决方案。因此,如果作业是 (1,3,5) 并且车辆 1 访问了 1,3 并且车辆 2 刚刚访问了 2,则应该完成。

如果我在 ortools 中使用求解器,它会像 TSP 问题一样尝试访问 distance_matrix 中的每个位置。我不完全想要这个。如果结果更好,它可以访问解决方案(是否有意义?)但它应该关注“工作”位置以及如何更快地进行

解决方法

潜在方法:计算仅包含“必须访问”位置的新距离矩阵,并使用该矩阵运行 VRP。

  • 计算仅包含“必须访问”位置的距离矩阵。
  • 每个单元格包含两个“必须访问”位置之间的最短路径。
  • 存储找到的所有成对最短路径。
  • 在此距离矩阵上运行常规 VRP。
  • 使用之前找到的最短路径重建完整路径。