【算法】LNS(大邻域算法)和ALNS(自适应大邻域算法)(持更)(未完)

壹、LNS算法

一、 PDPTW(带时间窗口的装卸问题)

参考文章:《求解PDPTW问题的快速LNS》

问题描述 (原文)
假设 G G G为所有客户的集合, n n n为集合里客户的个数。对每个客户 i ∈ G i \in G iG,要求将质量为 l i l_i li的货从装货点 P i + P_i^+ Pi+运到卸货点 P i − P_i^- Pi. V V V为车辆 v v v的集合; Q v Q^v Qv为车辆 v v v的最大容量; O O O为车库的集合;设 P + ≡ ⋃ i ∈ G P i + P^+ \equiv \bigcup_{i \in G} P^+_i P+iGPi+ , 即为所有装货点的集合, P − ≡ ⋃ i ∈ G P i − P^- \equiv \bigcup_{i\in G}P^-_i PiGPi,即为所有卸货点的集合,设 P ≡ P + ⋃ P − P \equiv P^+ \bigcup P^- PP+P,即为所有访问点的集合;设 N = P ⋃ O N=P\bigcup O N=PO,即运输网络里所有结点的集合。要指出的是,不同的节点可能代表相同的物理位置。这样就区分了客户、他们的装卸货地点以及网络中的结点。
设结点 i , j ∈ N i,j\in N i,jN, 则 i i i处的时间窗口为 [ a i , b i ] [a_i,b_i] [ai,bi], 车辆到达 i i i处的时刻为 A i A_i Ai, i i i被服务的开始时间为 T i T_i Ti, 服务 i i i所需要的时间为 f i f_i fi. i , j i,j i,j两个节点之间的距离、行驶时间和代价分别用 d i , j , t i , j , c i , j d_{i,j},t_{i,j},c_{i,j} di,j,ti,j,ci,j表示。

约束条件 (原文)
R v R_v Rv为车辆 v v v行驶的完整路径, R v R_v Rv是一个排序(排序的原因是结点只能出现一次),车辆 v v v按此顺序访问节点,记作:
( R v 1 , R v 2 , ⋯   , R v l ) , R v j ∈ P , j = 2 , ⋯   , J − 1 (R_v^1,R_v^2,\cdots,R_v^l), R_v^j \in P, j=2,\cdots, J-1 (Rv1,Rv2,,Rvl),RvjP,j=2,,J1
P v = { R v j ∣ j = 2 , 3 , ⋯   , J − 1 } P_v=\{R^j_v \vert j=2,3,\cdots,J-1\} Pv={Rvjj=2,3,,J1} P P P的一个子集。 R v R_v Rv需满足:

  1. 车辆从车库出发并最终返回车库,即: R 1 v ∈ O , R v J ∈ O R1_v \in O,R^J_v \in O R1vO,RvJO.
  2. 成对(Pairing)约束。 对所有 i ∈ G , P i + i \in G, P^+_i iG,Pi+ P i − P^-_i Pi要么同时属于 P v P_v Pv,要么都不属于
  3. 次序(Precedence)约束。 如果 P i + P^+_i Pi+ P i − P^-_i Pi同时属于 P v P_v Pv,则 P i + P^+_i Pi+必须在 P i − P^-_i Pi之前访问。
  4. 访问约束。 P v P_v Pv里的而每个结点在 R v R_v Rv中只能出现1次。
  5. 装载容量约束。 任何时刻车辆 v v v所载的货物质量不能超过 Q v Q^v Qv.
  6. 时间窗口约束。 对于所有的 i ∈ N i \in N iN, 必须满足 T i ∈ [ a i , b i ] T_i \in [a_i,b_i] Ti[ai,bi],其中, T i = m a x { A i , a i } T_i=max\{A_i,a_i\} Ti=max{Ai,ai}(如果 A i < a i A_i Ai<ai,车辆必须在 i i i点等待)。

