遗传算法matlab代码.docx
- 文档编号:6416192
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:16
- 大小:25.58KB
遗传算法matlab代码.docx
《遗传算法matlab代码.docx》由会员分享,可在线阅读,更多相关《遗传算法matlab代码.docx(16页珍藏版)》请在冰豆网上搜索。
遗传算法matlab代码
遗传算法matlab代码
tmprnd=rand;functionyouhuafun
tmpind=tmprnddifind=[0,diff(tmpind)];
D=code;if~any(difind)N=50;%Tunabledifind
(1)=1;maxgen=50;%Tunableend
crossrate=0.5;%Tunablechildind(k)=scoreind(logical(difind));
muterate=0.08;%Tunableend
generation=1;fatherrand=fatherrand(:
childind);
num=length(D);generation=generation+1;fatherrand=randint(num,N,3);end
score=zeros(maxgen,N);%score
whilegeneration<=maxgenmaxV=max(score,[],2);
ind=randperm(N-2)+2;%随机配对交叉minV=11*300-maxV;
A=fatherrand(:
ind(1:
(N-2)/2));plot(minV,'*');title('各代的目标函数值');
B=fatherrand(:
ind((N-2)/2+1:
end));F4=D(:
4);
%多点交叉FF4=F4-fatherrand(:
1);
rnd=rand(num,(N-2)/2);FF4=max(FF4,1);
ind=rndtmp=A(ind);D(:
5)=FF4;
A(ind)=B(ind);saveDDataD
B(ind)=tmp;
functionD=code
%%两点交叉loadyouhua.mat
%forkk=1:
(N-2)/2%propertiesF2andF3%rndtmp=randint(1,1,num)+1;F1=A(:
1);
%tmp=A(1:
rndtmp,kk);F2=A(:
2);
%A(1:
rndtmp,kk)=B(1:
rndtmp,kk);F3=A(:
3);
%B(1:
rndtmp,kk)=tmp;if(max(F2)>1450)||(min(F2)<=900)%enderror('DATApropertyF2exceedit''srange(900,1450]')
fatherrand=[fatherrand(:
1:
2),A,B];end
%getgrouppropertyF1ofdata,accordingtoF2value
%变异F4=zeros(size(F1));
rnd=rand(num,N);forite=11:
-1:
1
ind=rnd[m,n]=size(ind);index=find(F2<=900+ite*50);
tmp=randint(m,n,2)+1;F4(index)=ite;
tmp(:
1:
2)=0;end
fatherrand=tmp+fatherrand;D=[F1,F2,F3,F4];
fatherrand=mod(fatherrand,3);
%fatherrand(ind)=tmp;functionScoreN=scorefun(fatherrand,D)
F3=D(:
3);
%评价、选择F4=D(:
4);
scoreN=scorefun(fatherrand,D);%求得N个个体的评价函N=size(fatherrand,2);数FF4=F4*ones(1,N);
score(generation,:
)=scoreN;FF4rnd=FF4-fatherrand;
[scoreSort,scoreind]=sort(scoreN);FF4rnd=max(FF4rnd,1);
sumscore=cumsum(scoreSort);ScoreN=ones(1,N)*300*11;
sumscore=sumscore./sumscore(end);%这里有待优化
childind(1:
2)=scoreind(end-1:
end);fork=1:
N
fork=3:
NFF4k=FF4rnd(:
k);
forite=1:
11十进制
functionpop2=decodebinary(pop)F0index=find(FF4k==ite);
if~isempty(F0index)[px,py]=size(pop);%求pop行和列数
fori=1:
pytmpMat=F3(F0index);
pop1(:
i)=2.^(py-i).*pop(:
i);tmpSco=sum(tmpMat);
endScoreBin(ite)=mod(tmpSco,300);
endpop2=sum(pop1,2);%求pop1的每行之和
end
Scorek(k)=sum(ScoreBin);%2.2.2将二进制编码转化为十进制数
(2)end%decodechrom.m函数的功能是将染色体(或二进制编码)转换
为十进制,参数spoint表示待解码的二进制串的起始位置ScoreN=ScoreN-Scorek;
%(对于多个变量而言,如有两个变量,采用20为表示,每个变遗传算法实例:
量为10,则第一个变量从1开始,另一个变量从11开始。
本例
为1),
%参数1ength表示所截取的长度(本例为10)。
%下面举例说明遗传算法%%遗传算法子程序
%求下列函数的最大值%%Name:
decodechrom.m%f(x)=10*sin(5x)+7*cos(4x)x?
[0,10]%%将二进制编码转换成十进制
%将x的值用一个10位的二值形式表示为二值问题,一个10functionpop2=decodechrom(pop,spoint,length)
位的二值数提供的分辨率是每为(10-0)/(2^10-1)?
0.01。
%pop1=pop(:
spoint:
spoint+length-1);%将变量域[0,10]离散化为二值域[0,1023],x=0+10*b/1023,pop2=decodebinary(pop1);其中b是[0,1023]中的一个二值数。
%
%%%2.2.3计算目标函数值
%---------------------------------------------------------------------------------%calobjvalue.m函数的功能是实现目标函数的计算,其公式采-----------------------------%用本文示例仿真,可根据不同优化问题予以修改。
%---------------------------------------------------------------------------------%遗传算法子程序
-----------------------------%%Name:
calobjvalue.m
%实现目标函数的计算
%编程function[objvalue]=calobjvalue(pop)%-----------------------------------------------temp1=decodechrom(pop,1,10);%将pop每行转化成十进制数%2.1初始化(编码)x=temp1*10/1023;%将二值域中的数转化为变量域的数%initpop.m函数的功能是实现群体的初始化,popsize表示群体objvalue=10*sin(5*x)+7*cos(4*x);%计算目标函数值的大小,chromlength表示染色体的长度(二值数的长度),
%长度大小取决于变量的二进制编码的长度(在本例中取10%2.3计算个体的适应值
位)。
%遗传算法子程序
%遗传算法子程序%Name:
calfitvalue.m%Name:
initpop.m%计算个体的适应值
%初始化functionfitvalue=calfitvalue(objvalue)
functionpop=initpop(popsize,chromlength)globalCmin;
pop=round(rand(popsize,chromlength));%rand随机产生每个Cmin=0;
单元为{0,1}行数为popsize,列数为chromlength的矩阵,[px,py]=size(objvalue);%roud对矩阵的每个单元进行圆整。
这样产生的初始种群。
fori=1:
px
ifobjvalue(i)+Cmin>0%2.2计算目标函数值temp=Cmin+objvalue(i);%2.2.1将二进制数转化为十进制数
(1)else
%遗传算法子程序temp=0.0;
%Name:
decodebinary.mend
%产生[2^n2^(n-1)...1]的行向量,然后求和,将二进制转化为fitvalue(i)=temp;
end之一。
fitvalue=fitvalue';%遗传算法子程序
%Name:
crossover.m%2.4选择复制%交叉
function[newpop]=crossover(pop,pc)%选择或复制操作是决定哪些个体可以进入下一代。
程序中采
[px,py]=size(pop);用赌轮盘选择法选择,这种方法较易实现。
newpop=ones(size(pop));%根据方程pi=fi/?
fi=fi/fsum,选择步骤:
fori=1:
2:
px-1%1)在第t代,由
(1)式计算fsum和pi
if(rand cpoint=round(rand*py);%3)求? fi? s中最小的k,则第k个个体被选中 newpop(i,: )=[pop(i,1: cpoint),pop(i+1,cpoint+1: py)];%4)进行N次2)、3)操作,得到N个个体,成为第t=t+1 newpop(i+1,: )=[pop(i+1,1: cpoint),pop(i,cpoint+1: py)];代种群 else%遗传算法子程序 %Name: selection.mnewpop(i,: )=pop(i); newpop(i+1,: )=pop(i+1);%选择复制 function[newpop]=selection(pop,fitvalue)end endtotalfit=sum(fitvalue);%求适应值之和 fitvalue=fitvalue/totalfit;%单个个体被选择的概率 fitvalue=cumsum(fitvalue);%如fitvalue=[1234],则%2.6变异 cumsum(fitvalue)=[13610]%变异(mutation),基因的突变普遍存在于生物的进化过程中。 [px,py]=size(pop);变异是指父代中的每个个体的每一位都以概率pm翻转,即由ms=sort(rand(px,1));%从小到大排列“1”变为“0”, fitin=1;%或由“0”变为“1”。 遗传算法的变异特性可以使求解过程随机地newin=1;搜索到解可能存在的整个空间,因此可以在一定程度上求得全局whilenewin<=px最优解。 if(ms(newin)) newpop(newin)=pop(fitin);%Name: mutation.mnewin=newin+1;%变异 elsefunction[newpop]=mutation(pop,pm) fitin=fitin+1;[px,py]=size(pop);endnewpop=ones(size(pop));endfori=1: px if(rand mpoint=round(rand*py);%2.5交叉 ifmpoint<=0%交叉(crossover),群体中的每个个体之间都以一定的概率pc mpoint=1;交叉,即两个个体从各自字符串的某一位置 end%(一般是随机确定)开始互相交换,这类似生物进化过程中 newpop(i)=pop(i);的基因分裂与重组。 例如,假设2个父代个体x1,x2为: %x1=0100110ifany(newpop(i,mpoint))==0%x2=1010001newpop(i,mpoint)=1; else%从每个个体的第3位开始交叉,交又后得到2个新的子代个 newpop(i,mpoint)=0;体y1,y2分别为: end%y1,0100001 else%y2,1010110 newpop(i)=pop(i);%这样2个子代个体就分别具有了2个父代个体的某些特征。 end利用交又我们有可能由父代个体在子代组合成具有更高适合度 end的个体。 %事实上交又是遗传算法区别于其它传统优化方法的主要特点 y=z%2.7求出群体中最大得适应值及其个体 %遗传算法子程序 %Name: best.m【问题】求f(x)=x10*sin(5x)7*cos(4x)的最大值,其中0<=x<=9%求出群体中适应值最大的值【分析】选择二进制编码,种群中的个体数目为10,二进制编码function[bestindividual,bestfit]=best(pop,fitvalue)长度为20,交叉概率为0.95,变异概率为0.08[px,py]=size(pop);【程序清单】 bestindividual=pop(1,: );%编写目标函数 bestfit=fitvalue (1);function[sol,eval]=fitness(sol,options) fori=2: pxx=sol (1); iffitvalue(i)>bestfiteval=x10*sin(5*x)7*cos(4*x);bestindividual=pop(i,: );%把上述函数存储为fitness.m文件并放在工作目录下bestfit=fitvalue(i);initPop=initializega(10,[09],'fitness');%生成初始种群,大小end为10 end[xendPop,bPop,trace]=ga([09],'fitness',[],initPop,[1e-61 1],'maxGenTerm',25,'normGeomSelect',...%2.8主程序[0.08],['arithXover'],[2],'nonUnifMutation',[2253])%25次%遗传算法主程序遗传迭代 %Name: genmain05.m运算借过为: x= clear7.856224.8553(当x为7.8562时,f(x)取最大值24.8553)clf注: 遗传算法一般用来取得近似最优解,而不是最优解。 popsize=20;%群体大小遗传算法实例2 chromlength=10;%字符串长度(个体长度)【问题】在,5<=Xi<=5,i=1,2区间内,求解 f(x1,x2)=-20*exp(-0.2*sqrt(0.5*(x1.^2pc=0.6;%交叉概率 pm=0.001;%变异概率x2.^2)))-exp(0.5*(cos(2*pi*x1)cos(2*pi*x2)))22.71282的最小 值。 pop=initpop(popsize,chromlength);%随机产生初始群体【分析】种群大小10,最大代数1000,变异率0.1,交叉率0.3fori=1: 20%20为迭代次数【程序清单】 [objvalue]=calobjvalue(pop);%计算目标函数,源函数的matlab代码 function[eval]=f(sol)fitvalue=calfitvalue(objvalue);%计算群体中每个个体的适应度 numv=size(sol,2);[newpop]=selection(pop,fitvalue);%复制 x=sol(1: numv);[newpop]=crossover(pop,pc);%交叉 [newpop]=mutation(pop,pc);%变异 eval=-20*exp(-0.2*sqrt(sum(x.^2)/numv)))-exp(sum(cos(2*pi*x)[bestindividual,bestfit]=best(pop,fitvalue);%求出群体中适应值 )/numv)22.71282;最大的个体及其适应值 y(i)=max(bestfit);%适应度函数的matlab代码 n(i)=i;function[sol,eval]=fitness(sol,options) pop5=bestindividual;numv=size(sol,2)-1;x(i)=decodechrom(pop5,1,chromlength)*10/1023;x=sol(1: numv);pop=newpop;eval=f(x);endeval=-eval; %遗传算法的matlab代码 fplot('10*sin(5*x)+7*cos(4*x)',[010])bounds=ones(2,1)*[-55];holdon[p,endPop,bestSols,trace]=ga(bounds,'fitness') plot(x,y,'r*')注: 前两个文件存储为m文件并放在工作目录下,运行结果为holdoffp= 0.0000-0.00000.0055[zindex]=max(y);%计算最大值及其位置大家可以直接绘出f(x)的图形来大概看看f(x)的最值是多少,x5=x(index)%计算最大值对应的x值也可是使用优化函数来验证。 matlab命令行执行命令: fplot('x10*sin(5*x)7*cos(4*x)',[0,9])p= 0.0000-0.00000.0055evalops是传递给适应度函数的参数,opts是二进制编码的精度, termops是选择maxGenTerm结束函数时传递个maxGenTerm大家可以直接绘出f(x)的图形来大概看看f(x)的最值是多少,的参数,即遗传代数。 xoverops是传递给交叉函数的参数。 也可是使用优化函数来验证。 matlab命令行执行命令: fplot('x+10*sin(5*x)+7*cos(4*x)',[0,9])mutops是传递给变异函数的参数。 evalops是传递给适应度函数的参数,opts是二进制编码的精度,【问题】求f(x)=x+10*sin(5x)+7*cos(4x)的最大值,其中0<=x<=9termops是选择maxGenTerm结束函数时传递个maxGenTerm【分析】选择二进制编码,种群中的个体数目为10,二进制编码的参数,即遗传代数。 xoverops是传递给交叉函数的参数。 长度为20,交叉概率为0.95,变异概率为0.08mutops是传递给变异函数的参数。 【程序清单】 %编写目标函数参考资料: 不记得了,抱歉 function[sol,eval]=fitness(sol,options) functionMain()x=sol (1); %定义全局变量eval=x+10*sin(5*x)+7*cos(4*x); globalVariableNumPOPSIZEMaxGens%把上述函数存储为fitness.m文件并放在工作目录下 PXOVERPMutationinitPop=initializega(10,[09],'fitness');%生成初始种群,大小 为10 VariableNum=3%变量个数[xendPop,bPop,trace]=ga([09],'fitness',[],initPop,[1e-61 POPSIZE=50%种群大小1],'maxGenTerm',25,'normGeomSelect',... MaxGens=1000%种群代数[0.08],['arithXover'],[2],'nonUnifMutation',[2253])%25次 PXOVER=0.8%交叉概率遗传迭代 PMutation=0.2%变异概率运算借过为: x= %读取数据文件7.856224.8553(当x为7.8562时,f(x)取最大值24.8553) loadE: \现代优化算法\遗传算法\bound.txt注: 遗传算法一般用来取得近似最优解,而不是最优解。 VarBound=bound(: 1: 2);遗传算法实例2 【问题】在,5<=Xi<=5,i=1,2区间内,求解 globalPopnewPop Pop=zeros(POPSIZE+1,VariableNum);f(x1,x2)=-20*exp(-0.2*sqrt(0.5*(x1.^2+x2.^2)))-exp(0.5*(cos(2* newPop=zeros(POPSIZE+1,VariableNum);pi*x1)+cos(2*pi*x2)))+22.71282的最小值。 %初始化种群【分析】种群大小10,最大代数1000,变异率0.1,交叉率0.3 fori=1: POPSIZE【程序清单】 forj=1: VariableNum,源函数的matlab代码 Pop(i,j)=VarBound(j,1)+rand()*(VarBound(j,2)-VarBound(jfunction[eval]=f(sol) 1));numv=size(sol,2); endx=sol(1: numv); end %计算适应值eval=-20*exp(-0.2*sqrt(sum(x.^2)/numv)))-exp(sum(cos(2*pi*x) fitnessList=zeros(POPSIZE,1);)/numv)+22.71282; fori=1: POPSIZE%适应度函数的matlab代码 fitnessList(i,1)=fitness(Pop(i,1: VariableNum));f
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 遗传 算法 matlab 代码