1 模型

由于传统遗传算法在求解VRP时会过早收敛,易陷入局部最优解.本文提出改进的遗传算法求解VRP.通过将模拟退火融入到遗传算法中,改善了传统遗传算法对VRP的求解过程,并采用改进的遗传算法解决物流配送中心的选址问题.最后对比改进遗传算法与其它经典算法求解VRP的结果,经过案例分析,证明改进的遗传算法是有效的,验证了本文提出的改进遗传算法具有一定的合理性.

【VRP问题】基于模拟退火改进遗传算法求解带时间窗含充电站的车辆路径规划问题EVRPTW matla_充电桩路径规划

【VRP问题】基于模拟退火改进遗传算法求解带时间窗含充电站的车辆路径规划问题EVRPTW matla_充电桩路径规划_02

【VRP问题】基于模拟退火改进遗传算法求解带时间窗含充电站的车辆路径规划问题EVRPTW matla_充电桩路径规划_03

2 部分代码

%% 包括充电站
clc;
clear all
close all
load RR.mat
t0=cputime;%计时开始
filename='.\evrptw_instances\c101_21.txt';
[NO,type,XCOORD, YCOORD,DEMAND,READY_TIME,DUE_DATE,SERVICE_TIME]=textread(filename,'%s%s%s%s%s%s%s%s','headerlines',1);
%% 进行经验求解路径
K=randperm(100);%对客户点随机排序
M=50;%任务量
%% 车子数据设置读取
jishu=2;
num=1;%跑的次数
for pp=1:num
pp
tic
capacity = 200;%车子载重
timewindows_yuanshi=[str2num(char(READY_TIME))';str2num(char(DUE_DATE))'];%时间窗
coordinate_yuanshi=[str2num(char(XCOORD)),str2num(char(YCOORD))];%坐标信息
coordinate_chongdianzhan=[coordinate_yuanshi(2:22,1)';coordinate_yuanshi(2:22,2)';]';%充电站坐标
demand_yuanshi=str2num(char(DEMAND))';%所有需求
service_yuanshi=str2num(char(SERVICE_TIME))';%所有服务时间
D=distanse(coordinate_yuanshi);%距离
coordinate=[coordinate_yuanshi(1,1),coordinate_yuanshi(K(1:M)+22,1)';coordinate_yuanshi(1,2),coordinate_yuanshi(K(1:M)+22,2)';]';%中心和客户坐标位置
timewindows=[timewindows_yuanshi(1,1),timewindows_yuanshi(1,K(1:M)+22) ;timewindows_yuanshi(1,2),timewindows_yuanshi(2,K(1:M)+22)];%随机选取的客户点时间窗
demand=[demand_yuanshi(1),demand_yuanshi(K(1:M)+22)];%随机选取的客户点需求
service=[service_yuanshi(1),service_yuanshi(K(1:M))+22];%随机选取的客户点服务时间
coordinate_yuanshi1=[coordinate_yuanshi(1,1),coordinate_yuanshi(23:end,1)';coordinate_yuanshi(1,2),coordinate_yuanshi(23:end,2)';]';%中心和客户坐标位置
D1=distanse(coordinate_yuanshi1);%距离
D2=distanse(coordinate);%距离
renwudian=K(1:M)+1;%任务点
renwudian1=[1,K(1:M)+1];%包括起点的任务点
renwudian2=K(1:M)+1;%任务点
RRR=1;%初始位置
flag=1;%结束标识
Q=77.751111;%电量
r=1;%消耗率
g=0.39;%充电
v=1;%速度


tic
C=1000;%C为停止代数,遗传到第 C代时程序停止,C的具体取值视问题的规模和耗费的时间而定
Pc=0.9;%交叉概率
Pm=0.4;%变异概率
popsize=80;%种群数量
%经验公式m=[Σgi /aq]+1,粗求车辆数

a = 0.8; %【3】
k1 = round((sum(abs(demand))./(a*capacity))); %最小车辆数
k2 = round((sum(abs(demand))./(a*capacity)))+1; %最大车辆数
original = 200;%初始每辆车的载货量
minvalue_ga = 1000000;%随便设置的最优值,不能太小
for k = k1:1:k2 %每种车辆数做一次寻优
[tempR,tempvalue] = Run_VRP(D2,demand,popsize,timewindows,k,capacity,original,C,Pc,Pm,service,v);%运算返回最优路径R和其总距离Rlength
if min(tempvalue) < minvalue_ga
minvalue_ga = min(tempvalue);%如果小于最小适应度值,替代&& min(tempvalue)>100
R_ga = tempR;%保存最小路径
minvehicle = k;%保存最小车辆数量
shiyingdu=tempvalue ;%保存最小染色体
end
end
R_ga=R_ga+1;
for i=1:length(R_ga)
if R_ga(i)~=1
R_ga(i)=renwudian1(R_ga(i));%对遗传求出的路径进行任务点对应
end
end
[RRR2,minvalue_ga] = myEvalue2( D,R_ga,minvehicle,capacity,original,timewindows,demand,service,renwudian1,Q,r,g,v);

disp(['模拟退火遗传求解的适应度值',num2str(minvalue_ga)])
t2=toc;
disp(['模拟退火遗传求解的时间',num2str(t2)]);%计算目标函数
result(D,coordinate_yuanshi,RRR2,evalue);
title('模拟退火遗传求解')
figure(3)

plot(shiyingdu);
xlabel('代数')
ylabel('适应度值')
title('模拟退火遗传迭代图')
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.

3 仿真结果

【VRP问题】基于模拟退火改进遗传算法求解带时间窗含充电站的车辆路径规划问题EVRPTW matla_充电桩路径规划_04

【VRP问题】基于模拟退火改进遗传算法求解带时间窗含充电站的车辆路径规划问题EVRPTW matla_充电桩路径规划_05

【VRP问题】基于模拟退火改进遗传算法求解带时间窗含充电站的车辆路径规划问题EVRPTW matla_充电桩路径规划_06

【VRP问题】基于模拟退火改进遗传算法求解带时间窗含充电站的车辆路径规划问题EVRPTW matla_充电桩路径规划_07

4 参考文献

[1]王顺顺, 宓为建, & 董良才. (2012). 基于改进的遗传算法的车辆路径问题研究. 中国互联网学术会议. 中国电子学会;北京信息产业协会.

[2]许国平, 叶效锋, 鲍立威. 基于模拟退火遗传算法的车辆路径问题研究[J]. 工业控制计算机, 2004, 000(006):49-50.

【VRP问题】基于模拟退火改进遗传算法求解带时间窗含充电站的车辆路径规划问题EVRPTW matla_充电桩路径规划_08