1 简介

NSGA(非支配排序遗传算法)、NSGAII(带精英策略的非支配排序的遗传算法),都是基于遗传算法的多目标优化算法,都是基于pareto最优解讨论的多目标优化.

【优化求解】基于NSGAII算法求解含约束多目标优化问题matlab代码_约束条件

【优化求解】基于NSGAII算法求解含约束多目标优化问题matlab代码_约束条件_02

【优化求解】基于NSGAII算法求解含约束多目标优化问题matlab代码_迭代_03

【优化求解】基于NSGAII算法求解含约束多目标优化问题matlab代码_多目标_04

【优化求解】基于NSGAII算法求解含约束多目标优化问题matlab代码_约束条件_05

【优化求解】基于NSGAII算法求解含约束多目标优化问题matlab代码_迭代_06

【优化求解】基于NSGAII算法求解含约束多目标优化问题matlab代码_spring_07

2 部分代码

clear all
  • 1.
clc
  • 1.
global V M xl xu etac etam p pop_size pm
  • 1.
%% 程序开始运行
  • 1.
M=2;
  • 1.
p=1;%input('输入测试问题编号:');
  • 1.
tic
  • 1.
pop_size=300; % 种群数量,这个变量可以自己选择大小,50、100、200、300、500等
  • 1.
no_runs=1; % 运行次数
  • 1.
gen_max=150; % 最大迭代次数,可修改100
  • 1.
fname='test_case'; % 目标函数和约束条件
  • 1.
if p==13 % OSY
  • 1.
pop_size=100;
  • 1.
no_runs=10;
  • 1.
end
  • 1.
if (p==2 | p==5 | p==7), gen_max=1000; end;
  • 1.
if p<=9 % p<=9是非约束测试函数Unconstrained test functions
  • 1.
tV=[2;30;3;1;30;4;30;10;10];
  • 1.
V=tV(p);
  • 1.
txl=[-5*ones(1,V);zeros(1,V);-5*ones(1,V);-1000*ones(1,V);zeros(1,V);-1/sqrt(V)*ones(1,V);zeros(1,V); 0 -5*ones(1,V-1);zeros(1,V)];
  • 1.
txu=[10*ones(1,V); ones(1,V);5*ones(1,V);1000*ones(1,V);ones(1,V);1/sqrt(V) *ones(1,V);ones(1,V);1 5*ones(1,V-1);ones(1,V)];
  • 1.
xl=(txl(p,1:V)); % 自变量下限
  • 1.
xu=(txu(p,1:V)); % 自变量上限
  • 1.
etac = 20; % 交叉
  • 1.
etam = 20; % 变异
  • 1.
elseif p==15 %应急物资问题
  • 1.
V=120;%上个版本x_j(4) x_ij(36) y_ij(36),因此V=76;这个版本q_j(6) x_j(6) x_ij(9*6) y_ij(9*6),因此V=120
  • 1.
v_I=9;v_J=6;
  • 1.
v_x_ij=v_I*v_J;%v_x_ij决策变量
  • 1.
v_y_ij=v_I*v_J;%v_y_ij决策变量
  • 1.
v_x_j=v_J;
  • 1.
txl_q_j=zeros(1,v_x_j);%q_j下限,表示储备库j的库存储备量,最高300吨,最低0吨
  • 1.
txl_x_j=zeros(1,v_x_j);%x_j下限,为0,1变量;当为1时,表示j备选点设置储备库;否则,为不设置
  • 1.
txl_x_ij=zeros(1,54);%x_ij下限,表示从应急物资储备库j运输到应急需求点i的物资量
  • 1.
txl_y_ij=zeros(1,54);%y_ij下限,应急资源点j是否救援需求点i
  • 1.
txu_q_j=ones(1,6)*300;%q_j上限
  • 1.
txu_x_j=ones(1,6);%x_j上限
  • 1.
txu_x_ij=ones(1,54)*80;%x_ij上限,注意此处x_ij上限可修改
  • 1.
txu_y_ij=ones(1,54);%y_ij上限
  • 1.
txl=[txl_q_j txl_x_j txl_x_ij txl_y_ij];%q_j(6) x_j(6) x_ij(9*6) y_ij(9*6)
  • 1.
txu=[txu_q_j txu_x_j txu_x_ij txu_y_ij];%q_j(6) x_j(6) x_ij(9*6) y_ij(9*6)
  • 1.
xl=(txl(1,1:V)); % 自变量下限
  • 1.
xu=(txu(1,1:V)); % 自变量上限
  • 1.
etac = 20;
  • 1.
etam = 100; %100
  • 1.
else % p>9为约束测试函数
  • 1.
p1=p-9;
  • 1.
tV=[2;2;2;6;2];
  • 1.
V=tV(p1);
  • 1.
txl=[0 0 0 0 0 0;-20 -20 0 0 0 0;0 0 0 0 0 0;0 0 1 0 1 0;0.1 0 0 0 0 0]; %自变量下限
  • 1.
txu=[5 3 0 0 0 0;20 20 0 0 0 0;pi pi 0 0 0 0;10 10 5 6 5 10;1 5 0 0 0 0];%自变量上限
  • 1.
xl=(txl(p1,1:V)); % 自变量下限
  • 1.
xu=(txu(p1,1:V)); % 自变量下限 i=1:NN
  • 1.
etac = 20;
  • 1.
etam = 100;
  • 1.
