ga算法是模拟生物进化过程中,适者生存,优胜劣汰规则的一种算法,ga算子有选择,交叉,变异,个体对环境的适应度用适应度函数来衡量,每个个体对应一个适应度值,选择算子淘汰劣质个体,交叉和变异产生新个体,个体组成的种群不断进化,直到产生最优个体。
与普通智能算法不同的是ga算法从多个解开始搜索,对多个值同时进行评估,很少会陷入局部最优解,普通智能算法的缺点就是容易陷入局部最优解,例如粒子群算法,每次都只迭代更新一个个体,一旦陷入局部最小值,很难跳出
下面是matlab实现的ga算法
function testga() size=20; chromelen=8; lr=0.8; mr=0.1; pop=init(size,chromelen); pop2=binary2int(pop); gim=ones(500,8); for i=1:50 fitvalue=calfitvalue(pop); newpop=selection(pop,fitvalue); renewpop=crossover(newpop,lr); uppop=mutation(renewpop,mr); [bestindividual,bestfit]=best(uppop,fitvalue); gim(i,:)=bestindividual; y(i)=bestfit; pop=uppop; end ymax=find(y==max(y)); ymax=max(ymax); tt=gim(ymax,:); xmax=binary2int(tt)*2*pi/1023; plot(xmax,ymax,'r*'); hold on; fplot('11*sin(6*x)+7*cos(5*x)',[-pi,pi]); end function pop=init(size,chromelen) pop=round(rand(size,chromelen)); end function pop2=binary2int(pop) [px,py]=size(pop); for i=1:py pop1(:,i)=2.^(py-i).*pop(:,i); end pop2=sum(pop1,2); end function fitvalue=calfitvalue(pop) temp=binary2int(pop); x=temp*2*pi/1023; fitvalue=11*sin(6*x)+7*cos(5*x); end function newpop=selection(pop,fitvalue) sumfit=sum(fitvalue); profit=fitvalue/sumfit; cumpro=cumsum(profit); [px,py]=size(pop); randval=sort(rand(px,1)); newin=1; fitin=1; while newin<=px if randval(newin)<cumpro(fitin) newpop(newin,:)=pop(fitin,:); newin=newin+1; else fitin=fitin+1; end end end function renewpop=crossover(newpop,lr) [px,py]=size(newpop); renewpop=ones(size(newpop)); for i=1:2:px-1 if rand<lr c=round(rand*py); renewpop(i,:)=[newpop(i,1:c),newpop(i+1,c+1:py)]; renewpop(i+1,:)=[newpop(i+1,1:c),newpop(i,c+1:py)]; else renewpop(i,:)=newpop(i,:); renewpop(i+1,:)=newpop(i+1,:); end end end function uppop=mutation(renewpop,mr) [px,py]=size(renewpop); uppop=ones(size(renewpop)); for i=1:px if rand<mr c=round(rand*py); if c<=0 c=1; end uppop(i,:)=renewpop(i,:); if any(uppop(i,c))==0 uppop(i,c)=1; else uppop(i,c)=0; end else uppop(i,:)=renewpop(i,:); end end end function [bestindividual,bestfit]=best(uppop,fitvalue) bestindividual=uppop(1,:); bestfit=fitvalue(1); [px,py]=size(uppop); for i=2:px if bestfit<fitvalue(i) bestfit=fitvalue(i); bestindividual=uppop(i,:); end end end