基于电动汽车的带时间窗的路径优化(Python&Matlab代码实现)

目录

1 概述

2 数学模型描述

2.1 有容量约束的路径问题模型

2.2 带时间窗的车辆路径问题基本模型

3 算例及代码实现

3.1算例介绍

3.2 Python代码

3.3 Matlab代码实现

3.4 结果


1 概述

(1)本文结合电动汽车的特点构建了以总配送成本最小为目标的带有惩罚函数的基于电动汽车的带时间窗的车辆路径优化问题(VRPTW )模型。
(2)对求解车辆路径优化问题的各种方法进行比较之后,本文采用遗传算法,设计了适合求解本文模型的染色体编码方式和遗传算子。算例分析结果验证了模型及算法的有效性。

2 数学模型描述

2.1 有容量约束的路径问题模型


问题描述
某配送中心为各个已知客户点进行配送服务。配送中心的每辆配送车辆都有装载能力的限制。安排科学合理的车辆行驶路线,使一定数量的配送车辆从配送中心出发,完成配送任务后返回配送中心。路线规划的目标是配送成本最小。

2.2 带时间窗的车辆路径问题基本模型

(1)带时间窗车辆路径问题的描述
带时间窗的车辆路径优化问题(Vehicle Routing Problems with Time Windows,VRPTW)是以上文所述的经典的车辆路径优化问题为基础。在此基础上,新增了每个客户点都有物流配送时间的限制。我们称客户点的时间限制为时间窗。
带时间窗的物流配送服务在实际的配送过程中会出现三种情况。
第一种情况 ,物流配送车辆早于客户要求的最早时间到达。这种情况下,配送车辆需要等待到客户要求的最早时间点才能进行卸货。
第二种情况 ,物流配送车辆正好在客户点规定的时间窗内到达,配送车辆到达后就可以直接进行卸货。
第三种情况 是物流配送车辆晚于客户点规定的最晚时间到达客户点。在这种情况下会出现两种结果。第一种结果,客户点拒绝接收货物。我们称这种情形下的时间窗为硬时间窗。硬时间窗的客户点要求物流配送车辆可以早于时间窗规定的最早服务时间到达,但是需要等待到客户点最早服务时间才能开始卸货,配送车辆也可以正好在客户规定的时间内到达,此时配送车辆到达客户点后可以直接进行卸货。第二种结果,客户点同意接收配送的货物,但是物流配送中心需要接受一定的惩罚。我们称这种情形下的时间窗为软时间窗。软时间窗的客户点允许物流配送车辆在客户点规定的时间外到达。软时间窗与硬时间窗相同的是,如果配送车辆早于客户点规定的时间到达,需要等待到客户点的最早接受服务的时间才能开始卸货;如果配送车辆正好在客户规定的时间内到达,此时配送车辆到达客户点后可以直接进行卸货。软时间窗与硬时间窗不同的是,在软时间窗情形下,配送车辆晚于客户点规定的时间到达时,客户点接受货物;但是在硬时间窗的情形下,如果配送车辆晚于客户点规定的时间窗到达,客户点不会接受货物。
 

与构建普通的车辆路径优化问题模型不同,构建带时间窗的车辆路径问题模型需要考虑物流配送中心因为违反客户点规定的时间而遭受到的惩罚成本。硬时间窗情形下,惩罚成本只包含配送车辆早到而遭受到的惩罚。而软时间窗情形下,惩罚成本包括两部分,因为配送车辆早到遭受的惩罚成本和因为配送车辆晚到而遭受到来自客户点的惩罚成本。 

3 算例及代码实现

3.1算例介绍

某物流配送中心为25个客户点提供配送服务,每个客户的货物需求量、时间窗不同。配送中心拥有3辆同一类型的电动汽车,其续驶里程dis为160km,额定载重量Q为5t。假设电动汽车进入充电站就选择充满电,充电时间为0.4h;假设电动汽车从配送中心出发的时间为0h,且在配送过程中的行驶速度恒定为40 km/ h。电动汽车的行驶成本为10元/km,惩罚成本系数epu为20元/h,lpu为30元/h。算例的其他数据在表5.1中列出。表3.1中的第一列数据代表配送中心、客户点及充电站的编号,0代表配送中心,1,2,3,…,25代表客户点,26,27代表充电站;第二列和第三列分别表示配送中心、客户点、充电站的X坐标和坐标,
本文假定客户之间的距离为欧氏距离;表中第四列表示客户点的货物需求量;第五、六列分别表示客户要求的服务时间窗;第七列表示客户点需要服务的时间。如何安排车辆才能使得总费用最小。

                                             表3.1客户需求信息

