1 简介
电动车在物流领域中取代燃油车是一个广泛的发展趋势.但电动车的电池利用率低,充电时间长,相关充电配套设施建设不完善,存在"续驶里程焦虑"等现象成为了电动车推广和应用的重要制约因素,也是一般路径规划模型不适用于电动车的原因.因此,针对电动车的特性研究路径规划问题具有重要的理论研究价值和实用价值.此外,现有的电动车路径规划研究中关于电量消耗模型的构建,大多假设与速度和载重无关.但是,电动车的实际行驶效果和理论研究表明,速度和载重对电动车的电量消耗具有显著的非线性影响,行驶速度每增加或减少10km/h,单位里程电量消耗量变化10%以上,而车辆载重每增加或减少100kg,单位里程电量消耗平均变化约4.2%,这些影响是不可忽略的,在研究路径规划时需加以考虑.本文基于速度和载重对电量消耗的非线性影响以及客户时间窗,车辆载重及电量的约束,以最小化电动车启动成本,充电成本,总行驶里程成本和总时间惩罚成本为目标函数,构建了基于非线性电量消耗的电动车路径规划模型,并采用遗传算法算法分别对问题求解,综合比较选择更优的路径规划结果.
2 部分代码
clear
clc
close all
tic
%% 用importdata这个函数来读取文件
load('c101');
shuju=c101;
bl=0;
cap=6; %车辆最大装载量
%% 提取数据信息
E=shuju(1,5); %配送中心时间窗开始时间
L=shuju(1,6); %配送中心时间窗结束时间
zuobiao=shuju(:,2:3); %所有点的坐标x和y
customer=zuobiao(2:end-4,:); %顾客坐标
cusnum=size(customer,1); %顾客数
v_num=5; %车辆最多使用数目
demands=shuju(2:end,4); %需求量
a=shuju(2:end,5); %顾客时间窗开始时间[a[i],b[i]]
b=shuju(2:end,6); %顾客时间窗结束时间[a[i],b[i]]
s=shuju(2:end,7); %客户点的服务时间
h=pdist(zuobiao);
dist=squareform(h);
dist=dist;%距离矩阵,满足三角关系,暂用距离表示花费c[i][j]=dist[i][j]
%% 遗传算法参数设置
alpha=100000; %违反的容量约束的惩罚函数系数
belta=15;%违反时间窗约束的惩罚函数系数
belta2=10;%违反系数
chesu=50;
NIND=300; %种群大小
MAXGEN=500; %迭代次数
Pc=0.9; %交叉概率
Pm=0.05; %变异概率
GGAP=0.9; %代沟(Generation gap)
N=cusnum+v_num-1; %染色体长度=顾客数目+车辆最多使用数目-1
%% 初始化种群
Chrom=InitPopCW(NIND,N,cusnum,a,demands,cap); %构造初始解
%% 输出随机解的路线和总距离
disp('初始种群中的一个随机值:')
[VC,NV,TD,VCC,GS]=decode(Chrom(1,:),cusnum,cap,demands,a,b,L,s,dist,chesu,bl);
disp(['车辆使用数目:',num2str(NV),',车辆行驶总距离:',num2str(TD)]);
disp('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
%% 优化
gen=1;
figure;
hold on;box on
xlim([0,MAXGEN])
title('优化过程')
xlabel('代数')
ylabel('最优值')
ObjV=calObj(Chrom,cusnum,cap,demands,a,b,L,s,dist,alpha,belta,belta2,chesu,bl); %计算种群目标函数值
preObjV=min(ObjV);
while gen<=MAXGEN
%% 计算适应度
ObjV=calObj(Chrom,cusnum,cap,demands,a,b,L,s,dist,alpha,belta,belta2,chesu,bl); %计算种群目标函数值
line([gen-1,gen],[preObjV,min(ObjV)]);pause(0.0001)%画图 最优函数
preObjV=min(ObjV);
FitnV=Fitness(ObjV);
%% 选择
SelCh=Select(Chrom,FitnV,GGAP);
%% OX交叉操作
SelCh=Recombin(SelCh,Pc,v_num);
%% 变异
SelCh=Mutate(SelCh,Pm);
%% 重插入子代的新种群
Chrom=Reins(Chrom,SelCh,ObjV);
%% 打印当前最优解
ObjV=calObj(Chrom,cusnum,cap,demands,a,b,L,s,dist,alpha,belta,belta2,chesu,bl); %计算种群目标函数值
[minObjV,minInd]=min(ObjV);
disp(['第',num2str(gen),'代最优解:'])
[bestVC,bestNV,bestTD,bestVCC,bestGS]=decode(Chrom(minInd(1),:),cusnum,cap,demands,a,b,L,s,dist,chesu,bl);
disp(['车辆使用数目:',num2str(bestNV),',车辆行驶总距离:',num2str(bestTD)]);
fprintf('\n')
%% 更新迭代次数
gen=gen+1 ;
end
%% 画出最优解的路线图
ObjV=calObj(Chrom,cusnum,cap,demands,a,b,L,s,dist,alpha,belta,belta2,chesu,bl); %计算种群目标函数值
[minObjV,minInd]=min(ObjV);
%% 输出最优解的路线和总距离
disp('最优解:')
bestChrom=Chrom(minInd(1),:);
[bestVC,bestNV,bestTD,bestVCC,bestGS]=decode(bestChrom,cusnum,cap,demands,a,b,L,s,dist,chesu,bl);
[sumTD,everyTD,n]=travel_distance(bestVCC,dist);
disp(['车辆使用数目:',num2str(bestNV),',车辆行驶总距离:',num2str(bestTD)]);
disp('-------------------------------------------------------------')
[cost]=costFuction(bestVC,a,b,s,L,dist,demands,cap,alpha,belta,belta2,chesu,bl,bestGS);
%% 画出最终路线图
draw_Best(bestVCC,zuobiao);
clc
close all
tic
%% 用importdata这个函数来读取文件
load('c101');
shuju=c101;
bl=0;
cap=6; %车辆最大装载量
%% 提取数据信息
E=shuju(1,5); %配送中心时间窗开始时间
L=shuju(1,6); %配送中心时间窗结束时间
zuobiao=shuju(:,2:3); %所有点的坐标x和y
customer=zuobiao(2:end-4,:); %顾客坐标
cusnum=size(customer,1); %顾客数
v_num=5; %车辆最多使用数目
demands=shuju(2:end,4); %需求量
a=shuju(2:end,5); %顾客时间窗开始时间[a[i],b[i]]
b=shuju(2:end,6); %顾客时间窗结束时间[a[i],b[i]]
s=shuju(2:end,7); %客户点的服务时间
h=pdist(zuobiao);
dist=squareform(h);
dist=dist;%距离矩阵,满足三角关系,暂用距离表示花费c[i][j]=dist[i][j]
%% 遗传算法参数设置
alpha=100000; %违反的容量约束的惩罚函数系数
belta=15;%违反时间窗约束的惩罚函数系数
belta2=10;%违反系数
chesu=50;
NIND=300; %种群大小
MAXGEN=500; %迭代次数
Pc=0.9; %交叉概率
Pm=0.05; %变异概率
GGAP=0.9; %代沟(Generation gap)
N=cusnum+v_num-1; %染色体长度=顾客数目+车辆最多使用数目-1
%% 初始化种群
Chrom=InitPopCW(NIND,N,cusnum,a,demands,cap); %构造初始解
%% 输出随机解的路线和总距离
disp('初始种群中的一个随机值:')
[VC,NV,TD,VCC,GS]=decode(Chrom(1,:),cusnum,cap,demands,a,b,L,s,dist,chesu,bl);
disp(['车辆使用数目:',num2str(NV),',车辆行驶总距离:',num2str(TD)]);
disp('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
%% 优化
gen=1;
figure;
hold on;box on
xlim([0,MAXGEN])
title('优化过程')
xlabel('代数')
ylabel('最优值')
ObjV=calObj(Chrom,cusnum,cap,demands,a,b,L,s,dist,alpha,belta,belta2,chesu,bl); %计算种群目标函数值
preObjV=min(ObjV);
while gen<=MAXGEN
%% 计算适应度
ObjV=calObj(Chrom,cusnum,cap,demands,a,b,L,s,dist,alpha,belta,belta2,chesu,bl); %计算种群目标函数值
line([gen-1,gen],[preObjV,min(ObjV)]);pause(0.0001)%画图 最优函数
preObjV=min(ObjV);
FitnV=Fitness(ObjV);
%% 选择
SelCh=Select(Chrom,FitnV,GGAP);
%% OX交叉操作
SelCh=Recombin(SelCh,Pc,v_num);
%% 变异
SelCh=Mutate(SelCh,Pm);
%% 重插入子代的新种群
Chrom=Reins(Chrom,SelCh,ObjV);
%% 打印当前最优解
ObjV=calObj(Chrom,cusnum,cap,demands,a,b,L,s,dist,alpha,belta,belta2,chesu,bl); %计算种群目标函数值
[minObjV,minInd]=min(ObjV);
disp(['第',num2str(gen),'代最优解:'])
[bestVC,bestNV,bestTD,bestVCC,bestGS]=decode(Chrom(minInd(1),:),cusnum,cap,demands,a,b,L,s,dist,chesu,bl);
disp(['车辆使用数目:',num2str(bestNV),',车辆行驶总距离:',num2str(bestTD)]);
fprintf('\n')
%% 更新迭代次数
gen=gen+1 ;
end
%% 画出最优解的路线图
ObjV=calObj(Chrom,cusnum,cap,demands,a,b,L,s,dist,alpha,belta,belta2,chesu,bl); %计算种群目标函数值
[minObjV,minInd]=min(ObjV);
%% 输出最优解的路线和总距离
disp('最优解:')
bestChrom=Chrom(minInd(1),:);
[bestVC,bestNV,bestTD,bestVCC,bestGS]=decode(bestChrom,cusnum,cap,demands,a,b,L,s,dist,chesu,bl);
[sumTD,everyTD,n]=travel_distance(bestVCC,dist);
disp(['车辆使用数目:',num2str(bestNV),',车辆行驶总距离:',num2str(bestTD)]);
disp('-------------------------------------------------------------')
[cost]=costFuction(bestVC,a,b,s,L,dist,demands,cap,alpha,belta,belta2,chesu,bl,bestGS);
%% 画出最终路线图
draw_Best(bestVCC,zuobiao);
%% 计算每辆车配送路线上在各个点开始服务的时间,还计算返回集配中心时间
%输入vehicles_customer: 每辆车所经过的顾客
%输入a: 最早开始服务的时间窗
%输入s: 对每个点的服务时间
%输入dist: 距离矩阵
%输出bsv: 每辆车配送路线上在各个点开始服务的时间,还计算返回集配中心时间
function bsv= begin_s_v( vehicles_customer,a,s,dist,chesu,bl )
n=size(vehicles_customer,1);
bsv=cell(n,1);
for i=1:n
route=vehicles_customer{i};
[bs,back]= begin_s( route,a,s,dist,chesu,bl);
%% bs为对每个客户开始服务的开始时间 back返回配送中心的时间
bsv{i}=[bs,back];
%% 所有车 bs为对每个客户开始服务的开始时间 back返回配送中心的时间
end
end
3 仿真结果
4 参考文献
[1]谭学怡. 基于重量与速度的非线性电量消耗的电动车配送路径规划研究. 华南理工大学, 2019.
博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。
部分理论引用网络文献,若有侵权联系博主删除。