VRPTW:蜣螂优化算法DBO求解带时间窗的车辆路径问题(Vehicle Routing Problem with Time Windows, VRPTW)提供MATLAB代码

一、VRPTW

1.1模型简介

带时间窗的车辆路径问题(Vehicle Routing Problem with Time Windows, VRPTW)是车辆路径问题(VRP)的一种拓展类型。VRPTW一般指具有容量约束的车辆在客户指定的时间内提供配送或取货服务,在物流领域应用广泛,具有重要的实际意义。VRPTW常规模型如下:VRPTW模型详细介绍

min ⁡ f ( x ) = 1000 ∑ k ∈ K ∑ j ∈ Δ + ( 0 ) x 0 j k + ∑ k ∈ K ∑ ( i , j ) ∈ A c i j x i j k ∑ k ∈ K ∑ j ∈ Δ + ( i ) x i j k = 1 ∀ i ∈ N ( 1 ) ∑ j ∈ Δ + ( 0 ) x 0 j k = 1 ∀ k ∈ K ( 2 ) ∑ i ∈ Δ − ( j ) x i j k − ∑ i ∈ Δ + ( j ) x j i k = 0 ∀ k ∈ K , ∀ j ∈ N ( 3 ) ∑ i ∈ Δ Δ − ( n + 1 ) x i , n + 1 , k = 1 ∀ k ∈ K ( 4 ) w i k + s i + t i j − w j k ≤ ( 1 − x i j k ) M i j , ∀ k ∈ K , ∀ ( i , j ) ∈ A ( 5 ) a i ( ∑ j ∈ Δ + ( i ) x i j k ) ≤ w i k ≤ b i ( ∑ j ∈ Δ + ( i ) x i j k ) ∀ k ∈ K , ∀ i ∈ N ( 6 ) E ≤ w i k ≤ L ∀ k ∈ K , ∀ i ∈ { 0 , n + 1 } ( 7 ) ∑ i ∈ N d i ∑ j ∈ Δ + ( i ) x i j k ≤ C ∀ k ∈ K ( 8 ) x i j k ≥ 0 ∀ k ∈ K , ∀ ( i , j ) ∈ A ( 9 ) x i j k  binary  ∀ k ∈ K , ∀ ( i , j ) ∈ A ( 10 ) \begin{array}{l} \min f(x)=1000 \sum_{k \in K} \sum_{j \in \Delta^{+}(0)} x_{0 j k}+\sum_{k \in K} \sum_{(i, j) \in A} c_{i j} x_{i j k} \\\\ \sum_{k \in K} \sum_{j \in \Delta^{+}(i)} x_{i j k}=1 \quad \forall i \in N \quad \quad \quad (1)\\ \sum_{j \in \Delta^{+}(0)} x_{0 j k}=1 \quad \forall k \in K \quad \quad \quad (2)\\ \sum_{i \in \Delta-(j)} x_{i j k}-\sum_{i \in \Delta^{+}(j)} x_{j i k}=0 \quad \forall k \in K, \forall j \in N \quad \quad \quad (3)\\ \sum_{i \in \Delta \Delta^{-(n+1)}} x_{i, n+1, k}=1 \quad \forall k \in K\quad \quad \quad (4) \\ w_{i k}+s_{i}+t_{i j}-w_{j k} \leq\left(1-x_{i j k}\right) M_{i j}, \forall k \in K, \forall(i, j) \in A \quad \quad \quad (5)\\ a_{i}\left(\sum_{j \in \Delta^{+}(i)} x_{i j k}\right) \leq w_{i k} \leq b_{i}\left(\sum_{j \in \Delta^{+}(i)} x_{i j k}\right) \quad \forall k \in K, \forall i \in N \quad \quad \quad (6)\\ E \leq w_{i k} \leq L \quad \forall k \in K, \forall i \in\{0, n+1\} \quad \quad \quad (7)\\ \sum_{i \in N} d_{i} \sum_{j \in \Delta^{+}(i)} x_{i j k} \leq C \quad \forall k \in K \quad \quad \quad (8) \\ x_{i j k} \geq 0 \quad \forall k \in K, \forall(i, j) \in A\quad \quad \quad (9)\\ x_{i j k} \text { binary } \forall k \in K, \forall(i, j) \in A \quad \quad \quad (10)\\ \end{array} minf(x)=1000kKjΔ+(0)x0jk+kK(i,j)AcijxijkkKjΔ+(i)xijk=1iN(1)jΔ+(0)x0jk=1kK(2)iΔ(j)xijkiΔ+(j)xjik=0kK,jN(3)iΔΔ(n+1)xi,n+1,k=1kK(4)wik+si+tijwjk(1xijk)Mij,kK,(i,j)A(5)ai(jΔ+(i)xijk)wikbi(jΔ+(i)xijk)kK,iN(6)EwikLkK,i{ 0,n+1}(7)iNdijΔ+(i)xijkCkK(8)xijk0kK,(i,j)A(9)xijk binary kK,(i,j)A(10)
式中,目标函数 f ( x ) f(x) f(x)为总成本=1000*车辆使用数目+所有车辆行驶总距离, N N N表示顾客集合,约束(1)限制每个顾客只能被分配到一条路径;约束(2)-(4)表示车辆k在路径上的流量限制;约束(5)~(7)表示时间窗约束;约束(8)表示载重量约束,约束(9)-(10)表示决策向量约束。
参考文献:
[1]何美玲,魏志秀,武晓晖等.基于改进蚁群算法求解带软时间窗的车辆路径问题[J].计算机集成制造系统,2023,29(03):1029-1039.
[2]李琳,刘士新,唐加福.改进的蚁群算法求解带时间窗的车辆路径问题[J].控制与策,2010,25(09):1379-1383.

