NVIDIA英伟达嵌入式系统 · 4月19日 · 北京市

屡创纪录:NVIDIA cuOpt 算法将路径优化求解速度提高 100 倍

graphic-field-1.jpg

NVIDIA cuOpt 是一个用于解决复杂路径问题的加速优化引擎。它能高效解决不同方面的问题,如休息时间、等待时间、多个车辆成本和时间矩阵、多个目标、订单-车辆匹配、车辆起始和结束位置、车辆起始和结束时间等。

更具体地说,cuOpt 所解决的诸多问题可以归为两大类:带时间窗的拥挤车辆路径问题(CVRPTW)和带时间窗的取送货问题(PDPTW)。这些问题的目标是在满足客户要求的同时,最大程度地减少车辆数量和总行程。

经 SINTEF 验证,过去三年中,cuOpt 在最大规模的路径基准测试中打破了 23 项世界纪录。

本文将探讨优化算法的关键要素和定义,以及在基准测试中比较 NVIDIA cuOpt 与该领域领先解决方案的过程,着重说明进行这些比较的重要意义。在本文中,我们使用“请求”一词表示 CVRPTW 订单以及 PDPTW 问题中的取货-交货订单对。

尽管该领域存在各种约束和问题维度,但本文的讨论范围仅限于容量和时间窗约束。容量约束要求车辆上的商品总量在任何时候都不能超过车辆容量。时间窗约束则要求服务订单的时间不能早于时间窗的开始时间,也不能晚于时间窗的结束时间。

组合优化

组合优化问题是世界上计算成本最高的问题之一(NP-hard),搜索空间中可能状态的数量是阶乘的。由于不可能使用精确算法来解决大型问题,因此需要使用启发式算法来接近最优解决方案。启发式算法使用各种算法探索搜索空间,这些算法具有二次方或更高次方的计算复杂度。

高度的复杂性和问题的性质使得使用大规模并行 GPU 加速这些算法成为可能。借助 GPU 加速,可以在合理的时间内获得接近最优的解决方案。

构建进化路径优化算法

典型的路径求解器包括两个阶段:生成初始解决方案和改进解决方案。本章将介绍生成初始解决方案和改进解决方案的步骤。

初始解决方案生成算法

利用有限的车队生成一个可行的初始解决方案并满足所有约束条件,本身就是一个 NP-hard 问题。我们的团队对引导弹射搜索(GES)算法进行了改进和并行化,以便将请求放置到路径上。

GES 的主要想法很简单。我们首先尝试将请求插入路径。如果插入该请求不可行,我们就从路径中弹出一个或多个易于插入的请求,然后将该请求插入到放宽的路径中。每个请求的惩罚分数(p-score)表示将该请求插入路径的难度。只有当被弹出请求的 p 分数之和小于所考虑的请求时,算法才会插入该请求。

无法将某个请求插入路径时,我们就会递增该请求的 p-score,然后再试一次。我们会将所有未提供服务的请求保留在弹出池中,算法会一直运行到弹出池清空为止。换句话说,它会一直运行到所有请求都被服务为止。

这种算法的主要缺点是循环(返回到解决方案中的前一组节点)。当弹射节点数量较多时,找到弹射组合的速度较慢。另一个缺点是只考虑弱的、随机扰动的解决方案。我们已经消除了这些缺陷,能够生成路径数量远低于当前最先进方法的解决方案。

在深入探讨弹射算法之前,了解可行性检查和解决方案评估是在恒定时间内通过时间扭曲法进行的,这点十分重要。虽然这种方法大大缩短了计算时间,但由于需要遵守任意数量弹射搜索的词典顺序,因此也增加了并行化的难度。

查找哪些请求需要弹出,以及在何处可行地插入所考虑的请求是一个计算成本很高的问题:它与弹出请求的数量成指数关系,并且需要检查所有路径中的所有插入位置。我们的实验表明,少量的弹出请求就会引发算法循环。

因此,我们提出了一种可以并行弹出多达 10 个请求(启发式)和 5 个请求(当进行广泛搜索时)的方法。我们将弹出算法并行化,从每个路径中弹出一个片段,并在一个线程块中处理这些临时路径。然后,尝试在所有可能的位置并行插入所考虑的请求。

