主函式函式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...