????????以下內(nèi)容大部分來(lái)源于《MATLAB智能算法30個(gè)案例分析》,僅為學(xué)習(xí)交流所用。
1 理論基礎(chǔ)
1.1 遺傳算法早熟問題
1.2 多種群遺傳算法概述

2 案例背景
2.1 問題描述

?????????matlab代碼及該函數(shù)的圖形如下。
x = linspace(0, 12.1, 200);
y = linspace(4.1, 5.8, 200);
[x, y] = meshgrid(x,y);
f = 21.5+x.*sin(4*pi*x)+y.*sin(20*pi*y);
figure;
surf(x,y,f);
colormap(gca, 'jet')
xlabel('x');
ylabel('y');
zlabel('f(x,y)');
title('函數(shù)圖像')
????????從圖7-2中可以看出,該非線性函數(shù)在給定范圍內(nèi)分布著許多局部極值,通常的尋優(yōu)算法極易陷入局部極值或在各局部極值間振蕩,比較適用于驗(yàn)證多種群遺傳算法的性能。
2.2 解題思路及步驟

3 MATLAB程序?qū)崿F(xiàn)
3.1 移民算子

????????具體函數(shù)代碼如下: ?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-467331.html
function [Chrom,ObjV]=immigrant(Chrom,ObjV)
%% 移民算子
MP=length(Chrom);
for i=1:MP
[MaxO,maxI]=max(ObjV{i}); % 找出第i種群中最優(yōu)的個(gè)體
next_i=i+1; % 目標(biāo)種群(移民操作中)
if next_i>MP;next_i=mod(next_i,MP);end
[MinO,minI]=min(ObjV{next_i}); % 找出目標(biāo)種群中最劣的個(gè)體
%% 目標(biāo)種群最劣個(gè)體替換為源種群最優(yōu)個(gè)體
Chrom{next_i}(minI,:)=Chrom{i}(maxI,:);
ObjV{next_i}(minI)=ObjV{i}(maxI);
end
3.2 人工選擇算子

