matlab遗传算法求解选址结合路径优化问题
Posted 张叔zhangshu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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:MaxIteration
if ~mod(Iteration,10)
fprintf('current iter:%d\\n',Iteration)
disp([' Number of Repository Particles = ' num2str(size(costrep,1))]);
end
parent_chromosome = selection_individuals(chromosome,pool,2);
parent_var=parent_chromosome(:,1:N);%分离出解向量
%% 交叉
offspring_var=[];offspring_cost=[];
for ic=1:pool/2
m1=randi(pool);%选出交叉向量
m2=randi(pool);
while m1==m2
m1=randi(pool);
end
scro(1,:)=parent_var(m1,:);
scro(2,:)=parent_var(m2,:);
if rand<pc
c1=randi(N);%选出交叉位置
c2=randi(N);
while c1==c2
c1=randi(N);
end
chb1=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:chb1
while 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;
end
while 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;
end
end
for i=chb2+1:N
while 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;
end
while 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;
end
end
end
if rand<pm%逆序变异
m1=randi(N);
m2=randi(N);
while m1==m2
m1=randi(N);
end
loc1=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;
end
if rand<pm%对换变异
m1=randi(N);
m2=randi(N);
while m1==m2
m1=randi(N);
end
tt=scro(2,m2);
scro(2,m2)=scro(2,m1);
scro(2,m1)=tt;
end
[VC,NV]=decode(scro(1,:),cusnum);
if size(VC)==0
scro(1,:)=parent_var(m1,:);
end
[VC,NV]=decode(scro(2,:),cusnum);
if size(VC)==0
scro(2,:)=parent_var(m2,:);
end
scro_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];%适应度
end
offspring_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'));
end
if ~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]);
end
plot(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 on
plot(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:CC
part_seq=VCi;
len=length(part_seq);
for j=0:len
%当j=0时,车辆从配送中心出发到达该路径上的第一个门店
if j==0
fprintf('%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==len
fprintf('%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);
%否则,车辆从路径上的前一个门店到达该路径上紧邻的下一个门店
else
fprintf('%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);
end
end
end
%%
% j=0;
% for i=1:D
for j=1:40
% part_seq=VCi;
% len=length(part_seq);
% j=j+1;
% for j=1:len
c_pre=zb(d(b(j))+1,:);
c_lastone=sanjizb以上是关于matlab遗传算法求解选址结合路径优化问题的主要内容,如果未能解决你的问题,请参考以下文章
优化选址基于matlab遗传算法求解多城市多应急物流中心选址优化问题含Matlab源码 H001期