深度搜索算法会尝试弹出路径中所有请求的所有可能排列。我们将不同的线程块用于每个请求插入位置,并通过将词序拆分为独立的子排列来并行执行词序搜索。

GES 算法循环运行,直到耗尽时间或请求池为空。在每次迭代中,我们都会对解决方案进行扰动以改进解决方案的状态,并打开解决方案中的缺口,从而找到可行的插入方案。扰动是一种在路径之间和路径内部随机迁移和交换节点的随机局部搜索。

在找到满足要求的最佳车辆数量后,我们转入改进阶段,该阶段负责使目标最小化。默认情况下的目标是总行驶距离,但也可以在 cuOpt 中配置其他目标。

ges-algorithm-nvidia-cuopt-flowchart-2.png
图 1. NVIDIA cuOpt 中的 GES 算法流程图

进化过程和局部搜索算法

改进阶段使用进化策略对多个解决方案进行改进,生成的解决方案被置于一个群体中。为了获得足够多样化的初始解决方案,我们在生成过程中使用了随机化技术。利用 GPU 架构,我们可以并行生成许多不同的解决方案。多样化群体会经历一个进化改进过程,而解决方案的最佳特性会保留在更新的几代中。

在进化过程的一个步骤中,我们采用两个随机解决方案并应用交叉算子,这样就会产生一个子代解决方案,它继承了两个亲代的优良特性。可以对解决方案应用不同的交叉算子,其中一些算子会使子代处于不完整状态。我们可以通过删除重复节点、插入未选择路径的节点或对其进行不可行性局部搜索来修复解决方案。

例如,基于顺序的交叉算子会根据节点在另一个父代解决方案中出现的顺序,重新排列一个父代解决方案的一条或多条路径中的节点。由此产生的子代保留了一个父代解决方案的分组属性和另一个方案的排序属性。这个特殊算子的结果是一个完整的解决方案,但就时间和容量限制而言,该解决方案很可能是不可行的。cuOpt 包含多个交叉算子,它们在解决方案上随机执行。

在这种情况下,交叉后的局部搜索阶段在减少或消除不可行性,或提高总目标或行程距离方面起着至关重要的作用。局部搜索的目标权重取决于优化的重要程度,较高的不可行性权重有助于将解决方案返回可行区域,这通常是大多数问题的情况。

局部搜索为子代解决方案找到局部最小值,然后子代解决方案参与进一步的进化步骤。快速局部搜索至关重要,因为它是在时间预算内完成多少次改进迭代的主要因素。我们使用快速、近似和大型邻域搜索算法来找到性能良好的局部最小值。我们没有像传统方法那样执行固定大小的邻域局部搜索,而是设计了一个“网”来快速捕捉容易改进的地方,并在达到停滞时捕捉极深度算子。

快速算子能快速探索小邻域,而近似算子每次应用时都能评估不同的移动,这一点尤为重要,因为交叉经常会使某些路径保持不变。正如在图中寻找负子集相交循环的 GPU 并行算法中所解释的,大型邻域算子以路径间的移动循环表示的移动链来移动请求。

循环算子可以探索一个非常大的邻域,而简单算子则无法探索该邻域,这只是因为限制条件禁止这些简单算子通过搜索空间中的某些山。通过这种工作流,我们可以经常使用快速算子,而较少使用计算成本较高的深度算子。

GPU 并行化是通过将每条假设路径映射到一个线程块来实现的。这样就可以使用共享内存来存储与路径相关的数据,这些数据在搜索移动时是临时的。临时路径要么是原始路径的副本,要么是一个或多个请求被弹出的路径。线程块中的线程会尝试将其他路径中所有可能的请求插入临时路径的所有位置。

在找到并记录所有移动后,我们通过将每个路径对的插入/弹出成本变量相加,找出每个路径对的最佳移动。成本变量使用目标权重计算得出,其中还包含不可行性惩罚权重。如果多个移动对所修改的路径而言是互斥的,我们就会执行多个这样的移动。

local-search-procedure-nvidia-cuopt-flowchart-3.png
图 2. NVIDIA cuOpt 中的局部搜索程序流程图

对 cuOpt 进行基准测试

