随着电动汽车环保和购买使用的经济性,越来越普及到社会生产和生活中,也逐渐成为了科研研究的一大热点。主要包括电动汽车的充换电问题,充电桩换电站选址定容问题,路径规划问题等等。今天,我们主要谈一下电动汽车的路径规划问题。
燃油车的路径规划问题从最简单的TSP问题被提出和解决,演变到VRP问题,以及VRP问题的各种复杂情况,带时间窗的,静态的,动态的等等,不一而论。而电动汽车的路径规划问题因单次行驶里程不长以及充换电消耗路程和时间,成为其路径规划不得不考虑的重要约束条件,其复杂性也体现在此。下面我将重点讨论带时间窗的充电电动汽车的路径规划的求解思路和算法流程。
首先,带时间窗的充电式电动汽车的路径问题的目标函数主要为一系列成本之和最小,一般包括固定成本,运营成本,充电成本,时间窗惩罚成本等等。其他成本也可以考虑,多目标时也可计算。
一般包括以下5条。
(1) 单次行驶里程约束
电动汽车满电状态下最多行驶的里程数,一般会参考设计最大行驶里程乘以一个系数求出,一般电动车辆电量降到20%时,容易怠机。因此系数可取80%。
(2) 日最大行驶里程约束(日最大工作时长约束)
为了可持续的使用以及降低车辆的保养维修费,往往每天设定车辆最大的行驶公里数,或者按照司机每天的最大工作时长进行约束。
(3) 时间窗约束
顾名思义,车辆到达配送的客户的时间要满足一定的时间窗约束,否则将会产生等待成本和惩罚成本。
(4) 载重约束
车辆配送的载货量不得超过最大载货量。
此处,可选择的算法有蚁群算法、粒子群和遗传算法,比较容易实现的算法应该是遗传算法和蚁群算法。下面以遗传算法为例,讲一点干货。
染色体编码
遗传算法求解电动汽车的路径规划问题,一般采用自然数编码,通常有随机生成和其他方法生成初始解两种。
随机生成:通过生成的从1到N(客户数量)的随机自然数排列,表示客户的配送次序,通过载重约束和日最大行驶里程约束,将其划分为若干辆车。生成配送车辆的初始路径。
初始解:通过最小近邻法或者最短路算法生成路程较少的客户配送次序,通过载重约束和日最大行驶里程约束,将其划分为若干辆车。生成配送车辆的初始路径。
适应度函数
适应度函数为总成本的倒数。
总成本的计算要计算各子成本。
生成的初始配送路径仍然需要考虑除了载重约束、日最大行驶里程约束以外的其他两个约束。
需要在满足两个约束的条件下,选择合适的充电桩进行充电,充电时长一般分为固定时长和非固定时长,其难度又大不一样。若为固定时长,则比较容易计算,若为非固定时长,则需要根据配送的成本倒推选择合适的充电时长。
选择
选择算子有竞标赛,轮盘赌和精英策略三种,可适当选择一种。
交叉
交叉算子有单点交叉,片段交叉和对称交叉等,适当选择即可,同时,要注意交叉后不可行解的复杂处理。
变异
变异算子有交换变异和随机变异等,适当选择即可,同时,要注意变异后不可行解的复杂处理。
重组
将子代和父代重新组合成新的种群。
最优解和可视化输出
输出最优解,并可视化输出配送路径和迭代曲线图。
(1)总成本计算代码举例:
function [Cost,costarray]=totalcost(tabu_list,n)
%% 固定成本+变动成本+充电成本+惩罚成本+环境成本
PowerConsumption=27; %百公里耗电量
ChargePrice=1.2; %充电平均电价
F=100; %单车固定成本
per_km=5; %单位公里行驶成本
Chj=0.315; %元/kg 碳排放环境成本
Hrate=0.72; %火力发电占比;
Erate=0.94; %电能转换系数;
Eprice=0.82; %单位电价
SatiCost=zeros(n,1);
for i=1:n
saticost=0;
Satif=cell2mat(tabu_list(i,7));
Satif(Satif>1)=0;
for j =1:size(Satif,1)
saticost=saticost+max(0.7-Satif(j,1),0)*300;
end
SatiCost(i,1)=saticost;%满意度
end
fixCost=cell2mat(tabu_list(:,5))*F; % 固定成本
runCost=per_km*cell2mat(tabu_list(:,4));
chargeCost=Eprice*PowerConsumption*cell2mat(tabu_list(:,4))/100; % 变动成本
punishCost=cell2mat(tabu_list(:,6)); %充电成本
envCost=PowerConsumption*cell2mat(tabu_list(:,4))/100*Erate*Hrate*Chj; %环境成本
%Cost=fixCost + runCost + chargeCost + punishCost + envCost + SatiCost;
Cost=fixCost + runCost + chargeCost + punishCost + envCost ;
costarray=[fixCost,runCost,chargeCost,punishCost,envCost,Cost];
end
(2)约束处理代码举例
function [Weight_remainder2,Max_remainder_dis2,Charge_remainder_dis2]=ThreeRestrain(current,remainder,Max_remainder_dis,Charge_remainder_dis,Weight_remainder,S)
%找到满足三约束的点:满足车载容量(<=40),剩余电量续驶里程(已行驶距离要小于7),最剩余单车日行驶里程(<=15)
% [n,B,XY,dis,tw1,tw2,Q,QQ,per_km,max_hour,v,F,P_max,P0,W,...
% PowerConsumption,ChargePrice,s,Charge_station,D]=data();
%%
% global n B XY dis tw1 tw2 Q QQ per_km max_hour v F P_max P0 W PowerConsumption ChargePrice s Charge_station
%计算选择剩余未选点后的三个状态变量
%%
n=S.n; %客户数量
B=S.B; %充电桩数量
NV=S.NV; %所有点的个数:客户+充电桩+1
XY=S.XY; %所有点坐标
tw1=S.tw1 ; %时间窗
tw2=S.tw2;
W=S.W; % 需求量
Set=S.Set; % 服务时长
disXY=S.dpXY; %配送中心坐标
csXY=S.csXY; % 充电桩坐标
Charge_station=S.Charge_station; %充电桩对应编号 22:25
dis=S.dis;
Q=S.Q; %最大载重量
QQ=S.QQ;
per_km=S.per_km; %单位公里行驶成本
max_hour=S.max_hour; %一天最大行驶时长(小时)
v=S.v; %平均车速
F=S.F; %单车固定成本
P_max=S.P_max; %单车日行驶里程
P0=S.P0; %单次充电续驶里程
%
PowerConsumption=S.PowerConsumption; %百公里耗电量
ChargePrice=S.ChargePrice; %充电平均电价
%%
Weight_remainder2=(Weight_remainder-W(remainder));
Max_remainder_dis2=Max_remainder_dis-dis(current,remainder)-dis(1,remainder);
if sum(Max_remainder_dis2>=0)<length(remainder)%表示不都是第一种三约束,即存在小于0的点
[rol_1,col_1]=find(Max_remainder_dis2<0);%找到第二种三约束的点
[rol_2,col_2]=min(dis(remainder(col_1),Charge_station)');%找到距离最近的充电桩编号
Max_remainder_dis2(col_1)=Max_remainder_dis2(col_1)+dis(1,remainder(col_1))-min(dis(remainder(col_1),Charge_station)')-dis(1,Charge_station(col_2));
end
Charge_remainder_dis2=Charge_remainder_dis-dis(current,remainder)-min(dis(remainder,Charge_station)');
有任何问题请留言或者私信咨询,一起学习进步加油!