% NSGA_II_MPGA多种群遗传算法求解多目标问题
% *其中evaluate_objective为目标函数,根据题意需修改
% 最优种群存在indiv数组中。其自变量对应的二进制代码存在Chrom中
% 由于没有新兴种群的引入,所以较为依赖于初始种群的数值
% 但交叉和变异又有利于全局最优变量的发现
% 但未成熟收敛仍然是遗传算法的一个问题
% 因此运用多种群遗传算法进行求解
% 当前代码适用于两个目标函数,三个目标函数有待确定
%% 初始化变量
clc,clear
NIND = 40; % 个体数目,种群数目
MAXGEN = 200; % 最大遗传代数
PRECI = 20; % 变量的二进制位数,列数
lbx = 0;
ubx = 1; % 函数自变量x范围[0, 1]
M = 2; % 目标函数个数
V = 30; % 自变量变量个数
MP = 10; % 多种群数目
px=0.7+(0.9-0.7)*rand(MP,1); % 在[0.7,0.9]范围内随机产生交叉概率
pm=0.001+(0.05-0.001)*rand(MP,1); % 在[0.001,0.05]范围内随机产生变异概率
%% 初步计算
% 区域描述器
% PRECI个指标,上下限为lbx,ubx,二进制码+算数刻度+包含边界
FieldD = repmat([PRECI;lbx;ubx;1;0;1;1],1,30);
for i=1:MP
% 创建初始种群
Chrom{i} = crtbp(NIND, V*PRECI);
% 将二进制转换为十进制,并计算目标函数结果
[indiv{i}, ~] = initialize_Chrom(Chrom{i}, FieldD, M, V);
% 对前一行结果进行分层+拥挤度计算
indiv_change{i} = non_domination_sort_mod(indiv{i},M,V);
% 将indiv和Chrom对应于改变后的位置关系
[indiv{i}, Chrom{i}, ~] = change_position...
(indiv{i}, indiv_change{i}, Chrom{i}, V);
end
clear indiv_change
%% 多种群遗传操作
MinObjV=ones(MP,2).*inf; % 记录精华种群
MinChrom=zeros(MP,PRECI*V); % 记录精华种群的编码
gen = 0; % 内循环
gen0 = 0; % 外循环
Glo_minY = ones(1,M).*inf; % 保存全局最优解
while gen0 < MAXGEN
gen = gen + 1;
pool = round(NIND/2);
% 竞标参赛选手个数
tour = 2;
% 竞标选出优胜种群
for i = 1:MP
parent{i} = tournament_selection(indiv{i},pool,tour);
% 返回对应优胜种群的二进制代码
[~,Chrom{i},~] = change_position...
(indiv{i}, parent{i}, Chrom{i}, V);
% 对二进制代码进行交叉和变异
Chrom_1{i} = recombin('xovsp',Chrom{i},px(i));
Chrom_1{i} = mut(Chrom_1{i},pm(i));
% 将交叉变异后的和初始数据进行组合
Chrom{i} = [Chrom{i};Chrom_1{i}];
% 将二进制转换为十进制
[indiv{i}, ~] = initialize_Chrom(Chrom{i}, FieldD, M, V);
% 对前一行结果进行分层+拥挤度计算
indiv_change{i} = non_domination_sort_mod(indiv{i}, M, V);
% 将indiv和Chrom对应于改变后的位置关系
[indiv{i}, Chrom{i}, ~] = change_position...
(indiv{i}, indiv_change{i}, Chrom{i}, V);
end
% 人工选择精华种群,选择目标函数的最小值
[MinObjV,MinChrom]=EliteInduvidual(Chrom,indiv,MinObjV,MinChrom,M,V);
% 移民操作
[Chrom,indiv]=immigrant(Chrom,indiv,M,V);
% 再次进行拥挤度计算
for i = 1:MP
[indiv{i}, ~] = initialize_Chrom(Chrom{i}, FieldD, M, V);
% 对前一行结果进行分层+拥挤度计算
indiv_change{i} = non_domination_sort_mod(indiv{i},M,V);
% 将indiv和Chrom对应于改变后的位置关系
[indiv{i}, Chrom{i}, ~] = change_position...
(indiv{i}, indiv_change{i}, Chrom{i}, V);
end
clear indiv_change
% 找出精华种群中最优的个体
FMinObjV = mapminmax(MinObjV',0,1)';
FMinObjV = sum(FMinObjV,2);
% 最优个体下标
[~,minI] = min(FMinObjV);
% 最优个体对应Y值
minY = MinObjV(minI,:);
% 验证此次循环的最优个体是否为全局最优个体
sympol = 0;
for j = 1:M
if minY(1,j) < Glo_minY(1,j)
sympol = 1;
else
sympol = 0;
end
end
% 如果是的化则保存此次循环最优个体,否则保留上次
if sympol
Glo_minY = minY;
MinObjV(gen,:) = MinObjV(minI,:);
MinChrom(gen,:) = MinChrom(minI,:);
gen0 = 0;
else
MinObjV(gen,:) = MinObjV(gen-1,:);
MinChrom(gen,:) = MinChrom(gen-1,:);
gen0 = gen0 + 1;
end
if ~mod(gen0,10)
fprintf('gen0 = %d, gen = %d\n',gen0,gen);
end
end
%% 结果整合
Fin_indiv = [];
Fin_Chrom = [];
% 将每个种群层次为1的整合起来
for i = 1:MP
temp_indiv = indiv{i};
index = find(temp_indiv(:,M+V+1) == 1);
temp_indiv = temp_indiv(index,1:end-2);
temp_Chrom = Chrom{i}(index,:);
Fin_indiv = [Fin_indiv;temp_indiv];
Fin_Chrom = [Fin_Chrom;temp_Chrom];
end
x = Fin_indiv(:,V+1);
y = Fin_indiv(:,V+M);
XY = initialize_Chrom(MinChrom, FieldD, M, V);
Fin_indiv = [Fin_indiv;XY];
Fin_Chrom = [Fin_Chrom;MinChrom];
%% 结果展示
plot(x,y,'ok','LineWidth', 1.5);
title('多种群遗传算法优化结果图','fontsize',14)
legend('最优解')
xlabel('目标函数1'), ylabel('目标函数2')
set(gca,'linewidth',1.5)
hold on
% 调整最高次幂,拟合曲线
p = polyfit(x,y,3);
x1 = linspace(0,max(x));
y1 = polyval(p,x1);
plot(x1,y1,'k-','LineWidth', 2);
set(gca,'linewidth',1.5)
hold off
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
基于遗传算法的非支配排序算法(NSGA_II)是用于求解多目标规划问题的一种方法。 通过帕累托支配求解帕累托最优解可以有效得到多目标函数的求解结果。 为优化帕累托最优解,运用遗传算法对求解结果进行优化。 但同时遗传算法具有未成熟收敛、群体规模对性能影响大、结果受初始值影响较大等缺点,因此利用多种群遗传算法对求解结果进行进一步优化,运用移民算子联系各个种群,运用精华种群保存每代最优结果。 **运行程序请优先下载谢菲尔德大学的MATLAB遗传算法工具箱
资源推荐
资源详情
资源评论
收起资源包目录
with_XieFeEr_MPGA.zip (8个子文件)
evaluate_objective.m 273B
initialize_Chrom.m 366B
non_domination_sort_mod.m 4KB
EliteInduvidual.m 529B
tournament_selection.m 1KB
NSGA_II_MPGA.m 5KB
change_position.m 861B
immigrant.m 431B
共 8 条
- 1
Authony.
- 粉丝: 34
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页