我们不断提高 cuOpt 的性能和质量。为了衡量 cuOpt 的质量,我们在研究得最多的基准测试(包括 Gehring & Homberger CVRPTW 基准测试和 Li & Lim PDPTW 基准测试)上将求解器与最著名的解决方案进行了比较。在实践中,求解器能多快得出所需的解决方案对企业非常重要。

评估标准和目标

准确度被定义为找到的解决方案与已知最佳解决方案(BKS)在目标方面的差距百分比。根据问题说明,第一个目标是车辆数,第二个目标是行驶距离。

求解时间是指达到与最佳已知解决方案或预期目标结果之间的某一差距所需的时间。求解时间是实际用例中最重要的标准之一,在预算时间内获得高准确度的解决方案非常重要,组合优化算法需要花费大量时间。

图 3 和图 4 显示了求解器在大型基准测试实例子集上的收敛行为。

convergence-behavior-cuopt-cvrptw-problems.png

图 3. cuOpt 在 CVRPTW 问题上的收敛行为

我们从每个类别(C1_10_1、C2_10_1、R1_10_1、R2_10_1、RC1_10_1、RC2_10_1)中选取了一个实例,以展示求解器的整体行为取决于(聚类、随机)和(长路径、短路径)实例。我们将每分钟采样的总和与总 BKS 进行比较。

随着时间的推移,一开始的急剧收敛会慢慢接近总 BKS。在这些实例集中,我们能够匹配 BKS 的总车辆数,cuOpt 求解器几乎可以在 Gehring 和 Homberger 的所有实例中找到 BKS 的车辆数,但实际性能取决于生成初始解决方案相比改进阶段所花费的时间。

求解器在较大的实例中收敛速度很快,而在较小的实例中,收敛速度更是要快上几个数量级。在下表中,我们展示了在达到与 BKS 相同的车辆数的同时,在不同规模的问题上达到 BKS 所需的时间。

time-to-solution-pdptw-problems-1.png

图 4. PDPTW 问题求解时间

cuOpt 创造 23 项世界纪录

凭借使用 GPU 加速启发式算法和最先进的策略这一新方法,cuOpt 打破了 Gehring & Homberger 基准测试中 15 个实例和 Li & Lim 基准测试中 8 个实例的纪录。

目前,NVIDIA 保持着过去三年 CVRPTW 和 PDPTW 类别的所有纪录。

在图 5 中,每条边代表从一个任务到另一个任务的路径。绿线代表与前一记录相同的边缘,蓝色和红色边代表两个解决方案之间的差异。由于采用了进化策略,cuOpt 解决方案在可能解的搜索空间中处于完全不同的位置,这意味着存在许多不同的边缘。

route-visualization-nvidia-cuopt-world-record-comparison-960x540.png

图 5. cuOpt 世界纪录与前纪录的路径可视化图对比 来源:Combopt.org

Gehring & Homberger 与 BKS 的总体平均差距为 -0.07% 距离差距和 0.29% 车辆数差距。Li & Lim 与 BKS 的总体平均差距为 1.22% 距离差距和 0.36% 车辆数量差距。基准测试在单颗 NVIDIA GPU 上运行了 200 分钟。

总结

NVIDIA cuOpt 利用 GPU 加速和 RAPIDS 等 NVIDIA 技术,在数秒内即可获得高质量的解决方案。我们的局部搜索运行速度较基于 CPU 的方法提高了 100 倍,基于 CPU 的求解器需要数小时才能获得类似的解决方案。

了解更多信息并开始使用 NVIDIA cuOpt:

https://www.nvidia.com/en-us/...

您还可以通过 NVIDIA API 目录和 NVIDIA LaunchPad 探索该模型,了解 cuOpt 如何帮助您的企业节省时间和金钱:

https://www.nvidia.com/en-us/...

您可聆听 NVIDIA GTC 2024 中 NVIDIA 优化 AI 工程经理 Alex Fender 的演讲“优化 AI 领域的进展”:

https://www.nvidia.com/gtc/se...

您还可以参加 NVIDIA 深度学习培训中心组织的培训,了解如何使用我们的路径优化微服务提高效率和节约成本:

https://www.nvidia.com/gtc/se...

推荐阅读
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息