遗传算法matlab代码.docx

上传人:李司机 文档编号:5207075 上传时间:2023-06-13 格式:DOCX 页数:10 大小:55.04KB
返回 下载 相关 举报
遗传算法matlab代码.docx_第1页
第1页 / 共10页
遗传算法matlab代码.docx_第2页
第2页 / 共10页
遗传算法matlab代码.docx_第3页
第3页 / 共10页
遗传算法matlab代码.docx_第4页
第4页 / 共10页
遗传算法matlab代码.docx_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《遗传算法matlab代码.docx》由会员分享,可在线阅读,更多相关《遗传算法matlab代码.docx(10页珍藏版)》请在三一办公上搜索。

1、function youhuafunD=code;N=50;% Tunablemaxgen=50;% TunableCrossrate=O. 5; %Tunablemuterate=O. 08: %Tunable generation=1;num = Iength(D);fatherrand=randint (num, N, 3);score = zeros(maxgen, N);wh i1e generat i on1450)(min(F2)=900)error(DATApropertyF2exceeditsrange(900,1450,)end%getgrouppropertyFlofda

2、ta,accordingtoF2valueF4=zeros(size(Fl);forite=ll:-1:1index=find(F20temp=Cmin+objvalue(i);elsetemp=0.0;endfitvalue(i)=temp;endfitvale=fitvalue,;%2.4选择复制%选择或复制操作是决定哪些个体可以进入下一代。程序中采用赌轮盘选择法选择,这种方法较易实现。%根据方程pi=fifi=fifsum,选择步骤:%1)在第t代,由(1)式计算fsum和Pi%2)产生0,1的随机数rand(.),求s=rand(.)*fsum%3)求fis中最小的k,则第k个个体被选