????????具體函數(shù)代碼如下: ?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-467331.html
function [MaxObjV,MaxChrom]=EliteInduvidual(Chrom,ObjV,MaxObjV,MaxChrom)
%% 人工選擇算子
MP=length(Chrom); %種群數(shù)
for i=1:MP
[MaxO,maxI]=max(ObjV{i}); %找出第i種群中最優(yōu)個(gè)體
if MaxO>MaxObjV(i)
MaxObjV(i)=MaxO; %記錄各種群的精華個(gè)體
MaxChrom(i,:)=Chrom{i}(maxI,:); %記錄各種群精華個(gè)體的編碼
end
end
3.3 目標(biāo)函數(shù)
function obj=ObjectFunction(X)
%% 待優(yōu)化的目標(biāo)函數(shù)
col=size(X,1);
for i=1:col
obj(i,1)=21.5+X(i,1)*sin(4*pi*X(i,1))+X(i,2)*sin(20*pi*X(i,2));
% obj(i,1)=exp(((X(i,1)-0.1)/0.8)^2)*(sin(5*pi*X(i,1)))^6;
end
3.4 標(biāo)準(zhǔn)遺傳算法主函數(shù)
%% 標(biāo)準(zhǔn)遺傳算法SGA
clear;
%clc
pc=0.7; % 交叉概率
pm=0.05; % 變異概率
%定義遺傳算法參數(shù)
NIND=40; %個(gè)體數(shù)目
MAXGEN=500; %最大遺傳代數(shù)
NVAR=2; %變量的維數(shù)
PRECI=20; %變量的二進(jìn)制位數(shù)
GGAP=0.9; %代溝
trace=zeros(MAXGEN,1); %記錄優(yōu)化軌跡
FieldD=[rep(PRECI,[1,NVAR]);[-3,4.1;12.1,5.8];rep([1;0;1;1],[1,NVAR])]; %建立區(qū)域描述器
Chrom=crtbp(NIND, NVAR*PRECI); %創(chuàng)建初始種群
gen=0; %代計(jì)數(shù)器
ObjV=ObjectFunction(bs2rv(Chrom, FieldD));%計(jì)算初始種群個(gè)體的目標(biāo)函數(shù)值
[maxY,I]=max(ObjV); %最優(yōu)值
X=bs2rv(Chrom, FieldD);
maxX=X(I,:);
while gen<MAXGEN %迭代
FitnV=ranking(-ObjV); %分配適應(yīng)度值(Assign fitness values)
SelCh=select('sus', Chrom, FitnV, GGAP); %選擇
SelCh=recombin('xovsp', SelCh, pc); %重組
SelCh=mut(SelCh,pm); %變異
ObjVSel=ObjectFunction(bs2rv(SelCh, FieldD)); %計(jì)算子代目標(biāo)函數(shù)值
[Chrom ObjV]=reins(Chrom, SelCh, 1, 1, ObjV, ObjVSel); %重插入
gen=gen+1; %代計(jì)數(shù)器增加
if maxY<max(ObjV)
[maxY,I]=max(ObjV);
X=bs2rv(Chrom, FieldD);
maxX=X(I,:);
end
trace(gen,1)=maxY;
end
%% 進(jìn)化過程圖
plot(1:gen,trace(:,1));
hold on
xlabel('進(jìn)化代數(shù)');
ylabel('最優(yōu)解變化');
title('SGA進(jìn)化過程');
%% 輸出最優(yōu)解
disp(['最優(yōu)值為:',num2str(maxY)]);
disp(['對(duì)應(yīng)的自變量取值:',num2str(maxX)]);
3.5 多種群遺傳算法主函數(shù)
%%
%% 2、多種群遺傳算法
clear;
clc
NIND=40; %個(gè)體數(shù)目
NVAR=2; %變量的維數(shù)
PRECI=20; %變量的二進(jìn)制位數(shù)
GGAP=0.9; %代溝
MP=10; %種群數(shù)目
FieldD=[rep(PRECI,[1,NVAR]);[-3,4.1;12.1,5.8];rep([1;0;1;1],[1,NVAR])]; %譯碼矩陣
for i=1:MP
Chrom{i}=crtbp(NIND, NVAR*PRECI); %創(chuàng)建初始種群
end
pc=0.7+(0.9-0.7)*rand(MP,1); %在【0.7,0.9】范圍i內(nèi)隨機(jī)產(chǎn)生交叉概率
pm=0.001+(0.05-0.001)*rand(MP,1); %在【0.001,0.05】范圍內(nèi)隨機(jī)產(chǎn)生變異概率
gen=0; %初始遺傳代數(shù)
gen0=0; %初始保持代數(shù)
MAXGEN=10; %最優(yōu)個(gè)體最少保持代數(shù)
maxY=0; %最優(yōu)值
for i=1:MP
ObjV{i}=ObjectFunction(bs2rv(Chrom{i}, FieldD));%計(jì)算各初始種群個(gè)體的目標(biāo)函數(shù)值
end
MaxObjV=zeros(MP,1); %記錄精華種群
MaxChrom=zeros(MP,PRECI*NVAR); %記錄精華種群的編碼
while gen0<=MAXGEN
gen=gen+1; %遺傳代數(shù)加1
for i=1:MP
FitnV{i}=ranking(-ObjV{i}); % 各種群的適應(yīng)度
SelCh{i}=select('sus', Chrom{i}, FitnV{i},GGAP); % 選擇操作
SelCh{i}=recombin('xovsp',SelCh{i}, pc(i)); % 交叉操作
SelCh{i}=mut(SelCh{i},pm(i)); % 變異操作
ObjVSel=ObjectFunction(bs2rv(SelCh{i}, FieldD)); % 計(jì)算子代目標(biāo)函數(shù)值
[Chrom{i},ObjV{i}]=reins(Chrom{i},SelCh{i},1,1,ObjV{i},ObjVSel); %重插入操作
end
[Chrom,ObjV]=immigrant(Chrom,ObjV); % 移民操作
[MaxObjV,MaxChrom]=EliteInduvidual(Chrom,ObjV,MaxObjV,MaxChrom); % 人工選擇精華種群
YY(gen)=max(MaxObjV); %找出精華種群中最優(yōu)的個(gè)體
if YY(gen)>maxY %判斷當(dāng)前優(yōu)化值是否與前一次優(yōu)化值相同
maxY=YY(gen); %更新最優(yōu)值
gen0=0;
else
gen0=gen0+1; %最優(yōu)值保持次數(shù)加1
end
end
%% 進(jìn)化過程圖
plot(1:gen,YY);
xlabel('進(jìn)化代數(shù)')
ylabel('最優(yōu)解變化')
title('MPGA進(jìn)化過程')
%% 輸出最優(yōu)解
[Y,I]=max(MaxObjV); %找出精華種群中最優(yōu)的個(gè)體
X=(bs2rv(MaxChrom(I,:), FieldD)); %最優(yōu)個(gè)體的解碼解
disp(['最優(yōu)值為:',num2str(Y)])
disp(['對(duì)應(yīng)的自變量取值:',num2str(X)])
4 結(jié)果分析




5 延伸閱讀

到了這里,關(guān)于(轉(zhuǎn)載)多種群遺傳算法的函數(shù)優(yōu)化算法(matlab實(shí)現(xiàn))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!