摘要
最近提出的学习启发式组合优化问题的想法很有希望,因为它可以节省昂贵的开发成本。 但是,为了将这种想法推向实际实施,我们需要更好的模型和更好的培训方式。 我们在两个方向上都做出了贡献:我们提出了一个基于注意力层的模型,该模型具有优于Pointer Network的优势,并且展示了如何使用REINFORCE和基于确定性贪婪展开的简单基线来训练该模型,我们发现该模型比使用a 值函数。 我们对最近学习的旅行商问题(TSP)启发式算法进行了显着改进,对于多达100个节点的问题,已接近最佳结果。
使用相同的超参数,我们可以学习车辆路线问题(VRP)的两个变体,定向运动问题(OP)和奖品收集TSP(PCTSP)的随机变体(具有随机性)的强大启发法,其表现优于广泛的基准并 结果接近高度优化和专门的算法。
简介
想象一下自己去参加科学会议。 这个领域很受欢迎,当然您也不想错过任何东西。 您已经选择了几张要访问的海报,自然地,您必须返回到现在的位置:咖啡角。 您应该按照什么顺序参观海报,以尽量减少走动的时间? 这是旅行科学家问题(TSP)。
您意识到自己的问题等同于旅行商问题(通常也是TSP)。 当您知道问题是(NP-)困难时,这似乎令人沮丧(Garey&Johnson,1979)。
幸运的是,复杂性理论分析了最坏的情况,您的贝叶斯观点认为这不太可能。 特别是,您有很强的先决条件:可能会定期布置海报。 您需要一种特殊的算法,它不能解决任何问题,但可以解决这类问题实例。 您还需要准备几个月的时间。 作为机器学习者,您想知道您的算法是否可以学习?
动机机器学习算法已取代人类,成为解决各种任务的算法工程师。 十年前,计算机视觉算法使用了手工制作的功能,但如今,它们是由深度神经网络(DNN)端到端学习的。 通过从数据中学习,DNN在语音识别,机器翻译,图像字幕和其他问题上的表现优于传统方法(LeCun等,2015)。 虽然DNN主要用于进行预测,但强化学习(RL)使算法能够通过与环境(例如环境)交互来学习制定决策。 学习玩Atari游戏(Mnih等,2015),或者通过先行搜索引入知识:这是用来掌握Go游戏的方法(Silver等,2017)。
世界不是游戏,我们希望训练能够做出决定以解决实际问题的模型。
这些模型必须学习从组合的大量潜在解决方案中选择一个问题的好的解决方案。 传统上,解决组合优化问题的方法可以分为精确方法(保证找到最佳解)和启发式方法(权衡最优性以降低计算成本),尽管精确方法可以在内部使用启发式方法,反之亦然。 启发式方法通常以规则的形式表示,可以将其解释为制定决策的策略。 我们认为,可以使用DNN来参数化这些策略,并对其进行训练以针对许多不同的组合优化问题获得新的更强大的算法,类似于DNN在先前提到的应用程序中提高性能的方式。 在本文中,我们将重点放在路由问题上:一类重要的实用组合优化问题。
在TSP上测试了学习启发式方法的有前途的想法(Bello et al。,2016)。 为了推动这一想法,我们需要更好的模型和更好的培训方式。 因此,我们建议使用基于注意力的功能强大的模型,并建议使用具有简单但有效的贪婪展开基准的REINFORCE来训练该模型。 我们方法的目的不是要胜过诸如Concorde之类的未经学习的专用TSP算法(Applegate等,2006)。 相反,我们通过一组超参数展示了我们在大小合理的多个(路由)问题上的方法的灵活性。 这是在我们可以学习强大的启发式方法以解决不存在良好启发式方法的各种不同实际问题的情况下的重要进步。
2相关工作
神经网络(NNs)在组合优化问题中用于优化决策的应用可以追溯到Hopfield&Tank(1985),他将Hopfield网络应用于解决小型TSP实例。 NN已被应用到许多相关问题(Smith,1999),尽管在大多数情况下,都是以在线方式,从头开始“学习”每种情况的解决方案。 最近,(D)NN也已脱机使用以了解整个问题实例类别。
Vinyals等。 (2015年)引入了指针网络(PN)作为模型,该模型使用注意力来输出输入的排列,并在示例解决方案的监督下,离线训练该模型以解决(Euclidean)TSP。 在测试时间之后,他们的波束搜索过程会过滤无效巡回路线。 贝洛等。 (2016年)引入了一种Actor-Critic算法来训练无监督解决方案的PN。 他们将每个实例视为一个训练样本,并使用样本解决方案的成本(行程长度)进行政策梯度的无偏蒙特卡洛估计。 他们通过对嵌入物的额外瞥见(Vinyals等人,2016)在解码器中引入了额外的模型深度,掩盖了已访问的节点。 对于小实例(n = 20),它们接近Vinyals等人的结果。 (2015年),他们改善了n = 50,并另外包括n = 100的结果。 (2018)用元素投影替换了PN的LSTM编码器,这样可以有效地计算状态变化后的更新嵌入。 他们将此模型应用于带有分开交付和随机变型的车辆路径问题(VRP)。
戴等。 (2017)没有使用单独的编码器和解码器,而是基于图嵌入的单个模型。 他们使用帮助函数在最佳可能位置插入来训练模型,以输出将节点插入到局部游览中的顺序。 他们的1步DQN(Mnih et al。,2015)训练方法每步训练算法,每步提供给代理的增量奖励有效地鼓励了贪婪行为。 如其附录中所述,他们使用奖励的负数,并与折扣相结合,从而鼓励代理首先插入最远的节点,这被认为是一种有效的启发式方法(Rosenkrantz等,2009)。
Nowak等。 (2017)以监督的方式训练图神经网络,直接将旅程作为邻接矩阵输出,通过波束搜索将其转换为可行的解决方案。 该模型是非自回归的,因此不能在局部巡回中调节其输出,因此作者报告了n = 20时的最佳差距为2.7%,比本节中提到的自回归方法差。
Kaempfer&Wolf(2018)训练了一个基于Transformer架构的模型(Vaswani et al。,2017),该模型将分数解输出到多个TSP(mTSP)。 结果可以看作是线性松弛问题的解决方案,他们使用波束搜索来获得可行的整数解。
独立于我们的工作,Deudon等。 (2018)使用OR社区中的关注度提出了TSP模型。 它们显示出使用2OPT本地搜索可以提高性能,但与PN相比没有显示出其模型的优势。 我们使用了不同的解码器和改进的训练算法,它们都在不使用2OPT的情况下显着改善了结果,并且还展示了对不同问题的应用。 有关差异的完整讨论,请参阅附录
车辆路径问题(VRP)在容量性VRP(CVRP)中(Toth&Vigo,2014年),每个节点都有需求,应构造多条路线(起点和终点在仓库),以使节点的总需求 每条路线不超过车辆的容量。 我们还考虑了拆分交付VRP(SDVRP),它允许通过多条路线拆分客户需求。 我们实现了Nazari等人描述的数据集。 (2018),并与他们的强化学习(RL)框架和他们报告的最强基准进行比较。 比较贪婪解码,我们可以获得明显更好的结果。 我们无法直接将样本(1280个样本)与其大小为10的波束搜索进行比较(它们没有报告样本或更大的波束大小),但请注意,我们的贪婪方法在大多数(较大)情况下也优于波束搜索。 不到1秒/实例)更接近LKH3(Helsgaun,2017),这是一种最新算法,可以找到CVRP基准测试的最著名解决方案。 有关贪婪示例求解图,请参见附录C.4。
3注意力模型
我们根据TSP定义注意力模型。 对于其他问题,模型相同,但是需要相应地定义输入,掩码和解码器上下文,这将在附录中进行讨论。
我们将问题实例s定义为具有n个节点的图,其中节点i∈{1,。 。 。 ,n}由特征x i表示。 对于TSP,x i是节点i的坐标,并且图是完全连接的(具有自连接),但通常,该模型可以视为图关注网络(Velickovic等人,2018年),并通过屏蔽程序将图形结构考虑在内(请参阅附录A)。 我们将解(旅行)π=(π1,…,πn)定义为节点的置换,因此πt∈{1,…。 。 。 n}和πt 6 =πt 0∀t6 = t 0。 我们基于注意力的编解码器模型定义了一个随机策略p(π| s),用于在给定问题实例s的情况下选择解π。 它由θ分解和参数化为
公式(1)
编码器生成所有输入节点的嵌入。 解码器生成输入节点的序列π,一次生成一个节点。 它以编码器嵌入以及问题特定的掩码和上下文为输入。 对于TSP,在构造了局部巡视后,无法更改它,剩下的问题是找到从最后一个节点到所有未访问的节点到第一个节点的路径。 已经访问过的其他节点的顺序和坐标无关。 为了知道第一个和最后一个节点,解码器上下文(在图形嵌入之后)由第一个和最后一个节点的嵌入组成。
与Bello等类似。 (2016年),解码器观察到一个掩码,以了解已访问了哪些节点。
3.1编码器
我们使用的编码器(图1)类似于Vaswani等人在Transformer体系结构中使用的编码器。 (2017年),但我们不使用位置编码,以使结果节点嵌入对于输入顺序不变。 根据d x维输入特征x i(对于TSP d x = 2),编码器计算初始d h维节点嵌入########由层∈{1,…,N}产生的嵌入。 编码器计算输入图的聚合嵌入P n(N)(N)h̄(N)作为最终节点嵌入h i的平均值:h̄(N)= n 1 i = 1 h i。
(N)节点嵌入h i和图嵌入h̄(N)都用作解码器的输入。
注意层遵循Transformer架构(Vaswani et al。,2017),每个注意层由两个子层组成:执行消息在节点之间传递的多头注意(MHA)层以及逐节点完全连接的前馈( FF)层。 每个子层都添加一个跳过连接(He等人,2016)和批处理规范化(BN)(Ioffe&Szegedy,2015)(我们发现它们比层规范化更好(Ba等人,2016)):
公式(2)
公式(3)
层索引`表示各层不共享参数。 MHA子层使用M = 8个磁头,维数d M h = 16,而FF子层具有一个隐藏的(子)子层,其维数为512和ReLu激活。 有关详细信息,请参见附录A。
3.2解码器
解码顺序发生,并且在时间步长t∈{1,。 。 。 n},解码器根据来自编码器的嵌入输出节点πt,并在时间t 0 <t产生的输出πt 0。 在解码期间,我们使用特殊的上下文节点(c)扩充图,以表示解码上下文。 解码器在编码器的顶部计算注意(子)层,但仅将消息发送给上下文节点以提高效率。 1最终概率是使用单头注意力机制计算的。 有关解码过程的说明,请参见图2。
上下文嵌入在时间t,解码器的上下文来自编码器,直到时间t为止的输出。 如前所述,对于TSP,它由图的嵌入,前一个(最后)节点πt-1和第一个节点π1组成。 对于t = 1,我们使用学习的d h维参数v l和v f作为输入占位符
公式(4)
这里[·,·,·]是水平串联运算符,我们将(3·dh)维结果(N)向量写为h(c),以表示我们将其解释为特殊上下文节点(c)的嵌入。 并使用(N)上标(N)与节点嵌入hi对齐。 我们可以将嵌入投影回dh维,但是我们在等式5的参数W Q中吸收了这种变换。
(N +1)现在我们使用附录A中描述的(M头)注意机制(N)计算嵌入h(c)的新上下文节点。键和值来自节点嵌入hi,但是我们仅计算a 来自上下文节点的单个查询q(c)(每头)(出于可读性考虑,我们省略了(N)):
公式(5)
我们计算查询与所有节点的兼容性,以及在时间t无法访问的掩码(设置u(c)j =-∞)节点的兼容性。 对于TSP,这仅表示我们屏蔽了已访问的节点:
公式(6)
这里d k = M是查询/关键字的维数(请参阅附录A)。 再次,我们计算M = 8头的u(c)j和vi,并使用附录A中的公式12–14计算上下文节点的最终多头注意值,但用(c)代替i。 此机制与我们的编码器类似,但不使用跳过连接,批处理规范化或前馈子层来实现(N +1)最大效率。 结果h(c)与Bello等人描述的现象相似。 (2016)。
对数概率的计算为了计算等式1中的输出概率pθ(πt | s,π1:t-1),我们添加了一个具有单个关注头的最终解码器层(M = 1,因此d k = d h)。 对于这一层,我们仅使用等式6计算兼容性u(c)j,但遵循Bello等人的方法。 (2016)我们使用tanh在[−C,C](C = 10)内裁剪结果(在屏蔽之前!):
公式(7)
我们将这些兼容性解释为未归一化的对数概率(对数),并使用softmax(类似于附录A中的公式12)计算最终输出概率向量p:
公式(8)
第三部分定义了我们的模型,给定一个实例s定义了一个概率分布pθ(π| s),我们可以从中进行采样以获得解(旅行)π| s。 为了训练我们的模型,我们定义损耗L(θ| s)= E pθ(π| s)[L(π)]:成本L(π)的期望值(TSP的行程长度)。 我们使用具有基线b(s)的REINFORCE(Williams,1992)梯度估计器,通过梯度下降来优化L:
公式(9)
良好的基线b(s)减少了梯度变化,因此提高了学习速度。 一个简单的例子是具有衰减β的指数移动平均值b(s)=M。 这里,M = L(π)在第一次迭代中,并在后续迭代中更新为M←βM+(1-β)L(π)。 一个流行的替代方法是使用学习值函数(临界)v̂(s,w),其中从观察值(s,L(π))学习参数w。 但是,使这样的参与者批评算法起作用并非易事。
我们建议以类似于Rennie等人的自我批评训练的方式使用推出基线。
(2017),但会定期更新基准政策。 它的定义如下:b(s)是迄今为止确定的最佳模型所定义的策略的确定性贪婪推出的解决方案成本。
动机基线的目标是估计实例s的难度,以使其与成本L(π)有关,以估计模型选择的解决方案π的优势。 我们进行以下主要观察:通过平均应用实例的算法,可以估计实例的难度。 这是基于这样的假设:(平均而言)算法在更困难的实例上将具有更高的成本。 因此,我们通过在训练过程中应用(推出)模型定义的算法来形成基线。 为了消除方差,我们通过以最大的概率贪婪地选择动作来强制结果具有确定性。
确定基线策略随着模型在训练过程中的变化,我们通过将贪婪推广策略pθBL冻结固定数量的步长(每个时期)来稳定基线,这类似于在DQN中冻结目标Q网络(Mnih等人) 。,2015)。 更强大的算法定义了更强的基线,因此,在每个时期结束时,我们将当前的训练策略与基线策略进行比较(使用贪婪解码),并且仅当根据以下内容获得显着改善时才替换基线策略的参数θBL: 在10000个单独的(评估)实例上进行配对t检验(α= 5%)。
如果基准政策已更新,我们将对新的评估实例进行抽样,以防止过拟合。
分析以贪婪展开为基准b(s),如果采样解决方案π优于贪婪展开,则函数L(π)-b(s)为负,导致动作得到增强,反之亦然。 这样,模型就经过训练以改善其(贪婪的)自我。 我们发现自我玩法的改进有相似之处(Silver et al。,2017):抽样取代了树搜索以进行探索,并且与最佳模型相比,如果模型产生了改进(“胜利”),则该模型将得到奖励。 与AlphaGo相似,在每个时期结束时进行评估可确保我们始终受到最佳模型的挑战。
算法我们使用Adam(Kingma&Ba,2015)作为优化程序,得出算法1。
效率每个部署都构成一个附加的前向遍历,使计算量增加50%。 但是,由于基线针对某个时期是固定的,因此我们可以使用更大的批处理量对数据进行采样并计算每个时期的基线,这可以减少内存需求,因为计算可以在纯推理模式下运行。 根据经验,我们发现它仅增加25%(请参阅附录B.5),占总时间的20%。 如果需要,可以并行计算基线部署,这样就不会增加每次迭代的时间,这是从其他GPU中受益的简便方法。
实验
我们关注路由问题:我们考虑了TSP,VRP的两个变体,定向越野问题和(随机的)奖品TSP。 这些提供了一系列不同的挑战,约束和目标,并且传统上是通过不同的算法解决的。 对于注意力模型(AM),我们针对每个问题调整输入,掩码,解码器上下文和目标函数(有关详细信息和数据生成,请参见附录),并针对n = 20、50和100个节点的问题实例进行训练。 对于所有问题,我们使用相同的超参数:我们发现它们在TSP上可以很好地工作。
√√超参数我们用输入维d初始化参数Uniform(−1 / d,1 / d)。
每个时期我们处理2500个512个实例的批处理(n = 100的VRP除外,其中我们使用2500×256作为内存限制)。 对于TSP,一个时代需要n:20的5:30分钟,n = 50(单个GPU 1080Ti)的16:20和n = 100(2个1080Ti的)的27:30。 我们使用即时生成的训练数据训练100个纪元。 我们发现训练对于不同的种子是稳定的,并且结果是可靠的,其中仅在一种情况下(n = 20的PCTSP),我们不得不以不同的种子重新开始训练,因为运行分散了。 我们在编码器中使用了N = 3层,我们发现在结果质量和计算复杂度之间进行了很好的权衡。 我们使用恒定的学习率η= 10 -4。 具有较高学习率η= 10 -3的训练是可能的,并且可以加快初始学习的速度,但是需要衰减(每个时期0.96)才能收敛,并且可能会更加不稳定。
见附录B.5。 有了推出基线,我们在第一个时期使用了指数基线(β= 0.8),以稳定初始学习,尽管在许多情况下,没有这种“热身”,学习也会成功。 我们在PyTorch中的代码(Paszke et al。,2017)是公开可用的。 2个
解码策略和基准对于每个问题,我们报告10000个测试实例的性能。 在测试时,我们使用贪婪解码,即在每个步骤中选择最佳操作(根据模型),或在采样时对1280个解决方案(在单个GPU上以<1s为单位)进行采样并报告最佳效果。 更多采样可在增加计算量的情况下提高解决方案质量。 在表1中,我们将贪婪解码与同样构成单个解决方案的基线进行比较,并通过采样或(本地)搜索将采样与同样考虑多个解决方案的基线进行比较。
对于每个问题,我们还会报告“最佳解决方案”:通过Gurobi(2018)进行优化(对于n> 20,除了TSP都是难解的)或针对特定问题的最新算法。
运行时间运行时间很重要,但很难比较:由于实现(Python与C ++)和硬件(GPU与CPU)的不同,运行时间可能相差两个数量级。 我们从实际角度出发,并报告了在单个GPU(1080Ti)上或在32个虚拟CPU系统(2×Xeon E5-2630)上并行32个实例解决10000个实例测试集所花费的时间。 这是保守的:我们的模型是可并行化的,而大多数基准是单线程CPU实现,单独运行时无法并行化。 我们还注意到,训练后我们的运行时间可能会因模型压缩而减少(Hinton等人,2015)。 在表1中,我们没有报告其他人报告的结果的运行时间,因为它们不是直接可比的,但是我们注意到,总体而言,我们的模型和实现是快速的:例如Bello等。 (2016)报告了10.3秒用于采样1280个TSP解决方案(K80 GPU)的情况,我们在不到一秒钟的时间内(在1080Ti上)进行了处理。
对于大多数算法,可以权衡运行时间以提高性能。 由于报告完整的权衡曲线是不切实际的,因此我们尝试选择合理的位置,如果结果相似则报告最快,或者报告具有不同时间限制的结果(例如,我们将Gurobi的时间限制用作启发式方法)。
5问题
旅行商问题(TSP)对于TSP,我们报告了Gurobi以及Concorde(Applegate等人,2006)(比Gurobi更快,因为它专门用于TSP)和LKH3(Helsgaun,2017)的最优结果, 最先进的启发式求解器,根据经验还可以及时找到与Gurobi相当的最佳解决方案。 我们将与最近插入,随机插入和最远插入以及最近邻居进行比较,后者是唯一的非学习基线算法,该算法也可以直接按顺序构造导览(即结构上与我们的模型相似)。 有关详细信息,请参见附录B.3。 另外,我们将与第2节中学习到的启发式方法进行比较,最重要的是Bello等人。 (2016),以及Bello等人报道的OR Tools。 (2016)和Vinofals报告的Christofides + 2OPT本地搜索等。 (2015)。 Dai等的结果。 (2017)是根据最优缺口计算的(最优),它们分别在15-20、40-50和50-100节点图上报告。 使用单一的贪婪构造,我们的表现要优于传统基准,并且比以前学习的启发式方法能够获得更接近最佳结果的结果(n = 20时,比最佳结果高出约1.5%至0.3%)。 自然,与Bello等人的区别。 (2016)在对许多解决方案进行采样时会被稀释(与许多样本一样,即使是随机策略也能很好地执行),但我们仍然可以获得明显更好的结果,而无需调整softmax温度。 为了完整起见,我们还报告了运行Encode-Attend-Navigate(EAN)代码3的结果,该代码是Deudon等人的并行工作。 (2018)(有关详细信息,请参阅附录B.4)。 即使使用2OPT本地搜索对EAN进行了改进,我们的模型也优于EAN。
附录B.5直观地显示了结果,包括不同n的推广结果。
车辆路径问题(VRP)在容量性VRP(CVRP)中(Toth&Vigo,2014年),每个节点都有需求,应该构造多条路线(起点和终点在仓库),以便节点中的总需求 每条路线都不会超过车辆的容量。 我们还考虑了拆分交付VRP(SDVRP),该协议允许通过多条路线拆分客户需求。 我们实现了Nazari等人描述的数据集。 (2018),并与他们的强化学习(RL)框架和他们报告的最强基准进行比较。 比较贪婪解码,我们可以获得明显更好的结果。 我们无法直接将采样(1280个样本)与其大小为10的波束搜索进行比较(它们没有报告采样或更大的波束大小),但请注意,我们的贪婪方法在大多数(较大)情况下也胜过了它们的波束搜索, 不到1秒/实例)更接近LKH3(Helsgaun,2017年),这是一种最新算法,可以找到CVRP基准测试的最著名解决方案。 有关贪婪示例求解图,请参见附录C.4。
定向运动问题(OP)OP(Golden等,1987)是一个重要的问题,用于对许多现实世界中的问题进行建模。 每个节点都有一个相关的奖品,目标是构建一个单一的游览(在仓库开始和结束),以使访问的节点的奖赏总和最大化,同时比最大(给定)长度短。 我们考虑了Fischetti等人提出的奖金分配。 (1998年):恒定,统一(在附录D.4中),并且随着到仓库的距离而增加,我们在此报告,因为这是最困难的问题。 作为“最佳解决方案”,我们报道了Kobeaga等人最近提出的最新遗传算法(G),它是Gurobi(对于n> 20而言是棘手的)和Compass。 (2018),仅比使用我们的方法采样1280个解决方案好2%(目标是最大化)。 我们的表现优于Python GA 4(似乎没有规模),以及Tsiligirides(1984)(比较贪婪或1280个样本)的启发式构造阶段,其结构与我们的模型所学类似。 OR Tools无法在n> 20的百分之几的情况下找到可行的解决方案。
奖品收集TSP(PCTSP)在PCTSP(Balas,1989年)中,每个节点不仅具有相关的奖品,而且具有相关的罚款。 目标是至少收集最低总奖金,同时将总巡回演出时间加未访问节点的罚款总和最小化。 这个问题很难解决,因为算法必须权衡不访问具有边际成本/访问长度(取决于所访问的其他节点)的节点而不访问节点的代价,同时还要满足最小总奖金约束。 我们将其与具有10或60秒本地搜索的OR Tools以及迭代本地搜索(ILS)的开源C ++ 5和Python 6实现进行了比较。 尽管注意力模型找不到比具有60s本地搜索的OR Tools更好的解决方案,但它可以在明显更少的时间内找到几乎相同的结果。 结果也在C ++ ILS算法的2%以内(但获得的速度更快),这是我们可以找到的PCTSP的最佳开源算法。
随机PCTSP(SPCTSP)我们考虑的PCTSP(SPCTSP)随机变体说明了我们的模型如何自然地应对不确定性。 在SPCTSP中,预期的节点奖赏是预先知道的,但是实际收集的奖赏仅在访问时才知道。 受罚时,这个问题是随机k-TSP的推广(Ene et al。,2018)。 由于我们的模型当时构造了一个巡回节点,因此我们只需要使用真实的奖励来计算剩余的奖励约束。 相比之下,选择固定行程的任何算法都可能无法满足奖赏约束,因此算法必须是自适应的。 作为基准,我们实现了计划行程的算法,执行其中的一部分,然后使用C ++ ILS算法进行重新优化。 为了最大程度地适应性,我们要么执行所有节点访问(因此,如果结果不满足奖品约束,则计划其他节点),计划的节点访问的一半(对于O(log n)重新计划迭代)或仅执行第一个节点访问。 我们观察到,对于n = 20,我们的模型优于所有基线。我们认为,未能考虑奖金中的不确定性(由基线)可能会导致需要访问一个或两个附加节点,这对于小型实例而言相对而言代价较高,但 对于较大的n来说相对便宜。 尽管如此,我们的方法还是有好处的,因为它以较低的计算成本提供了具有竞争力的解决方案,这在在线环境中很重要。
5.2注意力模型对比指针网络和其他基准对比
图3比较了TSP20注意模型(AM)和我们在培训过程中对指针网络(PN)的实现。 我们使用带有贪婪解码的大小为10000的验证集,并将其与使用指数(β= 0.8)和批评者(请参阅附录B.1)的基线进行比较。 我们使用了两个随机种子,并且学习率的衰减率为η= 10 -3×0.96个纪元。 这对于PN而言效果最佳,而对于AM而言,结果类似于使用η= 10 -4(请参阅附录B.5)。 这显然是幻觉-######################基线,我们无法重现贝洛等人报告的1.5%。 (2016年)(也使用基于LSTM的批评家),但是我们的复制比其他人报道的要近(Dai等人,2017; Nazari等人,2018)。 在表1中,我们将其与原始结果进行了比较。 与推出基线相比,指数基线每历元快20%,而注释者基线慢13%(请参阅附录B.5),因此如果将时间用作x轴,则图片不会发生明显变化。
6讨论
在这项工作中,我们介绍了一种模型和训练方法,它们都有助于大大改善TSP的学习启发式方法的结果,并且还可以为传统的问题特定方法解决的多个路由问题提供强大的(单一构造)启发式方法。 我们认为,如果将图上定义的其他组合优化问题的解决方案描述为顺序决策,那么我们的方法将是学习启发式学习的有力起点。 在实践中,操作约束通常会导致许多问题的变体,而对于这些问题,没有好的(人为设计的)启发式方法可用,因此学习启发式方法的能力可能具有很大的实用价值。
与以前的工作相比,通过使用注意力代替递归(LSTM),我们将不变性引入节点的输入顺序,从而提高了学习效率。 此外,这还可以实现并行化,以提高计算效率。 多头注意力机制可以看作是一种消息传递算法,该算法允许节点通过不同的通道传递相关信息,从而使来自编码器的节点嵌入可以学习在图形的上下文中包含有关该节点的有价值的信息。 在决策直接与图中的节点相关的环境中,此信息非常重要。 作为一种基于图的方法,我们的模型具有更大的缩放潜力(与LSTM相比),因为它可以应用于稀疏图并在本地运行。
扩展到较大的问题实例是未来研究的重要方向,我们认为我们已经通过使用基于图的方法迈出了重要的第一步,可以对其进行稀疏化以提高计算效率。 另一个挑战是,许多具有实际重要性的问题都具有通过简单的掩蔽程序无法满足的可行性约束,并且我们认为研究启发式学习和回溯相结合是否能够解决这些问题是有希望的。 这将释放我们的方法的潜力,而该方法已经比流行的Google OR Tools项目具有很高的竞争力,甚至可以解决更大范围的难题。
附录-vrp模型
Capacitated Vehicle Routing Problem (CVRP) 是 TSP 的泛化,在这种情况下,有一个站点,并且应该创建多条路线,每条路线都在站点开始和结束。 在我们基于图形的公式中,我们添加了一个索引为 0 且坐标为 x0 的特殊仓库节点。 车辆(路线)的容量 D > 0 并且每个(常规)节点 i 2 f1; : : : ng 有一个需求 0 < i D。每条路由从 P 开始,在 depot 结束,每条路由的总需求不应超过容量,所以 i2Rj i D,其中 Rj 是节点 分配给路径 j 的索引。 不失一般性,我们假设归一化 ^D = 1,因为我们可以使用归一化需求 ^ i = i D。
Split Delivery VRP (SDVRP) 是 CVRP 的概括,其中每个节点都可以被多次访问,并且每次访问时只需交付需求的一个子集。 CVRP 和 SDVRP 的实例都以相同的方式指定:大小为 n 的实例作为仓库位置 x0,n 个节点位置 xi; i = 1 : : : n 并且(归一化)要求 0 < ^ i 1; 我 = 1 : : : n。
C.1 实例生成
我们遵循 Nazari 等人。 (2018) 在 n = 20 的实例生成中; 50; 100,但按容量标准化需求。 在单位正方形中随机均匀地对站点位置以及 n 个节点位置进行采样。 需求定义为 ^ i = i Dn 其中 i 是离散的并且从 f1 均匀采样; : : : ; 9g 且 D20 = 30、D50 = 40 且 D100 = 50。
C.2 VRP 注意力模型
编码器 为了让我们的注意力模型能够将 depot 节点与常规节点区分开来,我们使用单独的参数 Wx 0 和 bx 0 来计算 depot 节点的初始嵌入 h(0) 0 。 此外,我们提供归一化需求 i 作为输入特征(并相应地调整参数 Wx 的大小):
公式(19)
容量约束 为了促进容量约束,我们跟踪节点 i 2 f1; 的剩余需求 ^ i;t; : : : ng 和剩余车辆容量 ^D t 在时间 t。 在 t = 1 时,它们被初始化为 ^ i;t = ^ i 和 ^D t = 1,之后它们更新如下(回想一下,t 是在解码步骤 t 中选择的节点的索引):
公式(20,21)
如果我们不允许拆分交付,对于所有 t,^ i;t 将为 0 或 ^ i。
解码器上下文 时间 t 处 VRP 的解码器上下文是当前/最后位置 t1 和剩余容量 ^D t。 与 TSP 相比,如果 t = 1,我们不需要占位符,因为路由从站点开始,我们不需要提供有关第一个节点的信息,因为路由应该在站点结束:
公式(22)
掩码可以多次访问仓库,但我们不允许在两个后续时间步长访问它。 因此,在解码器的两层中,我们更改了库 j = 0 的掩码,并定义 u©0 = 1 当(且仅当)t = 1 或 t1 = 0。 节点取决于我们是否允许拆分交付。 在没有拆分交付的情况下,如果节点的剩余需求为 0(如果该节点已被访问过)或超过剩余容量,我们将不允许访问节点,因此对于 j 6= 0,我们定义 u©j = 1 if ( 并且仅当) ^ i;t = 0 或 ^ i;t > ^D t。 对于拆分交付,我们仅在剩余需求为 0 时禁止交付,因此我们定义 u©j = 1 当(且仅当)^ i;t = 0。
拆分交付 没有拆分交付,剩余需求 ^ i;t 为 0 或 ^ i,对应于该节点是否已被访问,并且该信息通过对已访问节点的掩码传达给模型。 但是,当允许拆分交付时,剩余需求 ^ i;t 可以取任何值 0 ^ i;t ^ i。 此信息不能包含在上下文节点中,因为它对应于单个节点。 因此,我们将其包含在注意力层(glipse)和解码器输出层的键和值的计算中,以便我们使用以下方法计算查询、键和值:
公式(23)
在这里,我们 WK d 和 WV d 是 (dk 1) 个参数矩阵,我们为仓库 i = 0 定义了 ^ i;t = 0。对 hi 和 ^ i;t 的投影求和相当于对串联进行投影 [你好; ^ i;t] 具有单个 ((dh + 1) dk) 矩阵 WK。 然而,使用这个公式,我们只需要计算第一项一次(而不是每个 t),并且通过权重初始化,这使 ^ i;t 开始变得更加重要(否则它只是 dh + 1 = 129 个输入值中的 1 个) )。
训练 对于 VRP,模型输出的长度取决于访问 depot 的次数。 一般来说,depot 会被多次访问,在 SDVRP 的情况下,一些常规节点也会被访问两次。 因此,解决方案的长度大于 n,这需要更多内存,因此我们发现有必要将批量大小 B 限制为 256,因为 n = 100(在 2 个 GPU 上)。 为了保持训练时间易于处理并且参数更新的总数相等,我们仍然每个 epoch 处理 2500 个批次,每个 epoch 总共有 0.64M 训练实例。
C.3 基线细节
对于 Helsgaun (2017) 的 LKH38,我们使用 CVRP runscript9 中指定的 SPECIAL 参数构建和运行他们的代码。 我们执行最多 10000 次试验的 1 次运行,因为我们发现执行 10 次运行只会略微提高结果的质量,同时花费更多的时间。
C.4 示例解决方案
图 7 显示了 n = 100 的 CVRP 示例解决方案,这些解决方案是通过使用具有贪婪解码的模型的单一构造获得的。 这些可视化提供了对模型学习的启发式的洞察。 一般来说,我们看到该模型构建了从底部到顶部的路线,从仓库下方开始。 大多数路线都是密集的,除了最后一条路线必须为一些剩余的(彼此靠近的)客户提供服务。 在大多数情况下,路线中距离仓库最远的节点位于路线中间的某处,这样客户在往返于最远节点的途中得到服务。 在某些情况下,我们发现某些单独路线中的停靠点顺序不是最佳的,这意味着该方法可能会受益于顶部的简单进一步优化,例如波束搜索、基于局部搜索的后处理程序(例如 2OPT) 或使用 TSP 求解器求解单个路径。