1.2VRPTW数据集简介

本文选取数据集的详细信息如下表所示,其包含1个配送中心(序号0表示配送中心),25个顾客(序号1-25),且每个车辆载重量限制为200。(可以更换为其他数据集
在这里插入图片描述

二、蜣螂优化算法DBO

蜣螂优化算法(Dung beetle optimizer,DBO)由Jiankai Xue和Bo Shen于2022年提出,该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁殖行为的启发所得。
在这里插入图片描述

2.1蜣螂滚球

(1)当蜣螂前行无障碍时,蜣螂在滚粪球过程中会利用太阳进行导航,下图中红色箭头表示滚动方向
在这里插入图片描述
本文假设光源的强度会影响蜣螂的位置,蜣螂在滚粪球过程中位置更新如下:

x i ( t + 1 ) = x i ( t ) + α × k × x i ( t − 1 ) + b × Δ x , Δ x = ∣ x i ( t ) − X w ∣ \begin{aligned} x_{i}(t+1) &=x_{i}(t)+\alpha \times k \times x_{i}(t-1)+b \times \Delta x, \\ \Delta x &=\left|x_{i}(t)-X^{w}\right| \end{aligned} xi(t+1)Δx=xi(t)+α×k×xi(t1)+b×Δx,=xi(t)Xw
其中, t t t表示当前迭代次数, x i ( t ) x_{i}(t) xi(t)表示第 i i i次蜣螂在第t次迭代中的位置信息, k ∈ ( 0 , 0.2 ] k∈(0,0.2] k(0,0.2]为扰动系数, b b b ( 0 , 1 ) (0,1) (0,1) 之间的随机数, α \alpha α取 -1 或 1 , X w X^{w} Xw表示全局最差位置, Δ x \Delta x Δx用于模拟光的强度变化。
其中, α \alpha α的取值采用算法1:
在这里插入图片描述

(2)当蜣螂遇到障碍物无法前进时,它需要通过跳舞来重新调整自己,以获得新的路线。本文使用切线函数来模仿跳舞行为,以此获得新的滚动方向,滚动方向仅考虑为 [ 0 , π ] [0,π] [0,π]之间。
在这里插入图片描述
蜣螂一旦成功确定新的方向,它应该继续向后滚动球。蜣螂的位置更新如下:
x i ( t + 1 ) = x i ( t ) + tan ⁡ ( θ ) ∣ x i ( t ) − x i ( t − 1 ) ∣ x_{i}(t+1)=x_{i}(t)+\tan (\theta)\left|x_{i}(t)-x_{i}(t-1)\right| xi(t+1)=xi(t)+tan(θ)xi(t)xi(t1)
其中, θ \theta θ为偏转角,其取值为 [ 0 , π ] [0,π] [0,π],采用算法2:
在这里插入图片描述

2.2蜣螂繁殖

在这里插入图片描述

在自然界中,雌性蜣螂将粪球被滚到适合产卵的安全地方并将其隐藏起来,以此为后代提供一个安全的环境。受此启发,因而提出了一种边界选择策略以此模拟雌性蜣螂产卵的区域:
L b ∗ = max ⁡ ( X ∗ × ( 1 − R ) , L b ) U b ∗ = min ⁡ ( X ∗ × ( 1 + R ) , U b ) \begin{array}{l} L b^{*}=\max \left(X^{*} \times(1-R), L b\right) \\ U b^{*}=\min \left(X^{*} \times(1+R), U b\right) \end{array} Lb=max(X×(1R),Lb)Ub=min(X×(1+R),Ub)
其中, X ∗ X^{*} X表示当前最优位置, L b ∗ L b^{*} Lb U b ∗ U b^{*} Ub分别表示产卵区的下限和上限, R = 1 − t / T m a x R=1−t/T_{max} R=1t/Tmax T m a x T_{max} Tmax表示最大迭代次数, L b Lb Lb U b Ub Ub分别表示优化问题的下限和上限。
雌性蜣螂一旦确定了产卵区,就会选择在该区域育雏球产卵。每只雌性蜣螂在每次迭代中只产生一个卵,可以看出,产卵区的边界范围是动态变化的,主要由R值决定。因此,育雏球的位置在迭代过程中也是动态的,其定义如下:
B i ( t + 1 ) = X ∗ + b 1 × ( B i ( t ) − L b ∗ ) + b 2 × ( B i ( t ) − U b ∗ ) B_{i}(t+1)=X^{*}+b_{1} \times\left(B_{i}(t)-L b^{*}\right)+b_{2} \times\left(B_{i}(t)-U b^{*}\right) Bi(t+1)=X+b1×(Bi(t)Lb)+b2×(Bi(t)Ub)
其中, B i ( t ) B_{i}(t) Bi(t)表示第t次迭代中第 i个育雏球的位置信息, b 1 b_{1} b1 b 2 b_{2} b2均为1×D的随机向量,D表示优化问题的维度。
产卵区的选择如算法3所示:
在这里插入图片描述

2.3蜣螂觅食

在这里插入图片描述
雌性蜣螂所产的卵会逐渐长大,一些已经成熟的小蜣螂会从地下出来寻找食物,小蜣螂的最佳觅食区建模如下:
L b b = max ⁡ ( X b × ( 1 − R ) , L b ) U b b = min ⁡ ( X b × ( 1 + R ) , U b ) \begin{array}{l} L b^{b}=\max \left(X^{b} \times(1-R), L b\right) \\ U b^{b}=\min \left(X^{b} \times(1+R), U b\right) \end{array} Lbb=max(Xb×(1R),Lb)Ubb=min(Xb×(1+R),Ub)
其中, X b X^{b} Xb表示全局最优位置, L b b L b^{b} Lbb U b b U b^{b} Ubb分别表示最佳觅食区的下限和上限。
在这里插入图片描述

小蜣螂的位置更新如下:
x i ( t + 1 ) = x i ( t ) + C 1 × ( x i ( t ) − L b b ) + C 2 × ( x i ( t ) − U b b ) x_{i}(t+1)=x_{i}(t)+C_{1} \times\left(x_{i}(t)-L b^{b}\right)+C_{2} \times\left(x_{i}(t)-U b^{b}\right) xi(t+1)=xi(t)+C1×(xi(t)Lbb)+C2×(xi(t)Ubb)
其中, x i ( t ) x_{i}(t) xi(t)表示第t次迭代中第i只小蜣螂在的位置, C 1 C_{1} C1是服从正态分布的随机数, C 2 C_{2} C2为(0,1)的随机向量。

2.4蜣螂偷窃

在这里插入图片描述

另一方面,一些蜣螂从其他蜣螂那里偷粪球,盗贼蜣螂的位置更新如下:

x i ( t + 1 ) = X b + S × g × ( ∣ x i ( t ) − X ∗ ∣ + ∣ x i ( t ) − X b ∣ ) x_{i}(t+1)=X^{b}+S \times g \times\left(\left|x_{i}(t)-X^{*}\right|+\left|x_{i}(t)-X^{b}\right|\right) xi(t+1)=Xb+S×g×(xi(t)X+ xi(t)Xb )
其中, x i ( t ) x_{i}(t) xi(t)表示在第t次迭代中第i个盗贼蜣螂的位置,g为服从正态分布的1×D随机向量,S为常数。

2.5、算法描述

滚球蜣螂、繁殖蜣螂、觅食蜣螂和偷窃蜣螂的比例分布如下:
在这里插入图片描述
DBO算法描述如下:
在这里插入图片描述
参考文献:Xue, J., Shen, B. Dung beetle optimizer: a new meta-heuristic algorithm for global optimization. J Supercomput (2022). https://doi.org/10.1007/s11227-022-04959-6

三、蜣螂优化算法DBO求解VRPTW

close all
clear 
clc
完整代码添加博主微信:djpcNLP123

SearchAgents_no=50; % 种群大小
Function_name='F1'; 
Max_iteration=100; % 最大迭代次数
[lb,ub,dim,fobj]=Get_Functions_details(Function_name);
[fMin,bestX,curve]=DBO(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);  %算法求解

%% 显示最终结果
Pos=ShowResult(bestX);
%% 画图
figure
plot(curve,'Color','g','linewidth',1.5)%semilogy
xlabel('迭代次数');
ylabel('路径成本');
grid on
box on
legend('DBO')
%% 保存数据
save curve curve
save bestX bestX

部分结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

配送路线1:0->21->6->0 服务顾客数量:2 路径长度:51.56878 装载量:14
服务顾客21的起始时间:18.02776,结束时间:28.02776
服务顾客6的起始时间:50.38844,结束时间:60.38844
抵达配送中心的时间:71.56878

配送路线2:0->12->22->1->0 服务顾客数量:3 路径长度:94.93124 装载量:47
服务顾客12的起始时间:15.00000,结束时间:25.00000
服务顾客22的起始时间:50.49510,结束时间:60.49510
服务顾客1的起始时间:99.69969,结束时间:109.69969
抵达配送中心的时间:124.93124

配送路线3:0->5->16->17->0 服务顾客数量:3 路径长度:73.39002 装载量:47
服务顾客5的起始时间:20.61553,结束时间:30.61553
服务顾客16的起始时间:41.79587,结束时间:51.79587
服务顾客17的起始时间:62.97621,结束时间:72.97621
抵达配送中心的时间:103.39002

配送路线4:0->2->3->4->0 服务顾客数量:3 路径长度:102.40930 装载量:39
服务顾客2的起始时间:18.00000,结束时间:28.00000
服务顾客3的起始时间:62.40930,结束时间:72.40930
服务顾客4的起始时间:97.40930,结束时间:107.40930
抵达配送中心的时间:132.40930

配送路线5:0->7->8->0 服务顾客数量:2 路径长度:59.66857 装载量:14
服务顾客7的起始时间:21.21320,结束时间:31.21320
服务顾客8的起始时间:43.41976,结束时间:53.41976
抵达配送中心的时间:79.66857

配送路线6:0->9->10->0 服务顾客数量:2 路径长度:82.51072 装载量:32
服务顾客9的起始时间:32.01562,结束时间:42.01562
服务顾客10的起始时间:67.01562,结束时间:77.01562
抵达配送中心的时间:102.51072

配送路线7:0->11->13->0 服务顾客数量:2 路径长度:85.95242 装载量:35
服务顾客11的起始时间:33.54102,结束时间:43.54102
服务顾客13的起始时间:84.77208,结束时间:94.77208
抵达配送中心的时间:105.95242

配送路线8:0->14->15->0 服务顾客数量:2 路径长度:78.24082 装载量:28
服务顾客14的起始时间:32.01562,结束时间:42.01562
服务顾客15的起始时间:57.82701,结束时间:67.82701
抵达配送中心的时间:98.24082

配送路线9:0->18->0 服务顾客数量:1 路径长度:31.62278 装载量:12
服务顾客18的起始时间:15.81139,结束时间:25.81139
抵达配送中心的时间:41.62278

配送路线10:0->19->20->0 服务顾客数量:2 路径长度:94.05221 装载量:26
服务顾客19的起始时间:32.01562,结束时间:42.01562
服务顾客20的起始时间:72.42943,结束时间:82.42943
抵达配送中心的时间:114.05221

配送路线11:0->23->24->25->0 服务顾客数量:3 路径长度:116.21931 装载量:38
服务顾客23的起始时间:36.05551,结束时间:46.05551
服务顾客24的起始时间:77.67829,结束时间:87.67829
服务顾客25的起始时间:102.67829,结束时间:112.67829
抵达配送中心的时间:146.21931

配送路线总长度:870.56615

四、完整MATLAB代码

完整代码添加博客下方博主微信

猜你喜欢

转载自blog.csdn.net/weixin_46204734/article/details/130440988
今日推荐