1 简介
针对城市物流配送和交通运输中广泛存在的带时间窗车辆路径问题,为寻求最佳路径规划,应用惩罚函数,构建了以总运输成本最小为目标的数学模型.在车辆路径优化求解方面,根据问题具体特征设计了1种二维编码方式,并采用近邻初始化方式构建初始解从而提升寻优速率;随后,结合狼群算法觅食行为中的游走、召唤及围攻3种行为,重新定义其智能行为,设计了一种求解带时间窗车辆路径问题的狼群算法.由于原始狼群算法的召唤行为引入距离判定因子来增大种群搜索空间,但也增加了算法复杂性且易陷入局部最优,故本研究舍弃了距离判定因子,采用猛狼1次奔袭便进入围攻状态来降低算法复杂度,并在算法中进一步增强了种群间信息交互.最后,应用该狼群算法求解多个测试算例.结果表明:基于模拟退火赛算法优化狼群算法在求解带时间窗的车辆路径问题时是可行的、有效的。
带时 间 窗 的 车 辆 路 径 问 题 ( vehicle routingproblem with time windows,VRPTW) 是在基本车辆路径问题 ( vehicle routing problem,VRP) 的基础上 增加了客户接受配送服务的时间窗要求,较 VRP 更 贴近实际配送情况。与 VRP 类似,VRPTW 亦属于NP 难问题。由于问题规模较大时,传统精确算法难以求出 VRPTW 的最优解,因此,国内外很多学者利用智能启发式算法来寻找该问题的满意解。常见的 求解 VRPTW 的智能优化算法包括: 蚁群算法、 遗传算法、粒子群算法、禁忌搜索算法 等。但是,由于遗传算法与禁忌搜索算法的早 熟易收敛问题,蚁群算法和粒子群算法的易陷入局 部最优缺陷,故目前仍未找到求解性能具有明显优势的 VRPTW 求解算法。因此,对 VRPTW 求解方法的研究仍属于运筹学、物流配送和交通运输工程等领域的研究重点和热点。 狼群算法 ( Wolf Pack Algorithm,WPA) 作为 一种新型智能启发式算法,是对自然界中狼群分工 协作捕食行为的智能模拟,是一种基于种群的随机 寻优算法。目前,该算法已被成功应用于 TSP 问题、0 - 1 高维背包问题和多维连续优化等多种问题的求 解,并取得了良好的效果。但是,截至目前为止, 尚未有文献将狼群算法应用于 VRPTW 的求解。 基于求解 TSP 的离散狼群算法,结合带时间窗的车辆路径问题的具体特征,提出了求解 VRPTW的狼群算法,并与其他智能算法如蚁群算法、遗 传算 法 等 比 较,不 仅 验 证 了 本 算 法 在 求 解VRPTW 问题上的有效性,而且拓宽了狼群算法的应 用领域。
2 部分代码
clc;clear
Location=[];
Location(:,1)=xlsread('Data.xlsx','sheet13','b2:b23');
Location(:,2)=xlsread('Data.xlsx','sheet13','c2:c23');
TW=xlsread('Data.xlsx','sheet13','e2:f23');
q=xlsread('Data.xlsx','sheet13','d2:d23');
workT=xlsread('Data.xlsx','sheet13','g2:g23');
n=1:size(Location,1)-1;
Q=10;
PAIXU=12;
v_min=35;v_mid=40;
v_max=50;
Ship=300;Fuel_Cost=3;Labor=20;
D=zeros(length(n)+1);
for i=1:length(n)+1
for j=i:length(n)+1
D(i,j)=6371.004*acos(sind(90-Location(i,1))*sind(90-Location(j,1))*cosd(Location(i,2)-Location(j,2))+cosd(90-Location(i,1))*cosd(90-Location(j,1)));
end
end
D=D+D';T=D/v_max;
yuanbao=cell(70,13);
TIME=zeros(1,70);
% for cunchu=1:70
popsize=100;
numWolf=1;
all_chromosome_cell=cell(100,12);
while numWolf<=popsize
n_n=n;
vehicle=1;
chromosome_cell=cell(length(n),4);
chromosome_cell{vehicle,1}=0;
chromosome_cell{vehicle,2}=0;
chromosome_cell{vehicle,3}=0;
chromosome_cell{vehicle,4}=0;
ArrivalWait_time=zeros(2,1);chromosome_cell{vehicle,5}=ArrivalWait_time;
while ~isempty(n_n)
R=randi(length(n_n));
customer=n_n(R);
i=1;
while i<=vehicle
if chromosome_cell{i,2}+q(customer+1)>Q
i=i+1;
if i>vehicle
vehicle=vehicle+1;
chromosome_cell{vehicle,1}=0;chromosome_cell{vehicle,2}=0;chromosome_cell{vehicle,3}=0;chromosome_cell{vehicle,4}=0;chromosome_cell{vehicle,5}=ArrivalWait_time;
end
elseif sum(chromosome_cell{i,5}(:,end))+workT(chromosome_cell{i,1}(end)+1)+T(chromosome_cell{i,1}(end)+1,customer+1)>TW(customer+1,2)
i=i+1;
if i>vehicle
vehicle=vehicle+1;
chromosome_cell{vehicle,1}=0;chromosome_cell{vehicle,2}=0;chromosome_cell{vehicle,3}=0;chromosome_cell{vehicle,4}=0;chromosome_cell{vehicle,5}=ArrivalWait_time;
end
else
if sum(chromosome_cell{i,5}(:,end))+workT(chromosome_cell{i,1}(end)+1)+T(chromosome_cell{i,1}(end)+1,customer+1)<TW(customer+1,1)
chromosome_cell{i,5}(1,end+1)=sum(chromosome_cell{i,5}(:,end))+workT(chromosome_cell{i,1}(end)+1)+T(chromosome_cell{i,1}(end)+1,customer+1);
chromosome_cell{i,5}(2,end)=TW(customer+1,1)-chromosome_cell{i,5}(1,end);
else
chromosome_cell{i,5}(1,end+1)=sum(chromosome_cell{i,5}(:,end))+workT(chromosome_cell{i,1}(end)+1)+T(chromosome_cell{i,1}(end)+1,customer+1);
chromosome_cell{i,5}(2,end)=0;
end
chromosome_cell{i,1}(end+1)=customer;
chromosome_cell{i,2}=chromosome_cell{i,2}+q(customer+1);
chromosome_cell{i,4}=chromosome_cell{i,4}+D(chromosome_cell{i,1}(end-1)+1,chromosome_cell{i,1}(end)+1);
n_n(R)=[];
break;
end
end
end
Total_fuel=zeros(1,vehicle);
for k=1:vehicle
Single_fuel=0;
chromosome_cell{k,4}=chromosome_cell{k,4}+D(chromosome_cell{k,1}(end)+1,1);
chromosome_cell{k,3}=sum(chromosome_cell{k,5}(:,end))+workT(chromosome_cell{k,1}(end)+1)+T(chromosome_cell{k,1}(end)+1,1);
Singleton_gene=chromosome_cell{k,1};
Singleton_weight=0;
for OIL=1:numel(Singleton_gene)-1
Singleton_weight=Singleton_weight+q(Singleton_gene(OIL)+1);
Q_Z=(0.8+0.2*(Singleton_weight/Q))*0.174*450*((22/27)^3)*(D(Singleton_gene(OIL)+1,Singleton_gene(OIL+1)+1)/22);
Q_F=0.174*450*((22/27)^3)*0.4*workT(Singleton_gene(OIL)+1);
Single_fuel=Single_fuel+Q_Z+Q_F;
end
Single_fuel=Single_fuel+(0.8+0.2*((Singleton_weight+q(Singleton_gene(end)+1))/Q))*0.174*450*((22/27)^3)*(D(Singleton_gene(end)+1,1)/22)+0.174*450*((22/27)^3)*0.4*workT(Singleton_gene(end)+1);
Total_fuel(k)=Single_fuel;
end
all_chromosome_cell{numWolf,1}=[chromosome_cell{:,1}];
all_chromosome_cell{numWolf,1}(end+1)=0;
all_chromosome_cell{numWolf,2}=[chromosome_cell{:,2}];
all_chromosome_cell{numWolf,3}=[chromosome_cell{:,4}];
all_chromosome_cell{numWolf,4}=[chromosome_cell{:,5}];
all_chromosome_cell{numWolf,5}=[chromosome_cell{:,3}];
all_chromosome_cell{numWolf,6}=sum(cell2mat(chromosome_cell(:,4)));
all_chromosome_cell{numWolf,7}=vehicle;
all_chromosome_cell{numWolf,10}=Total_fuel;
all_chromosome_cell{numWolf,11}=sum(Total_fuel);
all_chromosome_cell{numWolf,12}=all_chromosome_cell{numWolf,7}*Ship+sum(all_chromosome_cell{numWolf,5})*Labor+all_chromosome_cell{numWolf,11}*Fuel_Cost;
numWolf=numWolf+1;
end
for i=1:popsize
SuDu=zeros(1,length(all_chromosome_cell{i,1})-1);
SuDu(:)=v_max;
all_chromosome_cell{i,8}=SuDu;
end
all_chromosome_cell=sortrows(all_chromosome_cell,12);
BEST=all_chromosome_cell(1,:);
TanWolf=all_chromosome_cell(1:popsize/2,:);
D_GL=repmat(1/8,1,8);D_LP=cumsum(D_GL);
R_GL=repmat(0.2,1,5);R_LP=cumsum(R_GL);
DestroyWeight_matrix=[zeros(2,8);D_GL];
InsertWeight_matrix=[zeros(2,5);R_GL];
temperature=500;
beta=0.98;
nnum=1;
tab=1;
while temperature>=0.01
TanWolf_Copy=TanWolf;
first_i=1;
TanWolf_Son={};
SIMP={};
SDEG={};
while first_i<=length(TanWolf)
a=randperm(size(TanWolf_Copy,1),1);
TanWolf_Rand=TanWolf_Copy(a,:);
TanWolf_Copy(a,:)=[];
second_i=1;
h=3;
while second_i<=h
[c,b,Insert,TWolf_One,DestroyWeight_matrix,InsertWeight_matrix,POHUA,CHARU]=ALNS_VRPTW_main(DestroyWeight_matrix,InsertWeight_matrix,TanWolf_Rand,n,D_LP,R_LP,Q,q,T,TW,workT,D,v_max);
TWolf_One{12}=TWolf_One{7}*Ship+sum(TWolf_One{5})*Labor+TWolf_One{11}*Fuel_Cost;
%TanWolf_Son(h*(first_i-1)+second_i,:)=TWolf_One;
second_i=second_i+1;
if TWolf_One{12}<TanWolf_Rand{12}
SIMP(size(SIMP,1)+1,:) = TWolf_One;
if TWolf_One{12} < BEST{12}
tab=0;
Bubian=1;
BEST = TWolf_One;
DestroyWeight_matrix(2,POHUA)=DestroyWeight_matrix(2,POHUA)+6;%加分6
InsertWeight_matrix(2,CHARU)=InsertWeight_matrix(2,CHARU)+6;
else
DestroyWeight_matrix(2,POHUA)=DestroyWeight_matrix(2,POHUA)+1;%加分3
InsertWeight_matrix(2,CHARU)=InsertWeight_matrix(2,CHARU)+1;
end
else %模拟退火判断
Num_rand=rand();
if Num_rand < exp(-(TWolf_One{12}-TanWolf_Rand{12})/temperature)
TanWolf_Son(size(TanWolf_Son,1)+1,:)=TWolf_One;
DestroyWeight_matrix(2,POHUA)=DestroyWeight_matrix(2,POHUA)+2;%加分3
InsertWeight_matrix(2,CHARU)=InsertWeight_matrix(2,CHARU)+2;
end
end
end
%TanWolf_Copy(first_i,:) = TWolf_One;%%%%%%
if size(SIMP,1)~=0
SIMP=sortrows(SIMP,12);
TanWolf(first_i,:)=SIMP(1,:);
SIMP={};
end
if size(TanWolf_Son,1)<=3 && size(TanWolf_Son,1)>0
SDEG=[SDEG;TanWolf_Son];
end
first_i=first_i+1;
TanWolf_Son={};
nnum=nnum+1;
if rem(nnum,500)==0
[DestroyWeight_matrix,D_LP]=DestroyWeight_update(DestroyWeight_matrix);
[InsertWeight_matrix,R_LP] = InsertWeight_update( InsertWeight_matrix);
end
end
tab=tab+1;
if tab>500
break
end
TanWolf_Son_H=[TanWolf;SDEG];
TanWolf_Son_H=sortrows(TanWolf_Son_H,12);
if size(TanWolf_Son_H,1)>120
TanWolf=TanWolf_Son_H(1:100,:);
end
temperature=temperature*0.98;
end
R=BEST{1,1};%最优路径
figure(3)
sz=100;
% scatter(Location(:,1),Location(:,2),50);%客户位置
hold on
[n,nn] = size(D);%节点个数
for i=2:n
plot(Location(i,1),Location(i,2),'ro','MarkerSize',5,'MarkerEdgeColor','k','MarkerFaceColor','b');
text(Location(i,1)-0.001,Location(i,2)+0.005,[num2str(i-1)],'Fontsize',10);hold on
end
hold on
plot(Location(1,1),Location(1,2),'p','MarkerSize',30,'MarkerEdgeColor','k','MarkerFaceColor','y');hold on%发货中心
ss=0;
cost=zeros(k,1);
for j=1:length(R)-1
if R(j)==0
ss=ss+1;
end
switch ss
case 1
line([Location(R(j)+1,1),Location(R(j+1)+1,1)],[Location(R(j)+1,2),Location(R(j+1)+1,2)]);hold on%%画出车辆1的路程
cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆1的路程
case 2
line([Location(R(j)+1,1),Location(R(j+1)+1,1)],[Location(R(j)+1,2),Location(R(j+1)+1,2)],'Color','r');hold on%%画出车辆2的路程
cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆2的路程
case 3
line([Location(R(j)+1,1),Location(R(j+1)+1,1)],[Location(R(j)+1,2),Location(R(j+1)+1,2)],'Color','g');hold on %%画出车辆3的路程
cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程
case 4
line([Location(R(j)+1,1),Location(R(j+1)+1,1)],[Location(R(j)+1,2),Location(R(j+1)+1,2)],'Color','k');hold on %%画出车辆3的路程
cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程
case 5
line([Location(R(j)+1,1),Location(R(j+1)+1,1)],[Location(R(j)+1,2),Location(R(j+1)+1,2)],'Color','y');hold on %%画出车辆3的路程
cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程
case 6
line([Location(R(j)+1,1),Location(R(j+1)+1,1)],[Location(R(j)+1,2),Location(R(j+1)+1,2)],'Color','m');hold on %%画出车辆3的路程
cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程
case 7
line([Location(R(j)+1,1),Location(R(j+1)+1,1)],[Location(R(j)+1,2),Location(R(j+1)+1,2)],'Color',[1 0.6 0.3]);hold on %%画出车辆3的路程
cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程
case 8
line([Location(R(j)+1,1),Location(R(j+1)+1,1)],[Location(R(j)+1,2),Location(R(j+1)+1,2)],'Color',[0.5 0.5 0.5]);hold on %%画出车辆3的路程
cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程
case 9
line([Location(R(j)+1,1),Location(R(j+1)+1,1)],[Location(R(j)+1,2),Location(R(j+1)+1,2)],'Color',[0.6 0.4 0.7]);hold on %%画出车辆3的路程
cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程
case 10
line([Location(R(j)+1,1),Location(R(j+1)+1,1)],[Location(R(j)+1,2),Location(R(j+1)+1,2)],'Color',[0.8 0.4 0.7]);hold on %%画出车辆3的路程
cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程
case 11
line([Location(R(j)+1,1),Location(R(j+1)+1,1)],[Location(R(j)+1,2),Location(R(j+1)+1,2)],'Color',[0.6 0.6 0.7]);hold on %%画出车辆3的路程
cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程
case 12
line([Location(R(j)+1,1),Location(R(j+1)+1,1)],[Location(R(j)+1,2),Location(R(j+1)+1,2)],'Color',[0.6 0.4 0.7]);hold on %%画出车辆3的路程
cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程
otherwise
line([Location(R(j)+1,1),Location(R(j+1)+1,1)],[Location(R(j)+1,2),Location(R(j+1)+1,2)],'Color','c');hold on %%画出车辆4的路程
cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆4的路程
end
end
minvalue1=sum(cost);
xlabel('横坐标');
ylabel('纵坐标')
3 仿真结果
4 参考文献
[1]叶勇, and 张惠珍. "求解带时间窗车辆路径问题的狼群算法." 公路交通科技 34.10(2017):8.
博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。
部分理论引用网络文献,若有侵权联系博主删除。