【路径规划】基于遗传算法求解带时间窗车辆路径规划问题(VRPTW)matlab源码

​1 简介

有时间窗的车辆路径问题(Vehicle Routing Problem with Time Windows,VRPTW)因为其有重要的现实意义而备受关注.其时间窗即为客户接受服务的时间范围,该问题是运筹学和组合优化领域中的著名NP问题,是解决物流配送效率的关键,传统寻优方法效率低,耗时长,找不到满意解,往往导致物流成本过高.为了提高寻优效率,降低物流运送成本,基本遗传算法求解VRPTW问题.首先建立数学模型,然后基于大规模邻域搜索算法(LNS)生成遗传算法初始解,最后利用遗传算法在初始种群中找到最优解.计算结果表明,遗传算法可以更好求解车辆路径问题,有效降低物流成本.

img

img

img

2 部分代码

 

%%遗传算法求解vrp问题(为选择操作从新设计后程序)

%D是距离矩阵,n为种群个数

%m为适配值淘汰加速指数,最好取为1,2,3,4,不宜太大

%交叉概率Pc,变异概率Pm

%R为最短路径,Rlength为路径长度

clc;

clear all

close all

t0=cputime;%计时开始

filename='.\Solomon\c101.txt';

[NO,XCOORD, YCOORD,DEMAND,READY_TIME,DUE_DATE,SERVICE_TIME]=textread(filename,'%s%s%s%s%s%s%s','headerlines',8);%读取数据

timewindows=[str2num(char(READY_TIME))';str2num(char(DUE_DATE))'];%时间窗

coordinate=[str2num(char(XCOORD)),str2num(char(YCOORD))];%位置坐标

demand=str2num(char(DEMAND))';%需求量

service=str2num(char(SERVICE_TIME))';%服务时间

D=distanse(coordinate);

popsize=80;%种群数量

capacity = 200;%车子载重

%经验公式m=[Σgi /aq]+1,粗求车辆数

a = 0.8;   %【3】

k1 = round((sum(abs(demand))./(a*capacity)))-2;    %最小车辆数

k2 = round((sum(abs(demand))./(a*capacity)))+1;    %最大车辆数

% k1=size(NO);

% k2=k1+10;

original = 100;%初始每辆车的载货量

C=200;%C为停止代数,遗传到第 C代时程序停止,C的具体取值视问题的规模和耗费的时间而定

Pc=0.9;%交叉概率

Pm=0.4;%变异概率

%  R = zeros(1,n+k);

% tempR = zeros(1,n+k);

minvalue = 1000000;%随便设置的最优值,不能太小

for k = k1:1:k2 %每种车辆数做一次寻优

    [tempR,tempvalue] = Run_VRP(D,demand,popsize,timewindows,k,capacity,original,C,Pc,Pm,service);%运算返回最优路径R和其总距离Rlength

    if min(tempvalue) < minvalue

        minvalue = min(tempvalue);%如果小于最小适应度值,替代&& min(tempvalue)>100

        R = tempR;%保存最小路径

        minvehicle = k;%保存最小车辆数量

        shiyingdu=tempvalue ;%保存最小染色体

    end

    

    % disp(['最优染色体',num2str(tempR)]);

    % disp(['最小车辆数',num2str(k)]);

    % disp(['最小里程数',num2str(min(tempvalue))]);

    % pause

end

TimeCost=cputime-t0;%

disp(['最优染色体',num2str(R)]);

disp(['最小车辆数',num2str(minvehicle)]);

disp(['最小里程数',num2str(minvalue)]);

