1、外卖配送中与普通路径优化的区别
(1)外卖配送中必须先取订单在进行配送,所以染色体是有序排列的
(2)两点间的距离并不代表十几的距离
(3)在进行交叉与变异时也只能运用特殊的方法
(4)如有载货限制顾客-1,商家+1进行计算
原始数据
(1)第一列0为原点,1-5为商家 6-10为顾客
(2)二三列为坐标
(3)四五列为时间窗的开始与结束
产生种群
5 2 3 4 10 1 8 9 7 6
如上,在产生种群时,商家1的订单对应客户6,以此类推,所以1必须在6的前面,2、3、4、5都是如此。
选择
选择采用锦标赛,适应度为距离的倒数
交叉与变异
采用保续的交叉法如下
变异
结果
gs为超过顾客最晚时间窗的订单个数,
w1为软时间窗违反的总时间
优化过程
优化结果,其中超过客户最晚时间窗的用三角在图中标了出来。
主程序如下
clear
clc
close all
tic
%% 读取数据
load('shuju');
bl=0;
%% 提取数据信息
E=shuju(1,4); %初始点时间窗开始时间
L=shuju(1,5); %初始点心时间窗结束时间
zuobiao=shuju(:,2:3); %所有点的坐标x和y
zuobiao=[zuobiao(:,1),-zuobiao(:,2)];
customer=zuobiao(2:end,:); %顾客坐标
cusnum=size(customer,1); %顾客数
v_num=1; %车辆数
a=shuju(2:end,4); %顾客时间窗开始时间[a[i],b[i]]
b=shuju(2:end,5); %顾客时间窗结束时间[a[i],b[i]]
dist=Distanse(zuobiao); %根据坐标的欧式距离矩阵
% dist=load('matlab.mat');%D导入距离矩阵
% dist=struct2cell(dist);
% dist=cell2mat(dist);
%% 遗传算法参数设置
alpha=100000; %违反的容量约束的惩罚函数系数
belta=0.4;%违反时间窗约束的惩罚函数系数
belta2=1;
chesu=100;%车速
NIND=1000; %种群大小
MAXGEN=50; %迭代次数
Pc=0.9; %交叉概率
Pm=0.05; %变异概率
GGAP=0.9; %代沟(Generation gap)
N=cusnum;
%% 初始化种群
Chrom=init(cusnum,NIND); %构造初始解
%% 输出随机解的路线和总距离
disp('初始种群中的一个随机值:')
[VC,TD,violate_cus]=decode(Chrom(1,:),cusnum,a,b,L,dist,chesu,bl);
% disp(['总距离:',num2str(TD)]);
disp(['车辆行驶总距离:',num2str(TD)]);
disp('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
%% 优化
gen=1;
figure;
hold on;box on
xlim([0,MAXGEN])
title('优化过程')
xlabel('代数')
ylabel('最优值')
[ObjV,bsv,gs,w1,w2]=calObj(Chrom,cusnum,a,b,L,dist,alpha,belta,belta2,chesu,bl); %计算种群目标函数值
preObjV=min(ObjV);
%%
while gen<=MAXGEN
%% 计算适应度
[ObjV,bsv,gs,w1,w2]=calObj(Chrom,cusnum,a,b,L,dist,alpha,belta,belta2,chesu,bl); %计算种群目标函数值
line([gen-1,gen],[preObjV,min(ObjV)]);pause(0.0001)%画图 最优函数
preObjV=min(ObjV);
FitnV=Fitness(ObjV);
%% 选择
SelCh=Select(Chrom,FitnV,GGAP);
%% OX交叉操作
SelCh=Recombin(SelCh,Pc);
%% 变异
SelCh=Mutate(SelCh,Pm);
%% 重插入子代的新种群
Chrom=Reins(Chrom,SelCh,ObjV);
%% 打印当前最优解
[ObjV,bsv,gs,w1,w2]=calObj(Chrom,cusnum,a,b,L,dist,alpha,belta,belta2,chesu,bl); %计算种群目标函数值
[minObjV,minInd]=min(ObjV);
disp(['第',num2str(gen),'代最优解:'])
[bestVC,bestTD,best_viocus]=decode(Chrom(minInd(1),:),cusnum,a,b,L,dist,chesu,bl);
disp(['车辆行驶总距离:',num2str(bestTD)]);
fprintf('\n')
%% 更新迭代次数
gen=gen+1 ;
end
%% 画出最优解的路线图
[ObjV,bsv,gs,w1,w2]=calObj(Chrom,cusnum,a,b,L,dist,alpha,belta,belta2,chesu,bl); %计算种群目标函数值
[minObjV,minInd]=min(ObjV);
%% 输出最优解的路线和总距离
disp('最优解:')
bestChrom=Chrom(minInd(1),:);
[bestVC,bestTD,best_viocus]=decode(bestChrom,cusnum,a,b,L,dist,chesu,bl);
disp(['车辆行驶总距离:',num2str(bestTD)]);
disp('-------------------------------------------------------------')
% %% 画出最终路线图
% ee=[];
% ccc=0;
% for i=1:cusnum
% if i==1
% ccc=(ccc+dist(1,bestVC(1)+1)/chesu);
% ee(i,1)=ccc;
%
% else
% ccc=ccc+dist((bestVC(i-1)+1),bestVC(i)+1)/chesu;
% ee(i,1)=ccc;
% end
% end
% eee=cumsum(ee);
draw_Best(bestVC,zuobiao,b,bsv);
gs
w1
w2
如需帮忙