1 模型
由于传统遗传算法在求解VRP时会过早收敛,易陷入局部最优解.本文提出改进的遗传算法求解VRP.通过将模拟退火融入到遗传算法中,改善了传统遗传算法对VRP的求解过程,并采用改进的遗传算法解决物流配送中心的选址问题.最后对比改进遗传算法与其它经典算法求解VRP的结果,经过案例分析,证明改进的遗传算法是有效的,验证了本文提出的改进遗传算法具有一定的合理性.
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 仿真结果
4 参考文献
[1]王顺顺, 宓为建, & 董良才. (2012). 基于改进的遗传算法的车辆路径问题研究. 中国互联网学术会议. 中国电子学会;北京信息产业协会.
[2]许国平, 叶效锋, 鲍立威. 基于模拟退火遗传算法的车辆路径问题研究[J]. 工业控制计算机, 2004, 000(006):49-50.
756

被折叠的 条评论
为什么被折叠?