% myplot(R,coordinate',n+k);

figure(3)

sz=100;

% scatter(coordinate(:,1),coordinate(:,2),50);%客户位置

hold on

[n,nn] = size(D);%节点个数

for i=2:n

    plot(coordinate(i,1),coordinate(i,2),'ro','MarkerSize',5,'MarkerEdgeColor','k','MarkerFaceColor','b');

    text(coordinate(i,1)-0.001,coordinate(i,2)+0.005,[num2str(i-1)],'Fontsize',10);hold on

end

hold on

plot(coordinate(1,1),coordinate(1,2),'p','MarkerSize',30,'MarkerEdgeColor','k','MarkerFaceColor','y');hold on%发货中心

ss=0;

cost=zeros(k,1);

for j=1:length(R)-1

    if R(j)==0

        ss=ss+1;

    end

    switch ss

        case 1

            line([coordinate(R(j)+1,1),coordinate(R(j+1)+1,1)],[coordinate(R(j)+1,2),coordinate(R(j+1)+1,2)]);hold on%%画出车辆1的路程

            cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆1的路程

        case 2

            line([coordinate(R(j)+1,1),coordinate(R(j+1)+1,1)],[coordinate(R(j)+1,2),coordinate(R(j+1)+1,2)],'Color','r');hold on%%画出车辆2的路程

            cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆2的路程

        case 3

            line([coordinate(R(j)+1,1),coordinate(R(j+1)+1,1)],[coordinate(R(j)+1,2),coordinate(R(j+1)+1,2)],'Color','g');hold on %%画出车辆3的路程

            cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程

        case 4

            line([coordinate(R(j)+1,1),coordinate(R(j+1)+1,1)],[coordinate(R(j)+1,2),coordinate(R(j+1)+1,2)],'Color','k');hold on %%画出车辆3的路程

            cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程

        case 5

            line([coordinate(R(j)+1,1),coordinate(R(j+1)+1,1)],[coordinate(R(j)+1,2),coordinate(R(j+1)+1,2)],'Color','y');hold on %%画出车辆3的路程

            cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程

        case 6

            line([coordinate(R(j)+1,1),coordinate(R(j+1)+1,1)],[coordinate(R(j)+1,2),coordinate(R(j+1)+1,2)],'Color','m');hold on %%画出车辆3的路程

            cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程

        case 7

            line([coordinate(R(j)+1,1),coordinate(R(j+1)+1,1)],[coordinate(R(j)+1,2),coordinate(R(j+1)+1,2)],'Color',[1 0.6 0.3]);hold on %%画出车辆3的路程

            cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程

        case 8

            line([coordinate(R(j)+1,1),coordinate(R(j+1)+1,1)],[coordinate(R(j)+1,2),coordinate(R(j+1)+1,2)],'Color',[0.5 0.5 0.5]);hold on %%画出车辆3的路程

            cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程

        case 9

            line([coordinate(R(j)+1,1),coordinate(R(j+1)+1,1)],[coordinate(R(j)+1,2),coordinate(R(j+1)+1,2)],'Color',[0.6 0.4 0.7]);hold on %%画出车辆3的路程

            cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程

        case 10

            line([coordinate(R(j)+1,1),coordinate(R(j+1)+1,1)],[coordinate(R(j)+1,2),coordinate(R(j+1)+1,2)],'Color',[0.8 0.4 0.7]);hold on %%画出车辆3的路程

            cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程

        case 11

            line([coordinate(R(j)+1,1),coordinate(R(j+1)+1,1)],[coordinate(R(j)+1,2),coordinate(R(j+1)+1,2)],'Color',[0.6 0.6 0.7]);hold on %%画出车辆3的路程

            cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程

        case 12

            line([coordinate(R(j)+1,1),coordinate(R(j+1)+1,1)],[coordinate(R(j)+1,2),coordinate(R(j+1)+1,2)],'Color',[0.6 0.4 0.7]);hold on %%画出车辆3的路程

            cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程

        otherwise

            line([coordinate(R(j)+1,1),coordinate(R(j+1)+1,1)],[coordinate(R(j)+1,2),coordinate(R(j+1)+1,2)],'Color','c');hold on %%画出车辆4的路程

            cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆4的路程

    end

end

minvalue1=sum(cost);

title(['车子数',num2str(minvehicle)]);

xlabel('横坐标');

ylabel('纵坐标')

img =gcf;  %获取当前画图的句柄

print(img, '-dpng', '-r600', './img1.png')         %即可得到对应格式和期望dpi的图像

figure(2)

plot(1:C,shiyingdu,'b-');

xlabel('迭代次数');

ylabel('适应度');

hold on

img =gcf;  %获取当前画图的句柄

print(img, '-dpng', '-r600', './img.png')         %即可得到对应格式和期望dpi的图像

disp(['最少时间代价',num2str(TimeCost)]);

3 仿真结果

4 参考文献

[1]张露. (2020). 基于改进遗传算法求解带时间窗车辆路径规划问题. 中国物流与采购(14).

  • 4
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Matlab科研辅导帮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值