optaplanner
在现实世界中,车辆路径问题(VRP)中的车辆必须走这条路:它们不能在客户之间直线行驶。 大多数VRP研究论文和演示都乐于忽略此实现细节。 和我一样,过去。 尽管使用道路距离(而不是空中距离)不会对VRP的NP硬性产生多大影响,但确实会带来一些额外的挑战。 让我们来看看这些挑战。
道路距离数据集
首先,我们需要现实的数据集。 不幸的是,在VRP研究社区中,缺乏具有道路距离的公共VRP数据集。 VRP Web很少,例如位于29个位置的巴伐利亚数据集,但没有什么严重的。 因此,我必须根据以下要求自己生成一些实际的数据集:
- 将Google Maps用作道路,在数据集中每对位置之间的真实距离以km为单位。
- 例如,在小道路上合理的时候使用高速公路。
- 对于每个数据集,生成空中距离变量和道路距离变量,以比较结果。
- 生成多个数量级的相似数据集,以比较可伸缩性。
- 为VRP中的车辆容量限制添加合理的车辆容量和客户需求。
我最终生成了比利时的数据集,其中包含城市,城镇和郊区的位置。 最大的一个有2750个位置。 稍后,我可能会添加USA数据集的道路变量,这些变量最多可包含10万个位置。
通过使用基于OpenStreetMap的出色的Java库GraphHopper ,查询实际道路距离相对容易。 只要整个道路网(比利时只有200MB)可以加载到内存中,它也很快。 加载整个北美道路网络(6GB)更具挑战性。 我将这些数据集提交到VRP Web,以便其他研究人员也可以使用它们。
所有这一切都发生在 OptaPlanner的VRP示例开始解决它之前。 在求解过程中,距离已经在查找表中可用。 一旦我们开始生成具有1000个或更多位置的数据集,预先计算每个位置对之间的所有距离可能会带来内存和性能问题。 我将在下一个博客中解释这些以及补救措施。
空中距离与道路距离
为了清楚起见,我将集中在数据集belgium-n50-k10.vrp上,该数据集具有50个位置和10个车辆,每个车辆的容量为125。 OptaPlanner有5分钟的时间来解决这两种变化(空中和道路距离)。
使用空中距离 (可根据纬度和经度计算欧几里得距离)会导致:
总距离22.99并不重要,因为它不在通用的度量单位内,而且我们的车辆无论如何也无法从点到点飞行。 我们需要将此空距解决方案应用于真实道路网络 (如下所示),以了解真实距离:
现在,让我们比较上面的空中距离解决方案和下面的道路距离解决方案。
道路距离解决方案所需的时间减少了108.45公里,因此提高了近5%! 而且,这是世界上最密集的道路网之一(比利时的道路网):在稀疏的道路网上,收益可能会更多。
结论
使用实际距离而不是空中距离确实很重要。 用空距离求解VRP,然后应用道路距离是次优的。
但是,我们真的可以预先计算大型数据集中的每个地理位置对吗? 敬请关注。
翻译自: https://www.javacodegeeks.com/2014/09/optaplanner-vehicle-routing-with-real-road-distances.html
optaplanner