Matlab遗传算法求函数最大值

时间:2021-02-27 15:34:47

Matlab遗传算法求函数最大值

主函数函数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<Generationmax+1%总共进化12
for j=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);
end
population=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代,得到最佳种群个体
end
Generation=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);%总共计算多少个个体
for i=1:popsize
x=transform2to10(population(i,:));%调用子函数6转化为10进制数
xx=boundsbegin+x*(boundsend-boundsbegin)/(power((boundsend),Bitlength)-1);
Fitvalue(i)=targetfun(xx);
end
Fitvalue=Fitvalue'+230;
fsum=sum(Fitvalue);
everypopulation=Fitvalue/fsum;
cumsump(1)=everypopulation(1);
for i=2:popsize
cumsump(i)=cumsump(i-1)+everypopulation(i);
end
cumsump=cumsump';

子函数2:选择操作函数selection.m

function seln=selection(population,cumsump)
%子函数选择操作,从种群中随机选择2个个体
for i=1:2
r=rand;
j=1;
prand=cumsump-r;
while prand(j)<0
j=j+1;
end
seln(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);
for i=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);

运行结果:
Matlab遗传算法求函数最大值
当进化了12代后,x约等于1.5时取到最大值185。