【TWVRP】节约算法求解带时间窗的电动车路径规划问题【含Matlab源码 1169期】

本文介绍了VRP的基本原理和常见问题类型,如旅行商问题、CVRP和VRPTW,着重讨论了节约算法在Matlab中的应用,包括部分源代码示例。作者分享了Matlab版本和相关研究参考文献,涵盖路径规划、优化算法和仿真咨询等多个领域。

💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab武动乾坤博客之家💞💞💞💞💞💞💞💞💞💥💥💥💥💥💥💥💥
🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀
在这里插入图片描述
🔊博主简介:985研究生,Matlab领域科研开发者;

🚅座右铭:行百里者,半于九十。

🏆代码获取方式:
优快云 Matlab武动乾坤—代码获取方式

更多Matlab路径规划仿真内容点击👇
Matlab路径规划(进阶版)

⛳️关注优快云 Matlab武动乾坤,更多资源等你来!!

⛄一、VRP简介

1 VRP基本原理
车辆路径规划问题(Vehicle Routing Problem,VRP)是运筹学里重要的研究问题之一。VRP关注有一个供货商与K个销售点的路径规划的情况,可以简述为:对一系列发货点和收货点,组织调用一定的车辆,安排适当的行车路线,使车辆有序地通过它们,在满足指定的约束条件下(例如:货物的需求量与发货量,交发货时间,车辆容量限制,行驶里程限制,行驶时间限制等),力争实现一定的目标(如车辆空驶总里程最短,运输总费用最低,车辆按一定时间到达,使用的车辆数最小等)。
VRP的图例如下所示:
在这里插入图片描述
2 问题属性与常见问题
车辆路径问题的特性比较复杂,总的来说包含四个方面的属性:
(1)地址特性包括:车场数目、需求类型、作业要求。
(2)车辆特性包括:车辆数量、载重量约束、可运载品种约束、运行路线约束、工作时间约束。
(3)问题的其他特性。
(4)目标函数可能是总成本极小化,或者极小化最大作业成本,或者最大化准时作业。

3 常见问题有以下几类:
(1)旅行商问题
(2)带容量约束的车辆路线问题(CVRP)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
该模型很难拓展到VRP的其他场景,并且不知道具体车辆的执行路径,因此对其模型继续改进。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(3)带时间窗的车辆路线问题
由于VRP问题的持续发展,考虑需求点对于车辆到达的时间有所要求之下,在车辆途程问题之中加入时窗的限制,便成为带时间窗车辆路径问题(VRP with Time Windows, VRPTW)。带时间窗车辆路径问题(VRPTW)是在VRP上加上了客户的被访问的时间窗约束。在VRPTW问题中,除了行驶成本之外, 成本函数还要包括由于早到某个客户而引起的等待时间和客户需要的服务时间。在VRPTW中,车辆除了要满足VRP问题的限制之外,还必须要满足需求点的时窗限制,而需求点的时窗限制可以分为两种,一种是硬时窗(Hard Time Window),硬时窗要求车辆必须要在时窗内到达,早到必须等待,而迟到则拒收;另一种是软时窗(Soft Time Window),不一定要在时窗内到达,但是在时窗之外到达必须要处罚,以处罚替代等待与拒收是软时窗与硬时窗最大的不同。
在这里插入图片描述
在这里插入图片描述
模型2(参考2017 A generalized formulation for vehicle routing problems):
该模型为2维决策变量
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(4)收集和分发问题
(5)多车场车辆路线问题
参考(2005 lim,多车场车辆路径问题的遗传算法_邹彤, 1996 renaud)
在这里插入图片描述
由于车辆是同质的,这里的建模在变量中没有加入车辆的维度。
在这里插入图片描述
在这里插入图片描述
(6)优先约束车辆路线问题
(7)相容性约束车辆路线问题
(8)随机需求车辆路线问题

