Matlab基于遗传算法求解带充电站的含时间窗车辆路径规划VRPTW问题

一、遗传算法(GA)


基本思想是种群仿照生物遗传进化,通过基因交叉、突变繁衍出子代,形成新的种群,然后根据种群中每个个体的适应值,淘汰代价较高的个体,余下个体继续繁衍。在VRP问题中具体步骤如下:
(1)设定种群大小,设定繁衍代数,对所有的配送点编号,每个个体对应于所有配送点的一种排序,初始化得到初始种群;
(2)通过交叉、变异操作,形成子代,与原来的父代形成新的种群;
(3)根据载货量限制,确定何时回货源取货,再结合代价标准,对种群中的每个个体计算适应值;
(4)根据适应值,淘汰代价高的父代子代,余下个体形成新的种群,繁衍代数增加1;
(5)若繁衍代数达到(1)中设定的初值,停止繁衍,返回代价最小的个体,即最为最佳的配送次序;否则,返回(2)。
 

 二、有时间窗车辆路径问题(TWVRP模型)

 有时间窗车辆路径问题(vehicle routing problems with time windows,VRPTW)车辆路线问题(VRP)最早是由Dantzig和Ramser于1959年首次提出,它是指一定数量的客户,各自有不同数量的货物需求,配送中心向客户提供货物,由一个车队负责分送货物,组织适当的行车路线,目标是使得客户的需求得到满足,并能在一定的约束下,达到诸如路程最短、成本最小、耗费时间最少等目的。

三、部分代码

%% 包括充电站
clc;
clear all
close all

filename='.\evrptw_instances\c101_21.txt';
[NO,type,XCOORD, YCOORD,DEMAND,READY_TIME,DUE_DATE,SERVICE_TIME]=textread(filename,'%s%s%s%s%s%s%s%s','headerlines',1);
%% 进行经验求解路径
K=1:50;%对客户点随机排序
M=50;%任务量
capacity = 200;%车子载重
timewindows_yuanshi=[str2num(char(READY_TIME))';str2num(char(DUE_DATE))'];%时间窗
coordinate_yuanshi=[str2num(char(XCOORD)),str2num(char(YCOORD))];%坐标信息
coordinate_chongdianzhan=[coordinate_yuanshi(2:22,1)';coordinate_yuanshi(2:22,2)';]';%充电站坐标
demand_yuanshi=str2num(char(DEMAND))';%所有需求
service_yuanshi=str2num(char(SERVICE_TIME))';%所有服务时间
D=distanse(coordinate_yuanshi);%距离
coordinate=[coordinate_yuanshi(1,1),coordinate_yuanshi(K(1:M)+22,1)';coordinate_yuanshi(1,2),coordinate_yuanshi(K(1:M)+22,2)';]';%中心和客户坐标位置
timewindows=[timewindows_yuanshi(1,1),timewindows_yuanshi(1,K(1:M)+22) ;timewindows_yuanshi(1,2),timewindows_yuanshi(2,K(1:M)+22)];%随机选取的客户点时间窗
demand=[demand_yuanshi(1),demand_yuanshi(K(1:M)+22)];%随机选取的客户点需求
service=[service_yuanshi(1),service_yuanshi(K(1:M))+22];%随机选取的客户点服务时间
D2=distanse(coordinate);%距离
renwudian1=[1,K(1:M)+22];%包括起点的任务点
Q=77.751111;%电量
r=0.4;%消耗率
g=0.5;%充电
v=1;%速度

% %% 遗传参数初始化
C=1000;%C为停止代数,遗传到第 C代时程序停止,C的具体取值视问题的规模和耗费的时间而定
Pc=0.9;%交叉概率
Pm=0.4;%变异概率
popsize=50;%种群数量
%经验公式m=[Σgi /aq]+1,粗求车辆数

a = 0.8;   %【3】
k1 = round((sum(abs(demand))./(a*capacity)));    %最小车辆数
k2 = round((sum(abs(demand))./(a*capacity)))+1;    %最大车辆数
original = 200;%初始每辆车的载货量
minvalue_ga = 1000000;%随便设置的最优值,不能太小
for k = k1:1:k2 %每种车辆数做一次寻优
   
    [tempR,tempvalue] = Run_VRP(D,D2,demand,popsize,timewindows,k,capacity,original,C,Pc,Pm,service,renwudian1,Q,r,g,v);%运算返回最优路径R和其总距离Rlength
    if min(tempvalue) < minvalue_ga
        minvalue_ga = min(tempvalue);%如果小于最小适应度值,替代&& min(tempvalue)>100
        R_ga = tempR;%保存最小路径
        minvehicle = k;%保存最小车辆数量
        shiyingdu=tempvalue ;%保存最小染色体
    end
end
disp(['遗传求解的适应度值',num2str(minvalue_ga)])
result(D,coordinate_yuanshi,R_ga);
title('遗传求解')
figure(3)

plot(shiyingdu);
xlabel('代数')
ylabel('适应度值')
title('遗传迭代图')

四、仿真结果

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Matlab科研辅导帮

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

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

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

打赏作者

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

抵扣说明:

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

余额充值