图3.2表示的是算例中配送中心、客户点及充电站的位置分布,其中圆圈“O”表示配送中心,圆点表示客户点,三角“△”代表充电站。

           

                        图3.2配送中心、客户点及充电站的位置分布

3.2 Python代码

if __name__ == "__main__" :
    genes = getRandomGenes(geneNum) # 初始种群
    # 迭代
    for i in tqdm(range(generationNum)):
        updateChooseProb(genes)
        sumProb = getSumProb(genes)
        chosenGenes = choose(deepcopy(genes))   # 选择
        crossedGenes = cross(chosenGenes)   # 交叉
        genes = mergeGenes(genes, crossedGenes) # 复制交叉至子代种群
        genes = vary(genes) # under construction
    # sort genes with respect to chooseProb
    key = lambda gene: gene.fit
    genes.sort(reverse=True, key=key)   # 以fit对种群排序
    print('\r\n')
    print('data:', genes[0].data)
    print('fit:', genes[0].fit)
    genes[0].plot() # 画出来

基于电动汽车的带时间窗的路径优化(Python代码) 

3.3 Matlab代码实现

代码写得差不多了,就是有少许有问题,也不想继续调试了, 如果想继续拿去调试:

基于电动汽车的带时间窗的路径优化(Matlab代码实现)

%% 适应度函数
function [fit,ff,p]=fitness(NIND,m,Ck,Dis,C1,C2,LT,ET,s,Qk,q,k,speed,ch,TT,X)
f=zeros(NIND,1);M=1000000;p=-zeros(NIND,1);%M很大的数
dd=zeros(NIND,3);ddd=zeros(NIND,1);qq=zeros(NIND,3);qqq=zeros(NIND,1);
ps=zeros(NIND,1);f=zeros(NIND,1);ff=zeros(NIND,1);fit=zeros(NIND,1);
l=ostation(m,k,NIND,s,ch);
pun=punish(C1,C2,LT,ET,m,NIND,k,s,speed,ch,TT);d=sumd(s,m,k,NIND,ch,X);
Q=sumq(NIND,q,s,k,m,ch);
for i=1:NIND
    for j=1:9
        if Dis>d(i,j)%Dis 续驶里程
            dd(ij)=0;
        else
            dd(i,j)=1;
        end
    end
end
for i=1:NIND
    for j=1:3
        ddd(i)=ddd(i)+dd(i,j);
        
    end
end
for i=1:NIND
    for j=1:3
        if Qk>Q(ij)
            qq(ij)=0;
        else
            qq(ij)=1;
        end
    end
end
for i=1:NIND
    for j=1:3
        qqq(i)=qqq(i)+qq(ij);
    end
end
for i=1:NIND
    f(i)=Ck*(d(i,1)+d(i,2)+d(i,3)+d(i,4)+d(i,5)+d(i,6)+d(i,7)+d(i,8)+d(i,9))+pun(i)+M*ddd(i)+M*qqq(i);
    fit(i)=1./f(i);
    ff(i)=Ck*(d(i,1 )+d(i,2)+d(i,3)+d(i,4)+d(i,5)+d(i,6)+d(i,7)+d(i,8)+d(i,9))+pun(i);
end
%计算选择概率
fitsum=O;
for i=1:NIND
    fitsum=fitsum+fit(i);
end
for i=1:NIND
    ps(i)=fit(i)/fitsum;
end
%计算累计概率
p(1)=ps(1);
for i=2:NIND
    p(i)=p(i-1)+ps(i);
end
%% 计算两两城市之间的欧式距离
function D=Distance(X)
row=size(X,1);
D=zeros(row,row);
for i=1:row
    for j=i+1:row
        D(i,j)=((X(i,1)-X(j,1))^2+(X(i,2)-X(j,2))^2)^0.5;
        D(j,i)=D(i,j);
    end
end
%% 主程序
clear all;
clc;
k=3;m=25;ch=2; %3辆车,25个客户点,2个充电站
%q=[0,0.2, 0.3, 0.3, 0.3, 0.3, 0.5, 0.8, 0.4, 0.5, 0.7, 0.7, 0.6, 0.2, 0.2, 0.4,
%   0.1, 0.1, 0.2, 0.5, 0.2, 0.7, 0.2, 0.7, 0.1, 0.5,0,0];%各客户点需求量,其中配送中心/充电站需求量为0,其中q(1)为配送中心,以此类推