4 解决方案
(1)数学解析法
(2)人机交互法
(3)先分组再排路线法
(4)先排路线再分组法
(5)节省或插入法
(6)改善或交换法
(7)数学规划近似法
(8)启发式算法

5 VRP与VRPTW对比
在这里插入图片描述

⛄二、节约算法简介

在这里插入图片描述
基本思想
在这里插入图片描述
行时通过这一条弧。

迭代步骤
在这里插入图片描述

⛄三、部分源代码

function [outcome1,outcome2,outcome3]=cw(Numberoffacilities,assignofpoint,ttimeu,timewindow,distMatrix,quantity,Qofcar,p1)
H=1;
outcome3=zeros(1,Numberoffacilities);%与设施点的伪编号是一一对应的
%%%%%%%找到实际分配的设施点,因为之前的chrom中为1的点,可能%%%%%%%%%%%%%
facilitypop=zeros(1:Numberoffacilities);
facilitypop(assignofpoint)=1;
trueSelectefacilities=find(facilitypop(1,:)1); %被选择的设施编号
trueselectNumberoffacilities=size(trueSelectefacilities,2);
outcome1=cell(1,trueselectNumberoffacilities);
outcome2=cell(1,trueselectNumberoffacilities);
for i=1:trueselectNumberoffacilities%此时的设施为i
a=trueSelectefacilities(i);%设施的伪编号
pointofsubroute=find(assignofpoint
a);%属于该设施点的所有需求点的伪编号
Numberofpointsofsubroute=size(pointofsubroute,2);%该设施点的需求点数量
judge=zeros(1,Numberofpointsofsubroute); %判断需求点的位置情况
chrom1=zeros(1,Numberofpointsofsubroute);%最后输入的是伪编号
chrom2=sort(pointofsubroute); %需求点伪编号从小到大排序
originalchrom2=chrom2;

    %%对关键节点先分配一个车辆给它?????????????????????对不对?
    %for j=1:Numberofpointsofsubroute            
        %if timewindow(chrom2(j),2)==timewindow(chrom2(j),3)                  
            %chrom1(j)=H;
            %H=H+1;                
        %end
    %end      
    %%%%%%%%计算到达时间%%%%%%%%%%%%%%%%%%%%        
    arrivetime=zeros(1,Numberofpointsofsubroute);%需求点的到达时间,与当前的originalchrom2位置一一对应,与分配给该设施点的需求点一一对应        
    for j=1:Numberofpointsofsubroute            
        if ttimeu(chrom2(j)+Numberoffacilities,a)<timewindow(chrom2(j),2)                
            arrivetime(j)=timewindow(chrom2(j),2);                
        else
            arrivetime(j)=ttimeu(chrom2(j)+Numberoffacilities,a);                
        end
    end        
    %%%%%%%%%%%%%%%%%%%%%%%%%路径节约值列表%%%%%%%%%%%%%%%%%%%%%%        
    savingnumber=zeros(Numberofpointsofsubroute);%与分配给该设施的需求点的伪编号一一对应        
    for j=1:Numberofpointsofsubroute            
        for z=1:Numberofpointsofsubroute                
            if j~=z                       
                savingnumber(j,z)=distMatrix(chrom2(j)+Numberoffacilities,a)+distMatrix(chrom2(z)+Numberoffacilities,a)-distMatrix(chrom2(j)+Numberoffacilities,chrom2(z)+Numberoffacilities);                    
            end
        end
    end        
    [a b]=max(savingnumber);%a输入值,b中对应的数字为行,对应的列数为列        
    [c d]=max(a);%c输入具体的当前节约值,d为列数         
    e=b(d);%e为行 
    %%%在节约值列表中e行d列是当前最大的节约量
    E=chrom2(e);%此时的E为节约量最大的需求点伪编号之一
    D=chrom2(d);%此时的D为节约量最大的需求点伪编号之1       
    done=1;            
    while(done<2)                
        if judge(e)==0&&judge(d)==0                 
            PD=0;                
            a=quantity(E,2)+quantity(D,2);
            aa=quantity(E,3)+quantity(D,3);
            pp1=normcdf(Qofcar,a,sqrt(aa));
            a2=find(chrom2==D);                
            b2=find(chrom2==E);
            if pp1>p1                       
                EFj=arrivetime(e)+ttimeu(E+Numberoffacilities,D+Numberoffacilities)-arrivetime(d);                      
                if EFj<0                             
                    aheadtime=arrivetime(d)-timewindow(D,2);                           
                    if aheadtime>=-EFj                                
                        PD=1;                                 
                    end
                elseif EFj==0
                    PD=1;                        
                elseif EFj>0                          
                    delaytime=timewindow(D,3)-arrivetime(d);                            
                    if delaytime>=EFj                             
                        PD=1;                               
                    end
                end
                if PD==1                        
                    chrom1(e)=H;                            
                    chrom1(d)=H;%H为车辆编号                          
                    judge(e)=1;%与设施直接相连的起点为1                          
                    judge(d)=2;%与设施直接相连的终点为2                           
                    H=H+1;                            
                    arrivetime(d)=arrivetime(d)+EFj;
                    if b2>a2
                        chrom2(a2)=E;
                        chrom2(b2)=D;
                    end
                end
            end
            savingnumber(e,d)=0;                
        elseif judge(e)==0&&judge(d)==1;                 
            a2=find(chrom2==D);                
            b2=find(chrom2==E);                
            a=find(chrom1==chrom1(a2));                
            b=sum(quantity(chrom2(a),2))+quantity(E,2);
            bb=sum(quantity(chrom2(a),3))+quantity(E,3);                
            pp1=normcdf(Qofcar,b,sqrt(bb)); 
            c=size(a,2);
            if pp1>p1                       
                EFj=arrivetime(e)+ttimeu(E+Numberoffacilities,D+Numberoffacilities)-arrivetime(d);                    
                if EFj<0                          
                    a1=10000;                            
                    for j=1:c                            
                        b1=find(originalchrom2==chrom2(a(j)));                            
                        Aheadtime=arrivetime(b1)-timewindow(chrom2(a(j)),2);                             
                        if Aheadtime<a1                                     
                            aheadtime=Aheadtime;                                   
                            a1=Aheadtime;                                 
                        end
                    end
                    if aheadtime>=-EFj                            
                        PD=1;                             
                    end
                elseif EFj==0                        
                    PD=1;                             
                elseif EFj>0                           
                    a1=10000;                         
                    for j=1:c                               
                        b1=find(originalchrom2==chrom2(a(j)));                            
                        Delaytime=timewindow(chrom2(a(j)),3)-arrivetime(b1);                              
                        if Delaytime<a1                                       
                            delaytime=Delaytime;                                     
                            a1=Delaytime;                                     
                        end
                    end
                    if delaytime>=EFj                            
                        PD=1;                                 
                    end
                end
                
                if PD==1                        
                    chrom1(b2)=chrom1(a2);                          
                    a1=find(chrom1==chrom1(a2));                          
                    CHROM2=chrom2;                          
                    chrom2(a1(1))=CHROM2(b2);                          
                    k=2;                             
                    while(k<=c+1)                               
                        chrom2(a1(k))=CHROM2(a(k-1));                               
                        k=k+1;                              
                    end
                    judge(d)=10;%10为内点                        
                    judge(e)=1;                          
                end
            end                
            savingnumber(e,d)=0;
        elseif judge(e)==0&&judge(d)==2                
            a2=find(chrom2==D);                
            b2=find(chrom2==E);                
            a=find(chrom1==chrom1(a2));                    
            b=sum(quantity(chrom2(a),2))+quantity(E,2);
            bb=sum(quantity(chrom2(a),3))+quantity(E,3);
            pp1=normcdf(Qofcar,b,sqrt(bb));  
            c=size(a,2);                        
            if pp1>p1                        
                EFj=arrivetime(d)+ttimeu(E+Numberoffacilities,D+Numberoffacilities)-arrivetime(e);                      
                if EFj<0                             
                    aheadtimee=arrivetime(e)-timewindow(E,2);                                
                    aheadtimed=arrivetime(d)-timewindow(D,2);                           
                    if aheadtimee<aheadtimed                              
                        aheadtime=aheadtimee;                              
                    else
                        aheadtime=aheadtimed;                            
                    end
                    if aheadtime>=-EFj                            
                        PD=1;                                
                    end
                elseif EFj==0                        
                    PD=1;                             
                elseif EFj>0                          
                    delaytimee=timewindow(E,3)-arrivetime(e);                          
                    delaytimed=timewindow(D,3)-arrivetime(d);                             
                    if delaytimee<delaytimed                                
                        delaytime=delaytimee;                               
                    else
                        delaytime=delaytimed;                            
                    end
                    if delaytime>=EFj                            
                        PD=1;                               
                    end
                end
                if PD==1                        
                    chrom1(b2)=chrom1(a2);                             
                    a1=find(chrom1==chrom1(a2));                         
                    CHROM2=chrom2;                          
                    k=1;                              
                    while(k<=c)                               
                        chrom2(a1(k))=CHROM2(a(k));                               
                        k=k+1;                                    
                    end
                    chrom2(a1(k))=E;                        
                    judge(d)=10;                         
                    judge(e)=2;                           
                end
            end
            savingnumber(e,d)=0;
        elseif judge(e)==1&&judge(d)==0                 
            a2=find(chrom2==D);                
            b2=find(chrom2==E);                
            a=find(chrom1==chrom1(b2));                   
            b=sum(quantity(chrom2(a),2))+quantity(D,2);
            bb=sum(quantity(chrom2(a),3))+quantity(D,3);                
            pp1=normcdf(Qofcar,b,sqrt(bb));            
            c=size(a,2);                  
            if pp1>p1                        
                EFj=arrivetime(e)+ttimeu(E+Numberoffacilities,D+Numberoffacilities)-arrivetime(d);                    
                if EFj<0                         
                    a1=10000;                            
                    for j=1:c                            
                        b1=find(originalchrom2==chrom2(a(j)));                             
                        Aheadtime=arrivetime(b1)-timewindow(chrom2(a(j)),2);                            
                        if Aheadtime<a1                                      
                            aheadtime=Aheadtime;                                   
                            a1=Aheadtime;                                   
                        end
                    end
                    if aheadtime>=-EFj                            
                        PD=1;                                
                    end
                elseif EFj==0                        
                    PD=1;                            
                elseif EFj>0                           
                    a1=10000;                          
                    for j=1:c                              
                        b1=find(originalchrom2==chrom2(a(j)));                             
                        Delaytime=timewindow(chrom2(a(j)),3)-arrivetime(b1);                               
                        if Delaytime<a1                                        
                            delaytime=Delaytime;                                    
                            a1=Delaytime;                                 
                        end
                    end

⛄四、运行结果

在这里插入图片描述

⛄五、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1]金武杰,刘波,周晓成.基于C-W节约算法的电缆巡线路径优化[J].第十三届电力工业节能减排学术研讨会论文集

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

🍅 仿真咨询
1 各类智能优化算法改进及应用

生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化

2 机器学习和深度学习方面
卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断

3 图像处理方面
图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知

4 路径规划方面
旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化

5 无人机应用方面
无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配

6 无线传感器定位及布局方面
传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化

7 信号处理方面
信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化

8 电力系统方面
微电网优化、无功优化、配电网重构、储能配置

9 元胞自动机方面
交通流 人群疏散 病毒扩散 晶体生长

10 雷达方面
卡尔曼滤波跟踪、航迹关联、航迹融合

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值