end
  • 1.
pm=1/V; % 变异率
  • 1.
Q=[];
  • 1.
for run = 1:no_runs
  • 1.
%% 初始种群
  • 1.
xl_temp=repmat(xl, pop_size,1);
  • 1.
xu_temp=repmat(xu, pop_size,1);
  • 1.
x = xl_temp+((xu_temp-xl_temp).*rand(pop_size,V));
  • 1.
%进行离散化处理与关联处理
  • 1.
if(p==15)
  • 1.
x(:,7:12)=round(x(:,7:12));
  • 1.
x(:,67:120)=round(x(:,67:120));
  • 1.
x(:,13:66)=x(:,13:66).*x(:,67:120);
  • 1.
% % 如果应急储备库设置点x_j=0,则x_ij,应急物资储备库j运输到应急需求点i的物资量为0
  • 1.
% for i = 1:6
  • 1.
% if(x(6+i)==0)
  • 1.
% x(13+()*9)=0;
  • 1.
% end
  • 1.
% end
  • 1.
end
  • 1.
%% 计算目标函数
  • 1.
for i =1:pop_size
  • 1.
[ff(i,:) err(i,:)] =feval(fname, x(i,:)); % 计算目标函数
  • 1.
end
  • 1.
error_norm=normalisation(err); % 约束条件规一化
  • 1.
population_init=[x ff error_norm];
  • 1.
[population front]=NDS_CD_cons(population_init); % 初始种群非支配排序
  • 1.
%% 开始迭代
  • 1.
for gen_count=1:gen_max
  • 1.
% 选择父种群
  • 1.
parent_selected=tour_selection(population); % 10 锦标赛选择法
  • 1.
%% 产生子代
  • 1.
child_offspring = genetic_operator(parent_selected(:,1:V)); % SBX crossover and polynomial mutation
  • 1.
for ii = 1:pop_size
  • 1.
[fff(ii,:) err(ii,:)]=feval(fname, child_offspring(ii,:)); % 子代种群目标函数计算
  • 1.
end
  • 1.
error_norm=normalisation(err);
  • 1.
child_offspring=[child_offspring fff error_norm];
  • 1.
%% 中间种群 (Rt= Pt U Qt of 2N size)
  • 1.
population_inter=[population(:,1:V+M+1) ; child_offspring(:,1:V+M+1)];
  • 1.
[population_inter_sorted front]=NDS_CD_cons(population_inter); % 非支配排序
  • 1.
%% 替代操作 - N
  • 1.
new_pop=replacement(population_inter_sorted, front);
  • 1.
population=new_pop;
  • 1.
end
  • 1.
new_pop=sortrows(new_pop,V+1);
  • 1.
paretoset(run).trial=new_pop(:,1:V+M+1);
  • 1.
Q = [Q; paretoset(run).trial];
  • 1.
end
  • 1.
toc
  • 1.
%% 保存结果到excel表格中
  • 1.
xlswrite('new_pop.xls', new_pop);
  • 1.
xlswrite('f.xls', [new_pop(:,V+1) new_pop(:,V+2)]);
  • 1.
%% 结果和绘制pareto前沿
  • 1.
if run==1
  • 1.
plot(new_pop(:,V+1),new_pop(:,V+2),'*')
  • 1.
else
  • 1.
[pareto_filter front]=NDS_CD_cons(Q);
  • 1.
rank1_index=find(pareto_filter(:,V+M+2)==1); % pareto前沿序列1
  • 1.
pareto_rank1=pareto_filter(rank1_index,1:V+M);
  • 1.
plot(pareto_rank1(:,V+1),pareto_rank1(:,V+2),'*') % 绘制最终pareto结果
  • 1.
end
  • 1.
xlabel('objective function 1')
  • 1.
ylabel('objective function 2')
  • 1.
if p==1
  • 1.
title(' 1 - Test case 1')
  • 1.
elseif p==2
  • 1.
title(' 2 - ZDT1')
  • 1.
elseif p==3
  • 1.
title(' 3 - KUR')
  • 1.
elseif p==4
  • 1.
title(' 4 - SCH')
  • 1.
elseif p==5
  • 1.
title(' 5 - ZDT2')
  • 1.
elseif p==6
  • 1.
title(' 6 - Test case 3')
  • 1.
elseif p==7
  • 1.
title(' 7 - ZDT3')
  • 1.
elseif p==8
  • 1.
title(' 8 - ZDT4')
  • 1.
elseif p==9
  • 1.
title(' 9 - ZDT6')
  • 1.
elseif p==10
  • 1.
title(' 10 - BNH')
  • 1.
elseif p==11
  • 1.
title(' 11 - SRN')
  • 1.
elseif p==12
  • 1.
title(' 12 - TNK')
  • 1.
elseif p==13
  • 1.
title(' 13 - OSY')
  • 1.
elseif p==14
  • 1.
title(' 14 - CONSTR')
  • 1.
elseif p==15
  • 1.
title(' 15 - EMERGE')
  • 1.
end
  • 1.

3 仿真结果

【优化求解】基于NSGAII算法求解含约束多目标优化问题matlab代码_迭代_08

4 参考文献

[1]徐慧英等. "改进NSGA Ⅱ算法在车辆路径多目标优化问题中的应用." 计算机工程与科学 32.10(2010):117-121.

【优化求解】基于NSGAII算法求解含约束多目标优化问题matlab代码_多目标_09