目标函数(原文)
PDPTW问题的目的就是使运输的总成本最小,那么PDPTW的目标函数就是从运输成本考虑的。运输成本包括下面几个方面:
每使用一辆车都有固定的成本,因此应使用的车辆总数最小;车辆每行驶1km都要耗费汽油及车辆本身的磨损,因此应使行驶总距离最少;司机每工作1h都有代价,特别是超出正常工作时间外每小时的代价将大大提高,因此应使服务客户用的总时间最小。

由于车辆行驶的距离和司机工作的时间之间有直接的联系,因此本文中总的运输成本包含总的车辆数目和全部车辆行驶的总路程,要使者两项同时达到最优往往很难满足。因此,采用加权因子的办法,根据他们对总成本的影响能力,分别指定加权系数,组成一个单目标问题。

决策变量(原文)
PDPTW 的决策变量包括完成客户需求所用到的所有车辆数目每辆车访问客户节点的顺序每辆车访问客户节点的时间

二、快速LNS算法

2.1 初始可行解获得(采用 插入算法)

  1. L L L为所有未安排的客户集合。(或:未拜访过的站点集合)
  2. 对每个未安排的客户,找出它在当前构造的解中插入代价最小的客户,将其插入当前解中,如果是第一个客户或者没有可行插入位置,则新安排一辆车给此客户
  3. L L L中删除被插入的客户。
  4. 如果L为空,停止;否则跳转到步骤2

2.2 快速LNS算法的两个关键过程。

对Remove选择客户过程和Re-insertion重新插入新客户过程这两个步骤采用不同的策略。

☀️ Remove 过程。

用符号 s s s表示当前解, c c c表示要被移走的客户, W W W表示所有被移走客户组成的集合, n n n表示要被移走的客户数目, s ′ s' s表示移除 n n n个客户后剩下的部分解

第一阶段 主要以减少车辆数目为目标。在此阶段有限选择具有较少客户的车辆(短路径)所服务的客户放入 W W W中,并通过这些被选出的客户,选择预期有较大关联性的客户(距离,时间窗口接近并且未被选出),以此扩大可交换邻域,加快车辆数目的减少。

第二阶段 减少所有车辆总路程为主,并以减少车辆数目为辅。 因第一阶段主要以减少车辆数目为目标,在此阶段,车辆数目将很难有进一步的减少,因此此阶段的主要目标为减少总的行驶路程。在仿真中发现,总路程的迅速增加主要由于少数客户引起所在车辆路径的行驶形成迅速增大,所以移动这类客户到其他位置对于减少总路程很有效。

以上两个规则简单归纳如下:
a. 短路径优先法。 路径中客户数目越少,客户越容易被选中(减少车辆数目)。
b. 最大代价客户优先发。 客户对一辆车行驶路程的增加贡献越大,越容易被选中(减少车辆总行驶路程)。

注: 本文在第一阶段采用规则a., 在第二阶段对两个规则采用加权值的方法,假设规则a. 和规则b. 的权值系数分别为 w 1 , w 2 w_1, w_2 w1,w2, 则 w 1 w_1 w1偏小, w 2 w_2 w2偏大。

☀️ Re-insertion过程

按照给定规则从 W W W中选择最合适的客户,插回 s ′ s' s中,“最合适客户”在这里包括两层意思:首先,选择客户的顺序能够使得总的目标函数与之前可行解相比逐步递减;其次,这样的选择在最终必须能得到可行解。在这个过程中,针对两个不同的阶段,采用不同的Re-insertion规则。

第一阶段 主要以减少车辆数目为目标。在此阶段,Re-insertion 主要考虑将选出的短路径中的客户插入长路径中间,由此达到减少车辆数目。

第二阶段 减少所有车辆总路程为主。 在此阶段,采用贪婪法或者Regret-2规则,选择最合适的客户插回 s ′ s' s中,这三种规则则介绍如下:

