【路径规划】基于遗传算法求解带时间窗多电动车充电路径规划问题附matlab代码
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代码问题可私信交流。
部分理论引用网络文献,若有侵权联系博主删除。
【路径规划】基于遗传算法求解带时间窗多电动车充电路径规划问题附matlab代码相关推荐
- 【路径规划】基于遗传算法求解带时间窗车辆路径规划问题(VRPTW)matlab源码
1 简介 有时间窗的车辆路径问题(Vehicle Routing Problem with Time Windows,VRPTW)因为其有重要的现实意义而备受关注.其时间窗即为客户接受服务的时间范围, ...
- 【TWVRP】基于matlab遗传算法求解带时间窗且车辆速度车辆路径规划问题【含Matlab源码 2094期】
⛄一.VRP简介 1 VRP基本原理 车辆路径规划问题(Vehicle Routing Problem,VRP)是运筹学里重要的研究问题之一.VRP关注有一个供货商与K个销售点的路径规划的情况,可以简 ...
- 【TWVRP】基于matlab模拟退火算法求解带时间窗的多车型路径规划问题【含Matlab源码 913期】
⛄一.模拟退火算法简介 1 引言 模拟退火算法(Simulated Annealing,SA)的思想最早由Metropolis等人于1953年提出:Kirkpatrick于1983年第一次使用模拟退火 ...
- 【VRP问题】基于遗传算法求解带有时间窗、车载容量限制、多车辆、单配送中心路径优化VRPTW(多约束)matlab源码
1 数学模型 (1)有关模型的说明和假设 1)模型中的已知量有:各需求点的位置坐标.各需求点的物料需求数量,各需求点的物料的到达时间要求,配送中心到各需求点的最短行驶距离,各需求点互相之间的最短运输距 ...
- 物流管理论文实现:基于遗传算法的带时间窗和载重约束的车辆路径优化
车辆路径问题 车辆路径问题(Vehicle Routing Problem-VRP)是为一些车辆(确定或不确定数量)确定访问一些客户的路径,每一客户被而且只被访问一次,且每条路径上的客户需求量之和 ...
- 【TWVRP】遗传算法求解带时间窗的含充电站车辆路径规划问题【含Matlab源码 1177期】
⛄一.VRP简介 1 VRP基本原理 车辆路径规划问题(Vehicle Routing Problem,VRP)是运筹学里重要的研究问题之一.VRP关注有一个供货商与K个销售点的路径规划的情况,可以简 ...
- 【路径规划-VRP问题】基于遗传算法求解带距离的多车场车辆路径规划问题(含单线路局部优化)matlab代码
1 简介 物流配送所获取的利润在现代物流企业利润中所占比例非常大,而车辆路径问题又是物流配送中的核心问题.因此对车辆路径问题(VRP)的研究具有非常重要的意义.在实际生活中,大型的物流企业并不只拥有一 ...
- 【TWVRP】模拟退火算法求解带时间窗的多车型路径规划问题【含Matlab源码 913期】
⛄一.模拟退火算法简介 1 引言 模拟退火算法(Simulated Annealing,SA)的思想最早由Metropolis等人于1953年提出:Kirkpatrick于1983年第一次使用模拟退火 ...
- 【发车优化】基于遗传算法的公交车调度排班优化的研究与实现附Matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信.
最新文章
- DFS Codeforces Round #299 (Div. 2) B. Tavas and SaDDas
- 窗口缩小 怎么让定位的盒子不动_盒子模型
- prometheus+consul服务发现+alertmanager配置
- linux系统服务器可能被攻击的几种攻击方式
- aptitude 命令_C-命令行参数Aptitude问题与解答
- TCP文件下载器(Python)
- 每天一点点之vue框架开发 - History 模式下线上路由报404错误
- 《Essential C++》笔记之设定头文件
- 【多线程】Semaphore:实现快速限流器
- node -v 突然显示 killed 9 处理历程
- Win Server 8中的利器:微软在线备份服务
- vs2008的简单使用
- 企业信息安全模型(成熟度模型)
- 基于Android NFC的门票系统
- Win10系统重置后键盘鼠标都失灵,光标都不显示怎么解决?
- 八块腹肌是如何练成的?入门减脂训练加饮食计划
- Unity游戏动画 从入门到住院 4:动画状态机
- 分享、活动、地推、广告:openinstall全渠道多场景解决方案
- python开发office插件_看完这篇Python操作PPT总结,从此使用Python玩转Office全家桶就没有压力了!...
- 网友:我30多岁了,现在转行学编程来得及吗?