q=[0 0.2 0.3 0.3 0.3 0.3 0.5 0.8 0.4 0.5 0.7 0.7 0.6 0.2 0.2 0.4 0.1 0.1 0.2 0.5 0.2 0.7 0.2 0.7 0.1 0.5 0 0]; %各客户点需求量,其中配送中心/充电站需求量为0,其中q(1)为配送中心,以此类推

X=[56 56
    66 78
    56 27
    88 72
    88 32
    24 48
    40 48
    32 80
    16 69
    88 96
    48 96
    32 104
    80 56
    48 40
    24 16
    48 8
    16 32
    8 48
    32 64
    24 96
    72 104
    72 32
    72 16
    88 8
    104 56
    104 32
    83 45
    32 40];%配送中心、充电站和客户点的坐标位置,配送中心在第1位,充电站点在最后
ET=[0 1 2 7 5 3 0 7 1 4 1 3 0 2 2 7 6 7 1 1 8 6 7 6 4 0 0];%客户要求到货的时间始点,充电站范围是[0,100]
LT=[1 2 4 8 6 5 2 8 3 5 2 4 1 4 3 8 8 9 3 3 10 10 8 7 6 100 100];%客户要求到货的时间终点
TT=[0.2 0.3 0.3 0.3 0.3 0.5 0.8 0.4 0.5 0.7 0.7 0.6 0.2 0.2 0.4 0.1 0.1 0.2 0.5 0.2 0.7 0.2 0.7 0.1 0.5 0.4 0.4];%客户点的停留时间,充电站的停留时间为0.4
Ck=10; %第k辆车运行单位距离的费用
C1=20;%车辆在任务点处等待单位时间的机会成本
C2=30; %车辆在要求时间之后到达单位时间所处的惩罚值Dis=160;%续驶里程
Qk=5;%车辆额定载重量
speed=40;%电动汽车的行驶速度
NIND=100;%种群大小
maxgen=100;
%遗传代数
pc=0.9;
%交叉概率
pm=0.05;
%变异概率
%s=chushihua(NIND,m,ch);%初始化种群
s=zeros(:)
%优化
gen=0;
figure;
hold on;
box on;
xlim([0,maxgen]);
title('优化过程');
xlabel('代数');
ylabel('最优值');
D=Distance(X);
l=ostation(m,k,NIND,s,ch);
[fit,ff,p]=fitness(NIND,m,Ck,Dis,C1,C2,LT,ET,s,Qk,q,k,speed,ch,TT,X);
%计算适应度和模型目标函数值
preff=min(ff);
sperfect=zeros(maxgen,m+k+ch+1);
while gen<maxgen
    %计算适应度和模型目标函数值
    [fit,ft.p]=fitness(NIND,m,Ck,Dis,C1,C2,LT,ET,s,Qk,q,k,speed,ch,TT,X);
    %绘制模型目标函数优化过程图
    line([gen-1,gen],[preff,min(ff)]);
    preff=min(ff);
    %选择操作
    seln=sel(NIND,m,Ck,Dis,C1,C2,LT,ET,s,Qk,q,X,k,ch,speed,TT);
    %交叉操作
    scro=cro(s,m,pc,NIND,Ck,Dis,C1,C2,LT,ET,Qk,q,X,k,ch,speed,TT);
    %变异操作
    scro=mut(s,m,k,pc,NIND, Ck,Dis,C1,C2,LT,ET,Qk,q,X,ch,speed,TT,pm)
    %重插入子代
    s=reins(NIND,m,Ck,Dis,C1,C2,LT,ET,s,Qk,q,k,speed,ch,TT,X,pm,pc)
    %记录当前代最好适应度
    [fitmax,nmax]=max(fit);%更新迭代次数
    gen=gen+1;
    sperfect(gen,:)=s(nmax,:);
end
%输出最优解的路线和最优目标函数值
disp('最优解:')
%pp=outputpath(NIND,m,Ck,Dis,C1,C2,LT,ET,s,Qk,q.k,speed,ch,TT,Xdisp(s(nmax,:))%最优路线
[fit,ff,p]=fitness(NIND,m,Ck,Dis,C1,C2,LT,ET,s,Qk,q,k,speed,ch,TT,X);
disp(['目标函数值: ',num2str(max(ff))])

3.4 结果

100%|██████████| 3000/3000 [01:21<00:00, 36.65it/s]


data: [0, 13, 27, 5, 6, 2, 22, 23, 25, 21, 0, 7, 19, 11, 10, 8, 18, 0, 1, 20, 9, 3, 12, 26, 4, 15, 14, 16, 17, 24, 0]
fit: 9.991184414431451e-08

                                               表3.2运输路线及配送成本 


                         
 

猜你喜欢

转载自blog.csdn.net/weixin_46039719/article/details/124988522