a. 短路径插入长路径。 根据每辆车访问客户数目多少,对所有的车辆从客户多到少排序,从 W W W中选择一个客户 c c c,依次尝试将 c c c插入 s ′ s' s中,若 c c c原来所在路径的客户数目少于找到的当前可行路径,则将 c c c插入至此可行路径中间。

b. 贪婪法。 假设从 W W W中选一个客户 c c c,将 c c c重新插回 s ′ s' s中的最小代价为 Δ f i , k \Delta f_{i,k} Δfi,k, i i i为客户序号, k k k s ′ s' s的第 k k k条路径, s ′ s' s中共有 K K K条路径,定义 a d d C o s t i = min ⁡ Δ f i , k , k ∈ K addCost_i=\min \Delta f_{i,k}, k\in K addCosti=minΔfi,k,kK,则选择使 c ∗ = min ⁡ c i , i ∈ W c^* =\min c_i, i\in W c=minci,iW最小的客户 i i i重新插回 s ′ s' s中。

c. Regret-2法。 W W W中选择一个客户 c c c, 将 c c c重新插回 s ′ s' s中的最小代价为 Δ f i , k \Delta f_{i,k} Δfi,k,次小代价 Δ i , j \Delta_{i,j} Δi,j. 则定义 c ∗ = min ⁡ ( Δ f i , j − Δ f i , k ) , i ∈ W ; j , k ∈ K c^* = \min (\Delta f_{i,j}-\Delta f_{i,k}),i \in W; j,k \in K c=min(Δfi,jΔfi,k),iW;j,kK, 选择使 c ∗ c^* c最小的客户 i i i插回 s ′ s' s中。

2.3 快速LNS算法

1) 利用插入算法构造初始解
2)先设定移出客户数 n n n的最大值 P m a x P_{max} Pmax,迭代最大次数 I t e r m a x Iter_{max} Itermax,初始令 n = 1 , i t e r = 1 n=1, iter=1 n=1,iter=1/
3) 如果 i t e r < I t e r iter< Iter iter<Iter, 结果Remove规则,从 s s s中移出 n n n个客户。
4) 根据Re-insertion中的规则,选择最合适的点插回 s ′ s' s中,若得到改进解,则 i t e r = 1 iter=1 iter=1,转(3);
否则 i t e r = i t e r + 1 iter=iter+1 iter=iter+1,转(3)。
5) 如果 i t e r = I t e r m a x iter=Iter_{max} iter=Itermax,则 n = n + 1 n=n+1 n=n+1,如果 n = P m a x n=P_{max} n=Pmax,退出循环,否则转(2).

第一阶段中的(3)采用Remove规则a.,通过一次选择短路径中所有客户外加其余路径中和短路径中
客户相关性最大的其余客户组成待选集 W W W,若能将这些客户安排至其余路径。(4)采用Re-insertion
规则a., 优先选择待选集 W W W中属于原来短路径中的客户,将其安排到其他路径中间,若在其他路径中
无可行插入位置,则将其安排回初始移出路径中,这样做的目的是能够迅速跳出局部极小店的吸引区域。

第二阶段中(3)采用Remove规则b.,(4)结合Re-insertion规则b.和c.,主要目标是减少总的行驶路程。

快速LNS算法的结束条件

a. 迭代过程达到一定次数,
b. 到达一定计算时间。
c. 当前解的目标函数与预定值的差距在一定范围内。
d. 前面几项的组合

ALNS

参考资料:
《自适应大邻域搜索(ALNS)算法求解带时间窗的车辆路径规划问题(附java代码》
《自适应大邻域搜索(Adaptive Large Neighborhood Search)入门到精通超详细解析-概念篇》

其他算法

《【优化算法】变邻域搜索算法(VNS)求解TSP(附C++详细代码及注释)》

《干货 | 模拟退火、禁忌搜索、迭代局部搜索求解TSP问题Python代码分享》

《蚁群算法求解带时间窗的车辆路径规划问题详解(附Java代码)》

你可能感兴趣的:(车辆路径规划问题,算法,ALNS)