使用遗传算法求二元函数的最小值
二元函数为y=x1^2+x2^2,x∈[-5,5]
NIND=121;%初始种群的个数(Numberofindividuals) NVAR=2;%一个染色体(个体)有多少基因 PRECI=20;%变量的二进制位数(Precisionofvariables) MAXGEN=200;%最大遗传代数(Maximumnumberofgenerations) GGAP=0.8;%代沟(Generationgap),以一定概率选择父代遗传到下一代 trace=zeros(MAXGEN,2);%寻优结果的初始值 Chrom=crtbp(NIND,PRECI*NVAR);%初始种群 %区域描述器(Buildfielddescriptor) %确定每个变量的二进制位数,取值范围,及取值范围是否包括边界等。 FieldD=[rep([PRECI],[1,NVAR]);rep([-5;5],[1,NVAR]);rep([1;0;1;1],[1,NVAR])]; Objv=objfun(bs2rv(Chrom,FieldD)) gen=1;%代计数器 whilegen<=MAXGEN Fitv=ranking(Objv);%分配适应度值(Assignfitnessvalues) SelCh=select('sus',Chrom,Fitv,GGAP);%选择 SelCh=recombin('xovsp',SelCh,1);%重组 SelCh=mut(SelCh);%变异 ObjVSel=objfun(bs2rv(SelCh,FieldD));%子代个体的十进制转换 %重插入子代的新种群 [Chrom,Objv]=reins(Chrom,SelCh,1,1,Objv,ObjVSel); trace(gen,1)=min(Objv);%遗传算法性能跟踪 trace(gen,2)=sum(Objv)/length(Objv); gen=gen+1;%代计数器增加 end plot(trace(:,1)); holdon plot(trace(:,2),'.') grid legend('最优解的变化','解的平均值的变化')
根据上面的求解模型,可以写出模型的.M文件如下,即适应度函数
%OBJFUN.M %Syntax:ObjVal=objfun1(Chrom,rtn_type) % %Inputparameters: %Chrom-Matrixcontainingthechromosomesofthecurrent %population.Eachrowcorrespondstooneindividual's %stringrepresentation. %ifChrom==[],thenspecialvalueswillbereturned %rtn_type-ifChrom==[]and %rtn_type==1(or[])returnboundaries %rtn_type==2returntitle %rtn_type==3returnvalueofglobalminimum % %Outputparameters: %ObjVal-Columnvectorcontainingtheobjectivevaluesofthe %individualsinthecurrentpopulation. %ifcalledwithChrom==[],thenObjValcontains %rtn_type==1,matrixwiththeboundariesofthefunction %rtn_type==2,textforthetitleofthegraphicoutput %rtn_type==3,valueofglobalminimum %Author:YQ_younger functionObjVal=objfun(Chrom,rtn_type); %Dimensionofobjectivefunction Dim=2; %Computepopulationparameters [Nind,Nvar]=size(Chrom); %ChecksizeofChromanddotheappropriatething %ifChromis[],thendefinesizeofboundary-matrixandvalues ifNind==0 %returntextoftitleforgraphicoutput ifrtn_type==2 ObjVal=['DEJONGfunction1-'int2str(Dim)]; %returnvalueofglobalminimum elseifrtn_type==3 ObjVal=0; %definesizeofboundary-matrixandvalues else %lowerandupperbound,identicalforallnvariables ObjVal=1*[-5;5]; ObjVal=ObjVal(1:2,ones(Dim,1)); end %ifDimvariables,computevaluesoffunction elseifNvar==Dim %function1,sumofxi^2fori=1:Dim(Dim=30) %n=Dim,-5<=xi<=5 %globalminimumat(xi)=(0);fmin=0 ObjVal=sum((Chrom.*Chrom)')'; %ObjVal=diag(Chrom*Chrom');%bothlinesproducethesame %otherwiseerror,wrongformatofChrom else error('sizeofmatrixChromisnotcorrectforfunctionevaluation'); end %Endoffunction
注释:
种群表示和初始化函数bs2rv:
二进制串到实值的转换
Phen=bs2rv(Chrom,FieldD)FieldD=[len,lb,ub,code,scale,lbin,ubin]
code(i)=1为标准的二进制编码,code(i)=0为格雷编码
scale(i)=0为算术刻度,scale(i)=1为对数刻度
函数crtbp:
创建初始种群
[Chrom,Lind,BaseV]=crtbp(Nind,Lind)
[Chrom,Lind,BaseV]=crtbp(Nind,BaseV)
[Chrom,Lind,BaseV]=crtbp(Nind,Lind,BaseV)
Nind指定种群中个体的数量,Lind指定个体的长度
函数crtrp:
创建实值原始种群
Chrom=crtrp(Nind,FieldDR)
适应度计算函数ranking:
基于排序的适应度分配(此函数是从最小化方向对个体进行排序的)
FitV=ranking(ObjV)
FitV=ranking(ObjV,RFun)
FitV=ranking(ObjV,RFun,SUBPOP)
Rfun(1)线性排序标量在[12]间为,非线性排序在[1length(ObjV)-2]
Rfun(2)指定排序方法,0为线性排序,1为非线性排序
SUBPOP指明ObjV中子种群的数量,默认为1
选择高级函数select:
从种群中选择个体
SelCh=select(SEL_F,Chrom,FitnV)
SelCh=select(SEL_F,Chrom,FitnV,GGAP)
SelCh=select(SEL_F,Chrom,FitnV,GGAP,SUBPOP)
SEL_F是一字符串,为一低级选择函数名,如rws或sus
GGAP指出了代沟,默认为1;也可大于1,允许子代数多于父代的数量
rws:轮盘赌选择
NewChrIx=rws(FitnV,Nsel)使用轮盘赌选择从一个种群中选择Nsel个个体
NewChrIx是为育种选择的个体的索引值
sus:
随机遍历抽样
NewChrIx=sus(FitnV,Nsel)
交叉高级函数recombin:
重组个体
NewChrom=recombin(REC_F,Chrom)
NewChrom=recombin(REC_F,Chrom,RecOpt)
NewChrom=recombin(REC_F,Chrom,RecOpt,SUBPOP)
REC_F是包含低级重组函数名的字符串,例如recdis,recint,reclin,xovdp,xovdprs,xovmp,xovsh,xovshrs,xovsp,xovsprs
recdis:
离散重组
NewChrom=recdis(OldChorm)
recint:
中间重组
NewChrom=recint(OldChorm)
reclin:
线性重组
NewChrom=reclin(OldChorm)
xovdp:
两点交叉
NewChrom=xovdp(OldChrom,XOVR)
XOVR为交叉概率,默认为0.7
Xovdprs:
减少代理的两点交叉
NewChrom=xovdprs(OldChrom,XOVR)
Xovmp:
多点交叉
NewChrom=xovmp(OldChrom,XOVR,Npt,Rs)
Npt指明交叉点数,0洗牌交叉;1单点交叉;2两点交叉;
默认为0
Rs指明使用减少代理,0不减少代理;1减少代理;
默认为0
Xovsh:
洗牌交叉
NewChrom=xovsh(OldChrom,XOVR)
Xovshrs:
减少代理的洗牌交叉
NewChrom=xovshrs(OldChrom,XOVR)
Xovsp:
单点交叉
NewChrom=xovsp(OldChrom,XOVR)
Xovsprs:
减少代理的单点交叉
NewChrom=xovsprs(OldChrom,XOVR)
变异高级函数mutate:
个体的变异
NewChorm=mutate(MUT_F,OldChorm,FieldDR)NewChorm=mutate(MUT_F,OldChorm,FieldDR,MutOpt)NewChorm=mutate(MUT_F,OldChorm,FieldDR,MutOpt,SUBPOP)MUT_F为包含低级变异函数的字符串,例如mut,mutbga,recmut
mut:
离散变异算子
NewChrom=mut(OldChorm,Pm)NewChrom=mut(OldChorm,Pm,BaseV)
Pm为变异概率,默认为Pm=0.7/Lind
mutbga:
实值种群的变异(遗传算法育种器的变异算子)NewChrom=mutbga(OldChorm,FieldDR)
NewChrom=mubga(OldChorm,FieidDR,MutOpt)
MutOpt(1)是在[01]间的重组概率的标量,默认为1
MutOpt(2)是在[01]间的压缩重组范围的标量,默认为1(不压缩)
recmut:
具有突变特征的线性重组
NewChrom=recmut(OldChorm,FieldDR)
NewChrom=recmut(OldChorm,FieidDR,MutOpt)
重插入函数reins:
重插入子群到种群
Chorm=reins(Chorm,SelCh)
Chorm=reins(Chorm,SelCh,SUBPOP)
Chorm=reins(Chorm,SelCh,SUBPOP,InsOpt,ObjVch)
[Chorm,ObjVch]=reins(Chorm,SelCh,SUBPOP,InsOpt,ObjVch,ObjVSel)
InsOpt(1)指明用子代代替父代的选择方法,0为均匀选择,1为基于适应度的选择,默认为0
InsOpt(2)指明在[01]间每个子种群中重插入的子代个体在整个子种群的中个体的比率,默认为1
ObjVch包含Chorm中个体的目标值,对基于适应度的重插入是必需的
ObjVSel包含Selch中个体的目标值,如子代数量大于重插入种群的子代数量是必需的
其他函数矩阵复试函数rep:
MatOut=rep(MatIn,REPN)
REPN为复制次数
以上这篇使用遗传算法求二元函数的最小值就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。