OptaPlanner –通过附近选择扩展车辆路线
OptaPlanner 6.2在车辆路径问题(VRP),旅行商问题(TSP)和类似用例方面取得了重大进步。 邻近选择的新功能使它可以更有效地扩展到更大的问题,而不会牺牲潜在的最佳解决方案(这是劣等技术所常见的)。
让我们仔细看一下“车辆路径问题”附近的选择。 在这种用例中,我们必须使用许多车辆将物品运送到多个地理位置。 每辆车都必须尊重其容量(硬约束),我们需要使总行驶时间最小化(软约束)。 当然,实践中还会有其他特定于业务的约束。
附近位置
元启发式算法尝试通过更改当前解决方案(称为move )来研究其他解决方案,以改善当前解决方案。 例如,这里我们有一个VRP解决方案,我们尝试了3种不同的方法,希望找到更好的解决方案:
使用普通动作选择器时,这3个动作中的每个动作都具有相同的选择变化。 一些观察:
- 将位置
A
移动到附近位置B
后面可能会有所改善。 尽管如此,我们还需要考虑其他举措,因为其他限制因素(例如时间窗口)可能会使该解决方案不可行(或回报率较低)。 - 将位置
A
移动到附近位置E
可能是对原始解决方案的改进。 由于其他限制因素(例如车辆容量),它甚至可能是最佳选择。 - 将位置
A
移动到非附近位置Z
后面(在黄色链中)不太可能会有所改善。 尽管我们应该指出,我们不能完全排除它,因为其他约束(例如时间窗口)可能使其仅移动而导致可行的解决方案。
总的来说,我们观察到搬到附近的地点通常更有利可图 。 请注意,附近位置的集合因位置而异。
缩放问题
假设我们的VRP问题中有2 000
地点。 这样一来,只有4 000 000
举动改变了一个位置。 如果我们每秒可以评估100 000
动作,那么我们需要40
秒才能尝试仅1个位置的所有动作。 我们的算法将需要多次更改每个位置:让我们假设仅4
次,导致8 000
步,这将导致3 20 000
秒或3
天以上。 随着数据集的增长,情况变得更糟:每个位置的移动数量增加,评估时间减少,步数也增加...
在实践中,基准测试表明正态分布(对于B
和Z
具有相同的选择概率)不能很好地扩展。
分区,地理围栏,MapReduce等
解决此缩放问题的一种传统方法是分区(也称为地理围栏):在求解之前,将位置分为几类,然后将车辆分布在它们之间。 如先前的博客中所示 , 分区在很大程度上牺牲了解决方案的质量,从而降低了速度 。
这种方法的最大问题是固有的Catch 22 :在解决每个问题之前确定每辆车可以访问哪些位置,并知道每辆车要访问哪些位置...
附近选择
因此,我采用了一种不同的方法,称为“附近选择”:对于每个位置,我们都希望移至附近位置。
请注意,与正常选择不同,选择B
或C
的机会要高得多。 而且与分区不同,我们仍然可以选择C
或E
OptaPlanner支持不同形式的概率分布:
- 块分布:仅选择最近的n个,且概率相等。
- 线性分布:以较高的概率选择最近的元素。 概率线性降低。
- 抛物线分布(推荐):以较高的概率选择最近的元素。
- Beta分布:根据Beta分布进行选择。 减慢求解器的速度。
基准结果
以下是一个大型VRP数据集的结果,该数据集具有2750个位置的真实时间距离(从带有GraphHopper的OpenStreetMap中收集)。 在附近的选择配置中,我使用了40个最近位置的抛物线分布。
附近选择带来的可扩展性增益是巨大的。
结论
如果您正在处理VRP用例,并且需要更好地扩展,请升级到OptaPlanner 6.2并使用附近的选择!
翻译自: https://www.javacodegeeks.com/2015/02/optaplanner-scaling-vehicle-routing-with-nearby-selection.html