Matlab遺傳演算法求函式最大值

2021-07-23 16:39:29 字數 4330 閱讀 7870

主函式函式main.m

global

bitlength%定義3個全域性變數

global

boundsbegin

global

boundsend

boundsbegin=-2;

boundsend=2;

precision=0.0001;%運算精確度

bitlength=ceil(log2((boundsend-boundsbegin)'./precision));%染色體長度

popsize=50;%初始種群大小

generationmax=12;%最大進化代數

pcrossover=0.90;%交叉概率

pmutation=0.09;%變異概率

population=round(rand(popsize,bitlength));%隨機生產初始化種群

[fitvalue,cumsump]=fitness(population); %呼叫子函式1算個體適應度和選擇累積概率

generation=1;

while

generation

forj=1:2:popsize%每一次生成2個個體,經過25次迴圈生產乙個新種群,完成一代進化

seln=selection(population,cumsump);%呼叫子函式2選擇操作,返回選中的2個個體的序號

scro=crossover(population,seln,pcrossover);%呼叫子函式3交叉操作,返回2條染色體

scnew(j,:)=scro(1,:);%儲存交叉操作返回的染色體

scnew(j+1,:)=scro(2,:);

smnew(j,:)=mutation(scnew(j,:),pmutation);%呼叫子函式4對交叉操作返回的染色體變異

smnew(j+1,:)=mutation(scnew(j+1,:),pmutation);

endpopulation=smnew;%更新種群

[fitvalue,cumsump]=fitness(population);%呼叫子函式1計算新種群的適應度

[fmax,nmax]=max(fitvalue);%記錄最佳適應度和其染色序號

fmean=mean(fitvalue);

ymax(generation)=fmax;%記錄當代最佳適應度

ymean(generation)=fmean;%記錄當代平均適應度

x=transform2to10(population(nmax,:));%呼叫子函式6轉化為10進製數

xx=boundsbegin+x*(boundsend-boundsbegin)/(power(boundsend,bitlength)-1);%將x整合到[-2,2]區間中

xmax(generation)=xx;%儲存整合後最佳染色體10進製的值

generation=generation+1;%依次迴圈進化12代,得到最佳種群個體

endgeneration=generation-1

bestpopulation=xx%最佳種群個體,即x的值

targetmax=targetfun(xx)%呼叫子函式7要求的函式的最大值

子函式1:計算適應度和累積選擇率fitness.m

function

[fitvalue,cumsump]=fitness

(population)

global bitlength

global boundsbegin

global boundsend

popsize=size(population,1);%總共計算多少個個體

fori=1:popsize

x=transform2to10(population(i,:));%呼叫子函式6轉化為10進製數

xx=boundsbegin+x*(boundsend-boundsbegin)/(power((boundsend),bitlength)-1);

fitvalue(i)=targetfun(xx);

endfitvalue=fitvalue'+230;

fsum=sum(fitvalue);

everypopulation=fitvalue/fsum;

cumsump(1)=everypopulation(1);

fori=2:popsize

cumsump(i)=cumsump(i-1)+everypopulation(i);

endcumsump=cumsump';

子函式2:選擇操作函式selection.m

function

seln=selection

(population,cumsump)

%子函式選擇操作,從種群中隨機選擇2個個體

fori=1:2

r=rand;

j=1;

prand=cumsump-r;

while prand(j)<0

j=j+1;

endseln(i)=j;%選擇個體的序號

end

子函式3:交叉操作函式crossover.m

function

scro=crossover

(population,seln,pc)

global bitlength

pcc=ifcroormut(pc);%呼叫子函式5判斷是否進行交叉

if pcc==1

%進行交叉

c=round(rand*(bitlength-2))+1;%在[1,bitlength-1]範圍內隨機產生乙個交叉位

scro(1,:)=[population(seln(1),1:c) population(seln(2),c+1:bitlength)];

scro(2,:)=[population(seln(2),1:c) population(seln(1),c+1:bitlength)];

else

%不交叉,返回原值

scro(1,:)=population(seln(1),:);

scro(2,:)=population(seln(2),:);

end

子函式4:變異操作mutation.m

function

smnew=mutation

(scnew,pmutation)

global bitlength

smnew=scnew;

paa=ifcroormut(pmutation);呼叫子函式5,判斷是否進行變異

if paa==1

v=round(rand*(bitlength-1))+1;%在[1,bitlength]中選擇乙個變異位

smnew(v)=abs(scnew(v)-1);%將smnew中第v個位置變異

end

子函式5:判斷是否進行交叉或者變異ifcroormut.m

function

pcc=ifcroormut

(mutorcro)

judge

(1:100)=0;

l=round

(100*mutorcro);

judge

(1:l)=1;

n=round

(rand*99)+1;

pcc=judge

(n);

子函式6:二進位制轉化為十進位制transform2to10.m

function

x=transform2to10

(population)

global bitlength

x=population(bitlength);

fori=1:bitlength-1

x=x+population(bitlength-i)*power(2,i);

end

子函式7:目標函式即為適應度函式targetfun.m

function

y=targetfun

(x)%適應度函式,即原函式

y=200*exp(-0.05*x).*sin(x);

執行結果:

當進化了12代後,x約等於1.5時取到最大值185。

Matlab遺傳演算法例項

clear clc popsize input 輸入種群大小 n lengh input 請輸入染色體長度 n popsize 100 lengh 10 a 1 b 2 y x sin 10 pi x 1.0 初始種群 pop round rand popsize,lengh 行 種群大小,列 染色...

簡單遺傳演算法求函式極值

引言 遺傳演算法求函式極值算是遺傳演算法的一種最簡單的應用,這裡就介紹一種簡單的,全文基本翻譯自codeproject的一篇文章,作者為luay al wesi,軟體工程師。例子中的函式為y x2 5 大家可以將其改為其他複雜一些的函式,比如說f x 10sin 5x 7cos 4x 等。本篇文章適...

遺傳演算法求函式最優解

前兩天寫了乙個遺傳演算法求最優解的程式,今天拿出來簡單整理一下。最優解問題 四個變數取何值,該函式取最大值時?取值範圍 5到5 顯然,當四個未知數都為零的時候,函式取最大值,但如何利用遺傳演算法來實現,才是要研究的問題。1.染色體結構定義define.h struct chromosome 基因 d...