matlab遗传算法求解选址结合路径优化问题
问题描述:
客户到自提点取货,配送中心配送货物到取货点。客户到自提点取货为选址,配送中心到取货点为路径优化。
目标–1、客户满意度总体最高
2、总成本最小
3、实例

clc;clear;%%如需帮助 zhangshu2274
tic;
%% 初始化
PopSize=200;%种群大小
MaxIteration =500;%最大迭代次数
R=50;
load('shuju2');
load('location1')
load('jsfy');
shuju=c101;
cap=900; %车辆最大装载量
%% 提取数据信息
syzb=shuju(:,2:3);
zb=shuju(1:9,2:3);
sanjizb=shuju(10:end,2:3); %所有点的坐标x和y
erjizb=zb(2:end,:); %顾客坐标
cusnum=size(erjizb,1); %顾客数
v_num=2; %f分界点
ejdemands=shuju(2:9,4);
sjdemands=shuju(10:end,4);
%% 遗传算法参数设置
alpha=10000; %违反的容量约束的惩罚函数系数
N=cusnum+v_num; %染色体长度=顾客数目+车辆最多使用数目-1
V=N;
M=2;
pc=0.8;pm=0.9;
%% 初始化种群
chromosome(:,1:N)=InitPop(PopSize,N);
[VC,NV]=decode(chromosome(1,:),cusnum);
%%
chromosome(:,V+1:V+2)=calObj(chromosome,cusnum,cap,ejdemands,sjdemands,location1,alpha,jsfy); %计算种群目标函数值
%%
[chromosome,individual]= non_domination_sort_mod(chromosome,N);%将解分 最后一列为拥挤度 倒数第二列为分级数
index=find(chromosome(:,N+3)==1);
costrep=chromosome(index,N+1:N+2);%第一级即非劣解
%% 主循环
pool = round(PopSize/2); %突变池规模
for Iteration=1:MaxIterationif ~mod(Iteration,10)fprintf('current iter:%d\n',Iteration)disp([' Number of Repository Particles = ' num2str(size(costrep,1))]);endparent_chromosome = selection_individuals(chromosome,pool,2);parent_var=parent_chromosome(:,1:N);%分离出解向量%% 交叉offspring_var=[];offspring_cost=[];for ic=1:pool/2m1=randi(pool);%选出交叉向量m2=randi(pool);while m1==m2m1=randi(pool);endscro(1,:)=parent_var(m1,:);scro(2,:)=parent_var(m2,:);if rand<pcc1=randi(N);%选出交叉位置c2=randi(N);while c1==c2c1=randi(N);endchb1=min(c1,c2);chb2=max(c1,c2);middle=scro(1,chb1+1:chb2);scro(1,chb1+1:chb2)=scro(2,chb1+1:chb2);scro(2,chb1+1:chb2)=middle;for i=1:chb1while find(scro(1,chb1+1:chb2)==scro(1,i))zhi=find(scro(1,chb1+1:chb2)==scro(1,i));y=scro(2,chb1+zhi);scro(1,i)=y;endwhile find(scro(2,chb1+1:chb2)==scro(2,i))zhi=find(scro(2,chb1+1:chb2)==scro(2,i));y=scro(1,chb1+zhi);scro(2,i)=y;endendfor i=chb2+1:Nwhile find(scro(1,1:chb2)==scro(1,i))zhi=find(scro(1,1:chb2)==scro(1,i));y=scro(2,zhi);scro(1,i)=y;endwhile find(scro(2,1:chb2)==scro(2,i))zhi=find(scro(2,1:chb2)==scro(2,i));y=scro(1,zhi);scro(2,i)=y;endendendif rand<pm%逆序变异m1=randi(N);m2=randi(N);while m1==m2m1=randi(N);endloc1=min(m1,m2);loc2=max(m1,m2);scro(1,loc1:loc2)=fliplr(scro(1,loc1:loc2));% tt=scro(1,m2);% scro(1,m2)=scro(1,m1);% scro(1,m1)=tt;endif rand<pm%对换变异m1=randi(N);m2=randi(N);while m1==m2m1=randi(N);endtt=scro(2,m2);scro(2,m2)=scro(2,m1);scro(2,m1)=tt;end[VC,NV]=decode(scro(1,:),cusnum);if size(VC)==0scro(1,:)=parent_var(m1,:);end[VC,NV]=decode(scro(2,:),cusnum);if size(VC)==0scro(2,:)=parent_var(m2,:);endscro_cost(1,:)=calObj(scro(1,:),cusnum,cap,ejdemands,sjdemands,location1,alpha,jsfy);
% scro_cost(1,:)=costfunction(scro(1,:),location1,location2);
scro_cost(2,:)=calObj(scro(2,:),cusnum,cap,ejdemands,sjdemands,location1,alpha,jsfy);
% scro_cost(2,:)=costfunction(scro(2,:),location1,location2);offspring_var=[offspring_var;scro];%解offspring_cost=[offspring_cost;scro_cost];%适应度endoffspring_chromosome(:,1:V)=offspring_var;offspring_chromosome(:,V+1:V+M)=offspring_cost;main_pop = size(chromosome,1);offspring_pop = size(offspring_chromosome,1);intermediate_chromosome(1:main_pop,:) = chromosome;intermediate_chromosome(main_pop + 1 :main_pop + offspring_pop,1 : M+V) = ...offspring_chromosome;intermediate_chromosome = ...non_domination_sort_mod(intermediate_chromosome,N);%% 选择chromosome = replace_chromosome(intermediate_chromosome,PopSize,N);index=find(intermediate_chromosome(:,N+3)==1);costrep=intermediate_chromosome(index,N+1:N+2);cost=intermediate_chromosome(:,N+1:N+2);if ~mod(Iteration,1)figure (1)plot(costrep(:,1),costrep(:,2),'r*',cost(:,1),cost(:,2),'kx');xlabel('成本');ylabel('满意度');title(strcat('Interaction ',num2str(Iteration), ' Pareto non-dominated solutions'));endif ~mod(Iteration,MaxIteration)fun_pf=costrep;[fun_pf,~]=sortrows(fun_pf,1);plot(fun_pf(:,1),fun_pf(:,2),'k*-');title(strcat('Interaction ',num2str(Iteration), ' Pareto non-dominated solutions'));hold on;grid on;end
end%% 假设选择第一个解作为最优解
[VC,NV]=decode(chromosome(1,1:N),cusnum)[cost1,cost2,zzl]=costFuction(VC,NV,jsfy,ejdemands,sjdemands,location1,cap,alpha);[myd,d,b]=manyidu(location1,VC)%%
figure
hold on;box on
title('最优配送方案路线图')
hold on;for i=2:size(syzb,1)text(syzb(i,1),syzb(i,2),num2str(i-1),'color',[1,0,0]);
endplot(zb(:,1),zb(:,2),'ro','linewidth',1);hold on;plot(zb(1,1),zb(1,2),'s','linewidth',2,'MarkerEdgeColor','b','MarkerFaceColor','b','MarkerSize',10);hold onplot(sanjizb(:,1),sanjizb(:,2),'ko','linewidth',1);hold on;D=size(d,2);
% C=linspecer(D);DD=size(VC,1)+D;C=linspecer(DD);CC=size(VC,1);%%for i=1:CCpart_seq=VC{i}; len=length(part_seq); for j=0:len%当j=0时,车辆从配送中心出发到达该路径上的第一个门店if j==0fprintf('%s','配送路线',num2str(i),':');fprintf('%d->',0);c1=zb(part_seq(1)+1,:);plot([zb(1,1),c1(1)],[zb(1,2),c1(2)],'-','color',C(i,:),'linewidth',1);%当j=len时,车辆从该路径上的最后一个门店出发到达配送中心elseif j==lenfprintf('%d->',part_seq(j));fprintf('%d',0);fprintf('\n');c_len=zb(part_seq(len)+1,:);plot([c_len(1),zb(1,1)],[c_len(2),zb(1,2)],'-','color',C(i,:),'linewidth',1);%否则,车辆从路径上的前一个门店到达该路径上紧邻的下一个门店elsefprintf('%d->',part_seq(j));c_pre=zb(part_seq(j)+1,:);c_lastone=zb(part_seq(j+1)+1,:);plot([c_pre(1),c_lastone(1)],[c_pre(2),c_lastone(2)],'-','color',C(i,:),'linewidth',1);endendend
%%% j=0;
% for i=1:Dfor j=1:40
% part_seq=VC{i};
% len=length(part_seq);
% j=j+1;% for j=1:lenc_pre=zb(d(b(j))+1,:);c_lastone=sanjizb(j,:);plot([c_pre(1),c_lastone(1)],[c_pre(2),c_lastone(2)],'-','color',C(b(j)+size(VC,1),:),'linewidth',1);% endend
运行结果‘
多目标帕累托解

红色的点为备选取货点
选择的备选网点及配送路径图

客户选择的自提点

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