3、中%4)进行N次2)、3)操作,得到N个个体,成为第t=t+1代种群%遗传算法子程序%Name:selection.m%选择免制functionnewpop=selection(pop,fitvale)totalfit=sum(fitvalue);%求适应值之和fitvalue=fitvaluetotalfit;%单个个体被选择的概率fitvalue=cumsum(fitvalue);%如fitvale=1234,则cumsum(fitvalue)=13610px,py=size(pop);ms=sort(rand(px,1);%从小到大排列fitin=1;newin=1;whilenewin

4、=pxif(ms(newin)fitvalue(fitin)newpop(newin)=pop(fitin);newin=newin+1;elsefitin=fitin+1;endend%2.5交叉%交叉(CrOSSOVer),群体中的每个个体之间都以一定的概率PC交叉,即两个个体从各自字符串的某一位置%(一般是随机确定)开始互相交换,这类似生物进化过程中的基因分裂与重组。例如,假设2个父代个体x1,x2为:%x1=0100110%x2=1010001%从每个个体的第3位开始交叉,交又后得到2个新的子代个体y1,y2分别为:%y1=0100001%y2=1010110%这样2个子代个体就分别具

5、有了2个父代个体的某些特征。利用交又我们有可能由父代个体在子代组合成具有更高适合度的个体。%事实上交又是遗传算法区别于其它传统优化方法的主要特点之一。%遗传算法子程序%Name:crossover,m%交叉functionnewpop=crossover(pop,pc)px,py=size(pop);newpop=ones(size(pop);fori=1:2:px-1if(randpc)cpoint=round(rand*py);newpop(i)=pop(i,1:cpoint),pop(i+1,cpoint+1:py);newpop(i+1)=pop(i+1,1:cpoint),pop(i

6、,cpoint+1:py);elsenewpop(i)=pop(i);newpop(i+1)=pop(i+1);endend%2.6变异%变异(mutation),基因的突变普遍存在于生物的进化过程中。变异是指父代中的每个个体的每一位都以概率pm翻转,即由“1变为0,%或由“0变为T”。遗传算法的变异特性可以使求解过程随机地搜索到解可能存在的整个空间,因此可以在一定程度上求得全局最优解。%遗传算法子程序%Name:mutation.m%变异functionnewpop=mutation(pop,pm)px,py=size(pop);newpop=ones(size(pop);fori=1:px

7、if(randpm)mpoint=round(rand*py);ifmpointbestfitbestindividual=pop(i,:);bestfit=fitvalue(i);endend%2.8主程序%遗传算法主程序%Name:genmainO5.mclearclfpopsize=20;%群体大小ChromIength=I0;%字符串长度(个体长度)pc=0.6;%交叉概率Pm=O.001;%变异概率pop=initpop(popsize,Chromlength);%随机产生初始群体fori=1:20%20为迭代次数objvalue=calobjvalue(pop);%计算目标函数fi

8、tvalue=calfitvale(objvalue);%计算群体中每个个体的适应度newpop=selection(pop,fitvalue);%免制newpop=crossover(pop,pc);%交叉newpop=mutation(pop,pc);%变异bestindividual,bestfit=best(pop,fitvalue);%求出群体中适应值最大的个体及其适应值y(i)=max(bestfit);n(i)=i;pop5=bestindividual;x(i)=decodechrom(pop5,1,chromlength)*10/1023;pop=newpop;endfplo

9、t(10*sin(5)+7*cos(4*x),010)holdonplot(x,y,r*)holdoffzindex=max(y);%计算最大值及其位置y=z【问题】求f(x)=x10*sin(5x)7*cos(4x)的最大值,其中0=x=9【分析】选择二进制编码,种群中的个体数目为10,二进制编码长度为20,交叉概率为0.95,变异概率为0.08【程序清单】%编写目标函数functionsol,eval=fitness(sol,options)x=sol(1);eval=x10*sin(5*x)7*cos(4*x);%把上述函数存储为fitness.m文件并放在工作目录下initPop=in

10、itializega(10,09,fitness);%生成初始种群,大小为10xendPop,bPop,trace=ga(09,fitness,initPop,1e-611,maxGen7erm,25,normGeomSelect,.0.08,arithXover,2,nonnifMutation,2253)%25次遗传迭代运算借过为:X=7.856224.8553(当X为7.8562时,f(X)取最大值24.8553)注:遗传算法一般用来取得近似最优解,而不是最优解。遗传算法实例2【问题】在一5=Xi=5,i=1,2区间内,求解f(x1,x2)=-20*exp(-0.2*sqrt(0.5*(

11、x12X22)-exp(0.5*(COS(2*pi*x1)C0S(2*pi*x2)22.71282的最小值。【分析】种群大小10,最大代数IOo0,变异率0.1,交叉率0.3【程序清单】%源函数的matlab代码functioneval=f(sol)numv=size(sol,2);x=sol(1:numv);eval=-20*exp(-0.2*sqrt(sum(x.A2)/numv)-exp(sum(cos(2*pi*x)numv)22.71282;%适应度函数的matlab代码functionsol,eval=fitness(sol,options)nmv=size(sol,2)-1;x=

12、sol(1:numv);eval=f(x);eval=-eval;%遗传算法的matlab代码bounds=ones(2,1)*(-55;p,endPop,bestSols,trace=ga(bounds,fitness)注:前两个文件存储为m文件并放在工作目录下,运行结果为P=0.0000-0.00000.0055大家可以直接绘出f(x)的图形来大概看看f(X)的最值是多少,也可是使用优化函数来验证。matlab命令行执行命令:fplot(,x10*sin(5*)7*cos(4*x)*,0t9)evalops是传递给适应度函数的参数,opts是二进制编码的精度,termops是选择maxGe

13、nTerm结束函数时传递个maxGenTerm的参数,即遗传代数。xoverops是传递给交叉函数的参数。mutops是传递给变异函数的参数。【问题】求f(x)=x+10*sin(5x)+7*cos(4x)的最大值,其中0=x=9【分析】选择二进制编码,种群中的个体数目为10,二进制编码长度为20,交叉概率为0.95,变异概率为0.08【程序清单】%编写目标函数functionsol,eval=fitness(sol,options)x=sol(1);eval=x+10*sin(5*x)+7*cos(4*x);%把上述函数存储为fitness.m文件并放在工作目录下initPop=initia

14、lizega(10,09,fitness);%生成初始种群,大小为10xendPop,bPop,trace=ga(09,fitness,initPop,1e-611,maxGenTerm,25,normGeomSelect,.0.08,CarithXover,2,nonnifMutation,2253)%25次遗传迭代运算借过为:X=7.856224.8553(当X为7.8562时,f(X)取最大值24.8553)注:遗传算法一般用来取得近似最优解,而不是最优解。遗传算法实例2【问题】在一5=Xi=5,i=1,2区间内,求解f(x1,x2)=-20*exp(-0.2*sqrt(0.5*(x1.

15、A2+x2.A2)-exp(0.5*(cos(2*pi*x1)+C0S(2*pi*x2)+22.71282的最小值。【分析】种群大小10,最大代数1000,变异率0.1,交叉率0.3【程序清单】%源函数的matlab代码functioneval=f(sol)numv=size(sol,2);x=sol(1:numv);eval=-20*exp(-0.2*sqrt(sum(x.A2)/numv)-exp(sum(cos(2*pi*x)numv)+22.71282;%适应度函数的matlab代码functionsol,eval=fitness(sol,options)numv=size(sol,2

16、)-1;x=sol(1:numv);eval=f(x);eval=-eval;%遗传算法的matlab代码bounds=ones(2,1)*(-55;p,endPop,bestSols,trace=ga(bounds,fitness)注:前两个文件存储为m文件并放在工作目录下,运行结果为P=0.0000-0.00000.0055大家可以直接绘出f(x)的图形来大概看看f(X)的最值是多少,也可是使用优化函数来验证。matlab命令行执行命令:fplot(+10*sin(5*x)+7*cos(4*x),0,9)evalops是传递给适应度函数的参数,opts是二进制编码的精度,termops是选

17、择maxGenTerm结束函数时传递个maxGenTerm的参数,即遗传代数。xoverops是传递给交叉函数的参数。mutops是传递给变异函数的参数。参考资料:不记得了,抱歉functionMain()%定义全局变量globalVariabIeNumPOPSIZEMaxGensPXOVERPMutationVariabIeNum=S%变量个数POPSIZE=50%种群大小MaxGens=100O%种群代数PXOVER=0.8%交叉概率PMutation=0.2%变异概率%读取数据文件loadE:现代优化算法遗传算法bound.txtVarBound=bound(:,1:2);globalP

18、opnewPopPop=zeros(POPSIZE+1,VariabIeNum);newPop=zeros(POPSIZE+1,VariabIeNum);%初始化种群fori=1:POPSIZEforJ=IiVariabIeNumPop(i,j)=VarBound(j,1)+rand()*(VarBound(j,2)-VarBound(j,1);endend%计算适应值fitnessList=zeros(POPSIZE,1);for1:Pe)PSlZEfitnessUst(i,1)=fitness(Pop(i,IiVariabIeNum);end%保存最好值和最坏值Best=zeros(1,V

19、ariableNum+1);Worst=zeros(1,VariableNum+1);maxvalue=max(fitnessList);indexMax=find(fitnessList=maxvalue,1,first,);Best(1,1:VariableNum)=Pop(indexMax,1:VariableNum);Best(1,VariableNum+1)=maxvalue;minvalue=min(fitnessList);indexMin=find(fitnessList=minvalue,1,first);Worst(1,1:VariableNum)=Pop(indexMin

20、,1:VariableNum);Worst(1,VariableNm+1)=minvalue;genetation=1;whilegenetationMaGens%计算适应度区间sumfit=sum(abs(fitnessList);relativeFitness=zeros(POPSIZE,1);relativeFitness=abs(fitnessList)sumfit;fori=2:POPSIZErelativeFitness(i)=relativeFitness(i-1)+relativeFitness(i);end%选择操作newPop=Select(Pop,relativeFitn

21、ess);%交叉操作newPop=Xcross(newPop,VariabIeNum,PXOVER);%变异操作newPop=Mtation(newPop,VariabIeNum,PMutation,VarBound);%计算新种群适应值fori=1POPSIZEfitnessList(i,1)=fitness(newPop(i,1:VariableNum);end%保存最好值和替换最坏值maxvalue=max(fitnessList);indeMax=find(fitnessList=maxvalue,1,first);minvalue=min(fitnessList);indexMin=

22、find(fitnessList=minvalue,1,first);ifBestmaxvalueBest(1,1:VariableNum)=newPop(indexMax,11VariableNum);Best(1,VariableNum+1)=maxvalue;elsenewPop(indeMin,1:VariableNum)=Best(1,11VariableNum);fitnessList(indexMin,1)=Best(1,VariableNum+1);end%用子代替换父代Pop=newPop;genetation=genetation+1;endBest%选择操作functio

23、nnewPop=Select(Pop,Rfitness)fori=1Jength(Rfitness)r=rand();index=1;forJ=Uength(Rfitness)ifr=Rfitness(j,1)index=;break;endendnewPop(i,:)=Pop(index,:);end%交叉操作functionnewPop=Xcross(Pop,VariabIeNUM,CrossRate)point=1;SizePop=Iength(Pop);fori=0:sizePop/2Xrate=rand();ifXrate1ifVariableNUM=2point=1;elsepoi

24、nt=round(rand()*(VariableNUM-2)+1);endtempne=zeros(1,point);tempne(1,1:point)=Pop(first_index,1:point);Pop(firstjndex,1:point)=Pop(secondJndex,1:point);Pop(secondJndex,1:point)=tempOne(1,1:point);endendendnewPop=zeros(size(Pop),1);newPop=Pop;%变异操作functionnewPop=Mutation(Pop,VariabIeNUM1MutationRate,

25、bound)point=1;SizePop=Iength(Pop);fori=1:sizePopforj=1:VariableNUMMrate=rand();ifMrateMutationRate%如果发生变异Pop(i,j)=rand()*(bound(j,2)-bound(j,1)+bound(j,1);endendendnewPop=zeros(size(Pop),1);newPop=Pop;%适应值函数或目标函数%函数x12-xx2+x3functionvalue=fitness(varargin)n=varargin1,1;valu=n(1,1)2-n(1,1)*n(1,2)+n(1

26、,3);己知n个城市之间的相互距离,现有一个推销员必须遍访这n个城市,并且每个城市只能访问一次,最后又必须返回出发城市。如何安排他对这些城市的访问次序,可使其旅行路线的总长度最短?用图论的术语来说,假设有一个图g=(v,e),其中V是顶点集,e是边集,设d=(dij)是由顶点i和顶点j之间的距离所组成的距离矩阵,旅行商问题就是求出一条通过所有顶点且每个顶点只通过一次的具有最短距离的回路。这个问题可分为对称旅行商问题(dij=dji,任意i,j=l,2,3,.,n)和非对称旅行商问题(dijdjiz,任意i,j=l,2,3,.,n)且记tn+l=tl则旅行商问题的数学模型为:minl=d(t(i

27、)zt(i+l)(i=l,.,n)旅行商问题是一个典型的组合优化问题,并且是一个np难问题,其可能的路径数目与城市数目n是成指数型增长的,所以一般很难精确地求出其最优解,本文采用遗传算法求其近似解。遗传算法:初始化过程:用vl,v2,v3,.,vn代表所选n个城市。定义整数pop-size作为染色体的个数,并且随机产生pop-size个初始染色体,每个染色体为1到18的整数组成的随机序列。适应度f的计算:对种群中的每个染色体vi,计尊其适应度,f=d(t(i),t(i+l).评价函数eval(vi):用来对种群中的每个染色体Vi设定一个概率,以使该染色体被选中的可能性与其种群中其它染色体的适应

28、性成比例,既通过轮盘赌,适应性强的染色体被选择产生后台的机会要大,设alpha(0,l),本文定义基于序的评价函数为eval(Vi)=alpha*(1-alpha).(i-l)。随机规划与模糊规划选择过程:选择过程是以旋转赌轮pop-size次为基础,每次旋转都为新的种群选择一个染色体。赌轮是按每个染色体的适应度进行选择染色体的。Stepl、对每个染色体vi,计算累计概率qi,q0=0;qi=eval(vj)j=l,.,i;i=lz.pop-size.SteP2、从区间(0,pop-size)中产生一个随机数r;step3-,若qi-lstep4重复step2和step3共POP-SiZe次,

29、这样可以得到p。P-SiZe个复制的染色体。grefenstette编码:由于常规的交叉运算和变异运算会使种群中产生一些无实际意义的染色体,本文采用grefenstette编码遗传算法原理及应用可以避免这种情况的出现0所谓的grefenstette编码就是用所选队员在未选(不含淘汰)队员中的位置,如:815216107431114612951813171对应:8142138632573432422Io交叉过程:本文采用常规单点交叉。为确定交叉操作的父代,从到pop-size重复以下过程:从0,1中产生一个随机数r,如果r将所选的父代两两组队,随机产生一个位置进行交叉,如:81421386325

30、7343242216123568563185633211交叉后为:814213863251856332116123568563734324221变异过程:本文采用均匀多点变异。类似交叉操作中选择父代的过程,在r选择多个染色体Vi作为父代。对福一个选择的父代,随机选择多个位置,使其在每位置按均匀变异(该变异点xk的取值范围为ukmin,ukmax,产生一个0,1中随机数r,该点变异为X,k=ukmin+r(ukmax-ukmin)操作。如:81421386325734324221变异后:814213106322734524121反grefenstette编码:交叉和变异都是在grefenstet

31、te编码之后进行的,为了循环操作和返回最终结果,必须逆grefenstette编码过程,将编码恢复到自然编码。循环操作:判断是否满足设定的带数XZOIne,否,则跳入适应度f的计算;是,结束遗传操作,跳出。matlab代码distTSP.txt06184870173744045201924022881660%GATSP.mfunctiongatspl()clear;loaddistTSP.txt;distance=distTSP;N=5;ngen=100;ngpool=10;%ngen=input(#ofgenerationstoevolve=,);%ngpool=input(,#ofChro

32、mosomsinthegenepool=,)%sizeofgenepoolgool=zeros(ngpoolzN+l);%genepoolfori=lxngpoolz%intializegenepoolgool(i,:)=1randomize(2:N)1;forj=l:i-1whilegpool(iz:)=gpool(jz:)gpool(iz:)=1randomize(2:N)1;endendendCostmin=100OOO;tourmin=zeros(IzN);cost=zeros(lzngpool);increase=l;resultincrease=l;fori=lxngpoolzco

33、st(i)=sum(diag(distance(gpool(iz:),rshift(gpool(iz:);end%recordcurrentbestsolutioncostmin,idx=min(cost);tourmin=gpool(idxz:);disp(num2str(increase)minmumtriplength=,num2str(costmin)costminold2=200000;costminoldl=150000;resultcoSt=100OOO;tourminold2=zeros(1,N);tourminoldl=zeros(IzN);resulttour=zeros(IzN);while(abs(costminold2-costminoldl);100)&(abs(costminoldl-costmin);100)&(increase;500)costminold2=costminoldl;tourminold2=tourminoldl;Costminol

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号