论文解读 张云天,王飞龙
编者按:
旅行商问题(Traveling Salesman Problem, TSP)是著名的组合优化问题,属于 NP-hard 问题。例如,给定一个分布在不同位置的客户列表,如何规划访问顺序才能使总旅行路径最短。随着客户数量增加,获取最优解的复杂度也呈指数级增加。当客户数量达到数千个及其以上时,获取次优解也需要花费大量的计算时间,或者在较短时间内难以获取高质量的解。这限制了其在实际问题尤其是规模较大且对求解效率要求较高的场景中的应用,如快递配送中的实时订单调度等 [1]。
近年来基于机器学习的算法已经被尝试应用于求解TSP。『运筹OR帷幄』曾经深度解读由美国人工智能协会主办的顶级学术会议 AAAI’2021 中一篇优秀文章《Generalize a Small Pre-trained Model to Arbitrarily Large TSP Instances》。解读旧文重温:OM | 机器学习算法求解更大规模的旅行商问题
本文中,我们解读 AAAI’2023 的一篇新作。该文章由微软亚洲研究院、华中科技大学、中国科学技术大学等合作完成,是应用机器学习技术求解大规模TSP问题的新成果 [2]。
本文提出了一个端到端的基于分层强化学习的方法 H-TSP 来解决此问题。该方法包含两层策略:上层策略用于将原始的规模较大的问题拆解成多个规模较小的子问题;下层策略解决每个子问题并将子方案合并形成原始问题的解决方案。通过实验对比发现,H-TSP 方法能够较好地协调效果与效率时间的平衡。同目前最高效的基于搜索的方法相比,该方法能够在仅损失4%效果的情况下,将求解时间从395秒降低到3.4秒。这也是首个达成处理超过10000的客户规模的端到端方法 [1]。
引言
旅行商问题(Traveling Salesman Problem, TSP)是著名的组合优化问题,属于 NP-hard 问题。学者们已设计诸多精确求解器和启发式算法来求解TSP,例如Concorde,LKH等。但是,它们都非常复杂,由许多设计巧妙的规则组成,并严重依赖于专家知识。为了克服这些局限性,近年来基于机器学习的算法已经被尝试应用于求解TSP。
总的来说,求解TSP的机器学习算法可以分为两类,“迭代寻优”(Iterative)和“步步构造”(Constructive)。
•“迭代寻优”类方法中,初始解即为一个可行解(Feasible solution),核心是设计一个可以不断提升解质量的更新策略。但其相对耗时(Time-consuming)。
•“步步构造”类方法中,算法从第一个城市开始,逐步访问所有城市直至形成完整TSP环游(即一个可行解)。其在推断(Inference)速度上具备优势,但其动作空间随城市规模线性增长,使其面临较重的计算负担。
综上,本文基于“分而治之”(Divide-and-conquer),“问题分解”(Problem Decomposition)的思想,设计了一种分层强化学习方法,以求解大规模TSP。该方法首先利用上层策略将原始规模较大的问题拆解成多个规模较小的子问题,其次应用下层策略解决每个子问题并将子方案合并形成原始问题的解决方案。上层和下层策略以端到端(End-to-end)的方式,基于强化学习算法协同训练。实验结果证实了所提出算法与SOTA对比算法的竞争力,并凸显了其在推断时间上的优势(不到4秒)。同时,算法用到的“分而治之”、“问题分解”的思想或可助力其他复杂、大规模优化问题的高效求解。
算法整体流程
首先定义一个概念:开环TSP(Open-loop TSP)。给定一个无向图
G
=
(
V
,
E
)
G=(V, E)
G=(V,E),开环TSP有两个特殊节点:源节点
v
s
v_s
vs和目标节点
v
t
v_t
vt。开环TSP的一个可行解不再是一个环,而是一条不封闭的路径。这条路径从源节点
v
s
v_s
vs出发,经过且仅经过其他节点一次,并终止于目标节点
v
t
v_t
vt。易知,两个开环TSP的解可以被合并为一条闭环路径。
算法整体流程如 Algorithm 1 所示。一个完整的TSP环游始于基地,并搜索距离基地最近的点,这两个点作为第一个子问题的fixed endpoints。随后,路径 τ \tau τ断被构造更新,直至形成完整环游。上层策略负责分解问题,与聚合下层策略生成的部分解。每识别和分解出一个子问题,下层策略即将其作为开环TSP求解并返回结果。通过这种自适应、动态的方式,H-TSP有效削弱了分解问题对解质量带来的不良影响。
上层策略(Upper-Level Model)
上层策略主要是采用分治的思想**(Divide-and-conquer)**用来将较大规模的TSP问题进行分解,同时不会对最终的求解结果产生较大的影响。文中的分解方法同之前论文的分解方法的不同之处在于:所有的子问题的生成不是一步到位的,二是在上层模型和下层模型交互训练的过程中动态生成的,从而上层模型可以更好地利用交互训练过程中的信息,可以更好地学习一种自适应的策略,基于某个状态的信息(i.e., 当前的partial route和剩余节点信息)做出更好的决策。
可扩展的编码器
在对大规模TSP问题进行编码时,一个比较大的难点在于网络中边的数量过于庞大,使得编码信息过多。文章借助了3D点云投影中的处理技术,提出了一种Pixel Encoder,将问题网络作为图像处理。具体处理过程如下:
•首先将TSP问题所在的2D网络进行离散化,等距离划分到一个 H × W H×W H×W的网格之中,创建一个像素点集合;
•之后对于TSP问题中的节点,根据其所处的不同的网格,将其划分到不同的聚类之中;
•为了进一步提出每个节点的特征,文章针对每个节点创建了一个特征向量: ( x a , y a , Δ x g , Δ y g , Δ x c , Δ y c , x p r e , y p r e , x n x t , y n x t , m s e l e c t ) (x_a,y_a,\Delta x_g, \Delta y_g, \Delta x_c, \Delta y_c, x_{pre}, y_{pre}, x_{nxt}, y_{nxt},m_{select}) (xa,ya,Δxg,Δyg,Δxc,Δyc,xpre,ypre,xnxt,ynxt,mselect),其中 ( x a , y a ) (x_a,y_a) (xa,ya)表示节点的坐标信息, ( Δ x g , Δ y g ) (\Delta x_g, \Delta y_g) (Δxg,Δyg)和 ( Δ x c , Δ y c ) (\Delta x_c, \Delta y_c) (Δxc,Δyc)分别表示节点所在的网格中心和聚类中心的坐标信息;如果节点已经被访问过了,则令 ( x p r e , y p r e , x n x t , y n x t ) (x_{pre}, y_{pre}, x_{nxt}, y_{nxt}) (xpre,ypre,xnxt,ynxt)表示其在partial route中的近邻节点的坐标信息,若节点没有被访问,则上述四个信息值为0;最后 m s e l e c t m_{select} mselect表示当前结点是否被访问过了
•对于具有 N N N个节点的TSP算例,首先初始化一个大小为 ( N , D ) (N,D) (N,D)的tensor,其中 D = 11 D=11 D=11表示每个节点特征向量的维度;
•之后将初始化的tensor进行线性层高维映射为一个维度为 ( N , C ) (N,C) (N,C)的 高维tensor;
•根据节点的聚类信息,针对每一个网格的 C C C个channel使用max pooling,针对空的网格不使用padding
•将处理完之后的网格进行组合,获得维度为 ( H × W × C ) (H×W×C) (H×W×C)的tensor,称之为pseudo-image
•将获得的pseudo-image放到CNN中进行特征提取,最终得到整个TSP算例的embedding向量
子问题生成与聚合
子问题的生成过程如Algorithm 2所示。算法需要输入问题网络图结构
G
k
N
N
=
(
V
,
E
)
G_{kNN}=(V,E)
GkNN=(V,E)(带每个节点的k个最近邻域节点,称之为KNN图),当前上层模型中在
t
t
t时间步已经得到的路径序列
τ
t
=
{
v
t
1
,
v
t
2
,
.
.
.
}
\tau_t=\{v_t^1,v_t^2,...\}
τt={vt1,vt2,...},子问题的节点数量
s
u
b
L
e
n
g
t
h
subLength
subLength,未访问的节点数量
m
a
x
N
u
m
maxNum
maxNum,上层模型
u
p
p
e
r
M
o
d
e
l
upperModel
upperModel;算法会最终输出子问题需要访问的节点集合
P
P
P和子问题的open loop的源点
v
s
v_s
vs和汇点
v
t
v_t
vt。
•算法首先通过上层模型获得 τ t \tau_t τt中 t t t时间步下的最后一个节点 C o o r d p r e d Coord_{pred} Coordpred,之后在未访问的节点集合中找距离 C o o r d p r e d Coord_{pred} Coordpred最近的节点记为 v c v_c vc,之后在 τ t \tau_t τt中寻找距离 v c v_c vc最近的节点记为 v b v_b vb;
•建立一个队列数据结构 Q n e w Q_{new} Qnew,将 v b v_b vb压入到 Q n e w Q_{new} Qnew中,之后在未访问的节点集合中寻找距离 Q n e w Q_{new} Qnew头节点最近的 k k k个节点集合,以此来扩充子问题的节点序列 P P P,同时将这 k k k个节点集合再添加到 Q n e w Q_{new} Qnew中(利用队列先进先出的特点)
•最终为了将选出的节点融入到 τ t \tau_t τt中,需要在 τ t \tau_t τt中选定 s u b L e n g t h − l e n ( P ) subLength-len(P) subLength−len(P)个节点组成的片段 P t P_t Pt,使用 P t P_t Pt片段将 τ t 进行分割,从而自然产生了源点 v s \tau_t进行分割,从而自然产生了源点v_s τt进行分割,从而自然产生了源点vs和汇点 v t v_t vt,将子问题的节点序列 P P P结合 P t P_t Pt作为最终的子问题节点序列,和源点 v s v_s vs, v t v_t vt一同输入下层模型进行子问题的求解。
马尔科夫决策过程(Markov Decision Process, MDP)
定义MDP为 M G = < S , A , P , R , γ > M_G=<S,A,P,R,\gamma> MG=<S,A,P,R,γ>,其中:
S S S表示状态集合,即不同的partial route
$A 表示动作集合,即 表示动作集合,即 表示动作集合,即[0,1]×[0,1]$单位网格中的所有节点
P P P表示在给定上层和下层策略之后的确定的状态转移函数
R R R表示奖励函数,如从状态 τ ′ \tau' τ′执行动作 a a a之后到状态 τ \tau τ的奖励函数 R ( τ , a , τ ′ ) = L ( τ ′ ) − L ( τ ) R(\tau, a, \tau')=L(\tau')-L(\tau) R(τ,a,τ′)=L(τ′)−L(τ)
γ \gamma γ表示奖励折减系数,在文章中置为1
下层策略(Lower-Level Model)
下层策略旨在求解开环TSPs(Open-loop TSPs)。下层策略将在训练和推断过程中被反复调用,亟需高效的设计。本文参考了先前求解小规模TSP的优秀工作,加以改进,设计了下层策略。
下层策略的网络架构应用Transformer。编码器的输入特征,先前工作设计为 q c o n t e x t = q g r a p h + q f i r s t + q l a s t q_{context}=q_{graph}+q_{first}+q_{last} qcontext=qgraph+qfirst+qlast
其中, q g r a p h , q f i r s t , q l a s t q_{graph}, q_{first}, q_{last} qgraph,qfirst,qlast分别表示整张图的特征,当前部分解的起点与终点特征。但是这些特征不足以求解开环TSP,本文因此引入两个新的特征,对应开环TSP的两个endpoints q c o n t e x t = q g r a p h + q f i r s t + q l a s t + q s o u r c e + q t a r g e t q_{context}=q_{graph}+q_{first}+q_{last}+q_{source}+q_{target} qcontext=qgraph+qfirst+qlast+qsource+qtarget
类似上层策略一节,可以定义下层策略的MDP。请感兴趣的读者参见原文。
策略训练
本文应用Proximal Policy Optimization (PPO) 算法训练上层策略,REINFORCE算法训练下层策略。两种强化学习方法均是经典方法,论文原文 [2] 也给出了主要依据和公式,在此不再赘述。
本文进一步设计了协同训练(Joint Training)方法。下层策略生成并为上层策略的训练提供轨迹;同时,上层策略生成的子问题被存储下来训练下层策略。两层策略以一种类似“交叉存取”(Interleaving)的方式协同训练。注意到,同时后期实验也证实了,下层策略对解质量影响更大。如果一开始随机生成下层策略,上层策略会收到不良的反馈,训练难以收敛。因此,本文为下层策略设计了warm-up机制,即预训练一个策略。实验表明warm-up机制提升了训练的稳定性与收敛性。
实验结果
为充分评估算法的性能,本文在大量的TSP算例上进行了实验,并与6种先进的算法进行对比,包括:Concorde, LKH-3, OR-Tools, POMO, DRL-2opt, Att-GCN+MCTS(对这些主流/先进对比算法细节感兴趣的读者可移步论文原文)。实验中生成了四个不同规模的TSP数据集,分别为Random1000, Random2000, Random5000, Random10000。所有实验在一台配备NVIDIA®Tesla V100 (16GB) GPU和Intel® Xeon® Platinum CPU的机器上运行。
Table 1展示了所提出的H-TSP与六种对比算法的结果,主要从解的质量(Gap: %)和求解时间(Time: s)两个角度展现。其中,Concorde由于计算时间受限,难以在5000和10000规模的数据集上测试。可以看到POMO和DRL-2opt两种对比算法在大规模TSP中表现较差。而H-TSP在保证Gap较小的同时,拥有数量级降低的推断时间,这对于实时性要求较高的实际场景很有益。此外,本文还探讨了H-TSP的泛化(Generalization)性能,尤其是从小规模TSP到大规模TSP的泛化能力,实验结果见Figure 1。
本文进一步开展消融实验(Ablation Study),探讨上层和下层策略设计的有效性与发挥的作用,如Figure 2所示。其中,上层策略的替代方案为一种随机策略(Random policy),下层策略的替代方案为启发式策略Farthest Insertion [4]。实验证实了上、下层策略的设计都很有必要,且下层策略发挥的作用更甚。
在TSP这类路径规划问题中,启发式算法LKH-3表现出卓越的性能。结合消融实验得到的结论,本文将下层策略替换为LKH-3并进行实验,实验结果见Table 2。配备了LKH-3的H-TSP算法相较于原始H-TSP,在求解性能上有进一步的提升,但计算耗时也有所增加,不过仍低于Att-GCN+MCTS许多。
本文还对生成子问题(Sub-Problem Generation)过程中的一些算法与训练策略进行了消融实验,详细实验结果见Table 3。值得注意的是,去除warm-up机制(即w/o warm-up一栏)后解的Gap大幅提升,论证了warm-up机制在下层策略中的重要性。如前文所述,warm-up机制通过预训练一个下层策略,提升了训练的稳定性与收敛性。
总结
本文基于“分而治之”、“问题分解”的思想提出了一种分层强化学习框架H-TSP,用以求解大规模TSP。四个不同规模数据集上的大量实验证明了算法的性能与计算效率。通过消融实验,本文验证了所设计策略的有效性,并探索了利用诸如LKH-3这样的先进启发式算法进一步提升下层策略的可行性。进一步地,本文提出的设计思想,或将助力其他复杂、大规模优化问题(如车辆路径规划、车间调度)的高效求解。
[1] https://www.msra.cn/zh-cn/news/features/aaai-2023-industrial-applicable-ai
[2] (论文原文) Xuanhao Pan, Yan Jin, Yuandong Ding, Mingxiao Feng, Li Zhao, Lei Song, & Jiang Bian. (2023). H-TSP: Hierarchically Solving the Large-Scale Traveling Salesman Problem. In Proceedings of the AAAI Conference on Artificial Intelligence. 附PDF链接:https://www.microsoft.com/en-us/research/uploads/prod/2023/02/8643.PanX_.pdf
[3] Lang, A. H., Vora, S., Caesar, H., Zhou, L., Yang, J., & Beijbom, O. (2019). Pointpillars: Fast encoders for object detection from point clouds. In Proceedings of the IEEE/CVF conference on computer vision and pattern recognition (pp. 12697-12705).
[4] Rosenkrantz, D. J., Stearns, R. E., & Lewis, P. M. (1974, October). Approximate algorithms for the traveling salesperson problem. In 15th Annual Symposium on Switching and Automata Theory (swat 1974) (pp. 33-42). IEEE.