matlab遗传算法求解带有客户满意度的路径优化问题
Posted 张叔zhangshu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab遗传算法求解带有客户满意度的路径优化问题相关的知识,希望对你有一定的参考价值。
问题模型
参数定义
主程序
clear
clc
close all
tic
%% 用importdata这个函数来读取文件
% shuju=importdata('cc101.txt');
load('c101');
shuju=c101;
% bl=importdata('103.txt');
bl=0;
cap=1500; %车辆最大装载量
%% 提取数据信息
E=shuju(1,5); %配送中心时间窗开始时间
L=shuju(1,6); %配送中心时间窗结束时间
zuobiao=shuju(:,2:3); %所有点的坐标x和y
% vertexs= vertexs./1000;
customer=zuobiao(2:end,:); %顾客坐标
cusnum=size(customer,1); %顾客数
v_num=6; %车辆最多使用数目
demands=shuju(2:end,4); %需求量
a=shuju(2:end,5); %顾客时间窗开始时间[a[i],b[i]]
b=shuju(2:end,6); %顾客时间窗结束时间[a[i],b[i]]
s=shuju(2:end,7); %客户点的服务时间
h=pdist(zuobiao);
dist=squareform(h);
dist=dist./1000;%距离矩阵,满足三角关系,暂用距离表示花费c[i][j]=dist[i][j]
%% 遗传算法参数设置
alpha=100000; %违反的容量约束的惩罚函数系数
belta=900;%违反时间窗约束的惩罚函数系数
belta2=60;
chesu=30;
NIND=100; %种群大小
MAXGEN=500; %迭代次数
Pc=0.9; %交叉概率
Pm=0.05; %变异概率
GGAP=0.9; %代沟(Generation gap)
N=cusnum+v_num-1; %染色体长度=顾客数目+车辆最多使用数目-1
% N=cusnum;
%% 初始化种群
init_vc=init(cusnum,a,demands,cap); %构造初始解
Chrom=InitPopCW(NIND,N,cusnum,init_vc);
%% 输出随机解的路线和总距离
disp('初始种群中的一个随机值:')
[VC,NV,TD,violate_num,violate_cus]=decode(Chrom(1,:),cusnum,cap,demands,a,b,L,s,dist,chesu,bl);
[~,~,bsv]=violateTW(VC,a,b,s,L,dist,chesu,bl);
% disp(['总距离:',num2str(TD)]);
disp(['车辆使用数目:',num2str(NV),',车辆行驶总距离:',num2str(TD)]);
disp('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
%% 优化
gen=1;
figure;
hold on;box on
xlim([0,MAXGEN])
title('优化过程')
xlabel('代数')
ylabel('最优值')
ObjV=calObj(Chrom,cusnum,cap,demands,a,b,L,s,dist,alpha,belta,belta2,chesu,bl); %计算种群目标函数值
preObjV=min(ObjV);
while gen<=MAXGEN
%% 计算适应度
ObjV=calObj(Chrom,cusnum,cap,demands,a,b,L,s,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=calObj(Chrom,cusnum,cap,demands,a,b,L,s,dist,alpha,belta,belta2,chesu,bl); %计算种群目标函数值
[minObjV,minInd]=min(ObjV);
disp(['第',num2str(gen),'代最优解:'])
[bestVC,bestNV,bestTD,best_vionum,best_viocus]=decode(Chrom(minInd(1),:),cusnum,cap,demands,a,b,L,s,dist,chesu,bl);
disp(['车辆使用数目:',num2str(bestNV),',车辆行驶总距离:',num2str(bestTD)]);
fprintf('\\n')
%% 更新迭代次数
gen=gen+1 ;
end
%% 画出最优解的路线图
ObjV=calObj(Chrom,cusnum,cap,demands,a,b,L,s,dist,alpha,belta,belta2,chesu,bl); %计算种群目标函数值
[minObjV,minInd]=min(ObjV);
%% 输出最优解的路线和总距离
disp('最优解:')
bestChrom=Chrom(minInd(1),:);
[bestVC,bestNV,bestTD,best_vionum,best_viocus]=decode(bestChrom,cusnum,cap,demands,a,b,L,s,dist,chesu,bl);
disp(['车辆使用数目:',num2str(bestNV),',车辆行驶总距离:',num2str(bestTD)]);
disp('-------------------------------------------------------------')
[cost,q1,q2,q3,q4,q5,q6]=costFuction(bestVC,a,b,s,L,dist,demands,cap,alpha,belta,belta2,chesu,bl);
%% 画出最终路线图
draw_Best(bestVC,zuobiao);
数据
优化结果
最优解:
车辆使用数目:5,车辆行驶总距离:25.1914
配送路线1:0->28->1->2->5->22->23->7->0
配送路线2:0->24->26->3->27->25->6->0
配送路线3:0->21->19->20->4->0
配送路线4:0->16->17->14->12->8->9->0
配送路线5:0->13->15->10->11->18->0
如需代码或代写VX:zzs1056600403
以上是关于matlab遗传算法求解带有客户满意度的路径优化问题的主要内容,如果未能解决你的问题,请参考以下文章