遺傳算法matlab代碼
2008-02-11 16:13
function youhuafun
D=code; N=50; % Tunable maxgen=50; % Tunable crossrate=0.5; %Tunable muterate=0.08; %Tunable generation=1; num = length(D); fatherrand=randint(num,N,3); score = zeros(maxgen,N); while generation<=maxgen ind=randperm(N-2)+2; % 隨機配對交叉 A=fatherrand(:,ind(1:(N-2)/2)); B=fatherrand(:,ind((N-2)/2+1:end)); % 多點交叉 rnd=rand(num,(N-2)/2); ind=rnd tmp=A(ind); A(ind)=B(ind); B(ind)=tmp;
% % 兩點交叉 % for kk=1:(N-2)/2 % rndtmp=randint(1,1,num)+1; % tmp=A(1:rndtmp,kk); % A(1:rndtmp,kk)=B(1:rndtmp,kk); % B(1:rndtmp,kk)=tmp; % end fatherrand=[fatherrand(:,1:2),A,B]; % 變異 rnd=rand(num,N); ind=rnd [m,n]=size(ind); tmp=randint(m,n,2)+1; tmp(:,1:2)=0; fatherrand=tmp+fatherrand; fatherrand=mod(fatherrand,3); % fatherrand(ind)=tmp; %評價、選擇 scoreN=scorefun(fatherrand,D);% 求得N個個體的評價函數(shù) score(generation,:)=scoreN; [scoreSort,scoreind]=sort(scoreN); sumscore=cumsum(scoreSort); sumscore=sumscore./sumscore(end); childind(1:2)=scoreind(end-1:end); for k=3:N tmprnd=rand; tmpind=tmprnd difind=[0,diff(tmpind)]; if ~any(difind) difind(1)=1; end childind(k)=scoreind(logical(difind)); end fatherrand=fatherrand(:,childind); generation=generation+1; end % score maxV=max(score,[],2); minV=11*300-maxV; plot(minV,‘*‘);title(‘各代的目標函數(shù)值‘); F4=D(:,4); FF4=F4-fatherrand(:,1); FF4=max(FF4,1); D(:,5)=FF4; save DData D
function D=code load youhua.mat % properties F2 and F3 F1=A(:,1); F2=A(:,2); F3=A(:,3); if (max(F2)>1450)||(min(F2)<=900) error(‘DATA property F2 exceed it‘‘s range (900,1450]‘) end % get group property F1 of data, according to F2 value F4=zeros(size(F1)); for ite=11:-1:1 index=find(F2<=900+ite*50); F4(index)=ite; end D=[F1,F2,F3,F4];
function ScoreN=scorefun(fatherrand,D) F3=D(:,3); F4=D(:,4); N=size(fatherrand,2); FF4=F4*ones(1,N); FF4rnd=FF4-fatherrand; FF4rnd=max(FF4rnd,1); ScoreN=ones(1,N)*300*11; % 這里有待優(yōu)化 for k=1:N FF4k=FF4rnd(:,k); for ite=1:11 F0index=find(FF4k==ite); if ~isempty(F0index) tmpMat=F3(F0index); tmpSco=sum(tmpMat); ScoreBin(ite)=mod(tmpSco,300); end end Scorek(k)=sum(ScoreBin); end ScoreN=ScoreN-Scorek;
|
遺傳算法程序 matlab
2006年12月09日 星期六 20:53
遺傳算法程序
本程序收集于網(wǎng)絡,本人并未進行過運行,如有問題請與作者聯(lián)系,如有侵權請告之
遺傳算法程序: 說明: fga.m 為遺傳算法的主程序; 采用二進制Gray編碼,采用基于輪盤賭法的非線性排名選擇, 均勻交叉,變異操作,而且還引入了倒位操作!
function [BestPop,Trace]=fga(FUN,LB,UB,eranum,popsize,pCross,pMutation,pInversion,options) % [BestPop,Trace]=fmaxga(FUN,LB,UB,eranum,popsize,pcross,pmutation) % Finds a maximum of a function of several variables. % fmaxga solves problems of the form: % max F(X) subject to: LB <= X <= UB % BestPop - 最優(yōu)的群體即為最優(yōu)的染色體群 % Trace - 最佳染色體所對應的目標函數(shù)值 % FUN - 目標函數(shù) % LB - 自變量下限 % UB - 自變量上限 % eranum - 種群的代數(shù),取100--1000(默認200) % popsize - 每一代種群的規(guī)模;此可取50--200(默認100) % pcross - 交叉概率,一般取0.5--0.85之間較好(默認0.8) % pmutation - 初始變異概率,一般取0.05-0.2之間較好(默認0.1) % pInversion - 倒位概率,一般取0.05-0.3之間較好(默認0.2) % options - 1*2矩陣,options(1)=0二進制編碼(默認0),option(1)~=0十進制編 %碼,option(2)設定求解精度(默認1e-4) % % ------------------------------------------------------------------------
T1=clock; if nargin<3, error(‘FMAXGA requires at least three input arguments‘); end if nargin==3, eranum=200;popsize=100;pCross=0.8;pMutation=0.1;pInversion=0.15;options=[0 1e-4];end if nargin==4, popsize=100;pCross=0.8;pMutation=0.1;pInversion=0.15;options=[0 1e-4];end if nargin==5, pCross=0.8;pMutation=0.1;pInversion=0.15;options=[0 1e-4];end if nargin==6, pMutation=0.1;pInversion=0.15;options=[0 1e-4];end if nargin==7, pInversion=0.15;options=[0 1e-4];end if find((LB-UB)>0) error(‘數(shù)據(jù)輸入錯誤,請重新輸入(LB<UB):‘); end s=sprintf(‘程序運行需要約%.4f 秒鐘時間,請稍等......‘,(eranum*popsize/1000)); disp(s);
global m n NewPop children1 children2 VarNum
bounds=[LB;UB]‘;bits=[];VarNum=size(bounds,1); precision=options(2);%由求解精度確定二進制編碼長度 bits=ceil(log2((bounds(:,2)-bounds(:,1))‘ ./ precision));%由設定精度劃分區(qū)間 [Pop]=InitPopGray(popsize,bits);%初始化種群 [m,n]=size(Pop); NewPop=zeros(m,n); children1=zeros(1,n); children2=zeros(1,n); pm0=pMutation; BestPop=zeros(eranum,n);%分配初始解空間BestPop,Trace Trace=zeros(eranum,length(bits)+1); i=1; while i<=eranum for j=1:m value(j)=feval(FUN(1,:),(b2f(Pop(j,:),bounds,bits)));%計算適應度 end [MaxValue,Index]=max(value); BestPop(i,:)=Pop(Index,:); Trace(i,1)=MaxValue; Trace(i,(2:length(bits)+1))=b2f(BestPop(i,:),bounds,bits); [selectpop]=NonlinearRankSelect(FUN,Pop,bounds,bits);%非線性排名選擇 [CrossOverPop]=CrossOver(selectpop,pCross,round(unidrnd(eranum-i)/eranum)); %采用多點交叉和均勻交叉,且逐步增大均勻交叉的概率 %round(unidrnd(eranum-i)/eranum) [MutationPop]=Mutation(CrossOverPop,pMutation,VarNum);%變異 [InversionPop]=Inversion(MutationPop,pInversion);%倒位 Pop=InversionPop;%更新 pMutation=pm0+(i^4)*(pCross/3-pm0)/(eranum^4); %隨著種群向前進化,逐步增大變異率至1/2交叉率 p(i)=pMutation; i=i+1; end t=1:eranum; plot(t,Trace(:,1)‘); title(‘函數(shù)優(yōu)化的遺傳算法‘);xlabel(‘進化世代數(shù)(eranum)‘);ylabel(‘每一代最優(yōu)適應度(maxfitness)‘); [MaxFval,I]=max(Trace(:,1)); X=Trace(I,(2:length(bits)+1)); hold on; plot(I,MaxFval,‘*‘); text(I+5,MaxFval,[‘FMAX=‘ num2str(MaxFval)]); str1=sprintf(‘進化到 %d 代 ,自變量為 %s 時,得本次求解的最優(yōu)值 %f\n對應染色體是:%s‘,I,num2str(X),MaxFval,num2str(BestPop(I,:))); disp(str1); %figure(2);plot(t,p);%繪制變異值增大過程 T2=clock; elapsed_time=T2-T1; if elapsed_time(6)<0 elapsed_time(6)=elapsed_time(6)+60; elapsed_time(5)=elapsed_time(5)-1; end if elapsed_time(5)<0 elapsed_time(5)=elapsed_time(5)+60;elapsed_time(4)=elapsed_time(4)-1; end %像這種程序當然不考慮運行上小時啦 str2=sprintf(‘程序運行耗時 %d 小時 %d 分鐘 %.4f 秒‘,elapsed_time(4),elapsed_time(5),elapsed_time(6)); disp(str2);
%初始化種群 %采用二進制Gray編碼,其目的是為了克服二進制編碼的Hamming懸崖缺點 function [initpop]=InitPopGray(popsize,bits) len=sum(bits); initpop=zeros(popsize,len);%The whole zero encoding individual for i=2:popsize-1 pop=round(rand(1,len)); pop=mod(([0 pop]+[pop 0]),2); %i=1時,b(1)=a(1);i>1時,b(i)=mod(a(i-1)+a(i),2) %其中原二進制串:a(1)a(2)...a(n),Gray串:b(1)b(2)...b(n) initpop(i,:)=pop(1:end-1); end initpop(popsize,:)=ones(1,len);%The whole one encoding individual
%解碼
function [fval] = b2f(bval,bounds,bits) % fval - 表征各變量的十進制數(shù) % bval - 表征各變量的二進制編碼串 % bounds - 各變量的取值范圍 % bits - 各變量的二進制編碼長度 scale=(bounds(:,2)-bounds(:,1))‘./(2.^bits-1); %The range of the variables numV=size(bounds,1); cs=[0 cumsum(bits)]; for i=1:numV a=bval((cs(i)+1):cs(i+1)); fval(i)=sum(2.^(size(a,2)-1:-1:0).*a)*scale(i)+bounds(i,1); end
%選擇操作 %采用基于輪盤賭法的非線性排名選擇 %各個體成員按適應值從大到小分配選擇概率: %P(i)=(q/1-(1-q)^n)*(1-q)^i, 其中 P(0)>P(1)>...>P(n), sum(P(i))=1
function [selectpop]=NonlinearRankSelect(FUN,pop,bounds,bits) global m n selectpop=zeros(m,n); fit=zeros(m,1); for i=1:m fit(i)=feval(FUN(1,:),(b2f(pop(i,:),bounds,bits)));%以函數(shù)值為適應值做排名依據(jù) end selectprob=fit/sum(fit);%計算各個體相對適應度(0,1) q=max(selectprob);%選擇最優(yōu)的概率 x=zeros(m,2); x(:,1)=[m:-1:1]‘; [y x(:,2)]=sort(selectprob); r=q/(1-(1-q)^m);%標準分布基值 newfit(x(:,2))=r*(1-q).^(x(:,1)-1);%生成選擇概率 newfit=cumsum(newfit);%計算各選擇概率之和 rNums=sort(rand(m,1)); fitIn=1;newIn=1; while newIn<=m if rNums(newIn)<newfit(fitIn) selectpop(newIn,:)=pop(fitIn,:); newIn=newIn+1; else fitIn=fitIn+1; end end
%交叉操作 function [NewPop]=CrossOver(OldPop,pCross,opts) %OldPop為父代種群,pcross為交叉概率 global m n NewPop r=rand(1,m); y1=find(r<pCross); y2=find(r>=pCross); len=length(y1); if len>2&mod(len,2)==1%如果用來進行交叉的染色體的條數(shù)為奇數(shù),將其調整為偶數(shù) y2(length(y2)+1)=y1(len); y1(len)=[]; end if length(y1)>=2 for i=0:2:length(y1)-2 if opts==0 [NewPop(y1(i+1),:),NewPop(y1(i+2),:)]=EqualCrossOver(OldPop(y1(i+1),:),OldPop(y1(i+2),:)); else [NewPop(y1(i+1),:),NewPop(y1(i+2),:)]=MultiPointCross(OldPop(y1(i+1),:),OldPop(y1(i+2),:)); end end end NewPop(y2,:)=OldPop(y2,:);
%采用均勻交叉 function [children1,children2]=EqualCrossOver(parent1,parent2)
global n children1 children2 hidecode=round(rand(1,n));%隨機生成掩碼 crossposition=find(hidecode==1); holdposition=find(hidecode==0); children1(crossposition)=parent1(crossposition);%掩碼為1,父1為子1提供基因 children1(holdposition)=parent2(holdposition);%掩碼為0,父2為子1提供基因 children2(crossposition)=parent2(crossposition);%掩碼為1,父2為子2提供基因 children2(holdposition)=parent1(holdposition);%掩碼為0,父1為子2提供基因
%采用多點交叉,交叉點數(shù)由變量數(shù)決定
function [Children1,Children2]=MultiPointCross(Parent1,Parent2)
global n Children1 Children2 VarNum Children1=Parent1; Children2=Parent2; Points=sort(unidrnd(n,1,2*VarNum)); for i=1:VarNum Children1(Points(2*i-1):Points(2*i))=Parent2(Points(2*i-1):Points(2*i)); Children2(Points(2*i-1):Points(2*i))=Parent1(Points(2*i-1):Points(2*i)); end
%變異操作 function [NewPop]=Mutation(OldPop,pMutation,VarNum)
global m n NewPop r=rand(1,m); position=find(r<=pMutation); len=length(position); if len>=1 for i=1:len k=unidrnd(n,1,VarNum); %設置變異點數(shù),一般設置1點 for j=1:length(k) if OldPop(position(i),k(j))==1 OldPop(position(i),k(j))=0; else OldPop(position(i),k(j))=1; end end end end NewPop=OldPop;
%倒位操作
function [NewPop]=Inversion(OldPop,pInversion)
global m n NewPop NewPop=OldPop; r=rand(1,m); PopIn=find(r<=pInversion); len=length(PopIn); if len>=1 for i=1:len d=sort(unidrnd(n,1,2)); if d(1)~=1&d(2)~=n NewPop(PopIn(i),1:d(1)-1)=OldPop(PopIn(i),1:d(1)-1); NewPop(PopIn(i),d(1):d(2))=OldPop(PopIn(i),d(2):-1:d(1)); NewPop(PopIn(i),d(2)+1:n)=OldPop(PopIn(i),d(2)+1:n); end end end
|
用遺傳算法優(yōu)化BP神經(jīng)網(wǎng)絡的Matlab編程實例
2007/04/28 23:09
此文章首次在simwe公開發(fā)表,屬于GreenSim團隊原創(chuàng)作品,轉載請注明! 由于BP網(wǎng)絡的權值優(yōu)化是一個無約束優(yōu)化問題,而且權值要采用實數(shù)編碼,所以直接利用Matlab遺傳算法工具箱。以下貼出的代碼是為一個19輸入變量,1個輸出變量情況下的非線性回歸而設計的,如果要應用于其它情況,只需改動編解碼函數(shù)即可。
程序一:GA訓練BP權值的主函數(shù) function net=GABPNET(XX,YY) %-------------------------------------------------------------------------- % GABPNET.m % 使用遺傳算法對BP網(wǎng)絡權值閾值進行優(yōu)化,再用BP算法訓練網(wǎng)絡 %-------------------------------------------------------------------------- %數(shù)據(jù)歸一化預處理 nntwarn off XX=premnmx(XX); YY=premnmx(YY); %創(chuàng)建網(wǎng)絡 net=newff(minmax(XX),[19,25,1],{‘tansig‘,‘tansig‘,‘purelin‘},‘trainlm‘); %下面使用遺傳算法對網(wǎng)絡進行優(yōu)化 P=XX; T=YY; R=size(P,1); S2=size(T,1); S1=25;%隱含層節(jié)點數(shù) S=R*S1+S1*S2+S1+S2;%遺傳算法編碼長度 aa=ones(S,1)*[-1,1]; popu=50;%種群規(guī)模 initPpp=initializega(popu,aa,‘gabpEval‘);%初始化種群 gen=100;%遺傳代數(shù) %下面調用gaot工具箱,其中目標函數(shù)定義為gabpEval [x,endPop,bPop,trace]=ga(aa,‘gabpEval‘,[],initPpp,[1e-6 1 1],‘maxGenTerm‘,gen,... ‘normGeomSelect‘,[0.09],[‘arithXover‘],[2],‘nonUnifMutation‘,[2 gen 3]); %繪收斂曲線圖 figure(1) plot(trace(:,1),1./trace(:,3),‘r-‘); hold on plot(trace(:,1),1./trace(:,2),‘b-‘); xlabel(‘Generation‘); ylabel(‘Sum-Squared Error‘); figure(2) plot(trace(:,1),trace(:,3),‘r-‘); hold on plot(trace(:,1),trace(:,2),‘b-‘); xlabel(‘Generation‘); ylabel(‘Fittness‘); %下面將初步得到的權值矩陣賦給尚未開始訓練的BP網(wǎng)絡 [W1,B1,W2,B2,P,T,A1,A2,SE,val]=gadecod(x); net.LW{2,1}=W1; net.LW{3,2}=W2; net.b{2,1}=B1; net.b{3,1}=B2; XX=P; YY=T; %設置訓練參數(shù) net.trainParam.show=1; net.trainParam.lr=1; net.trainParam.epochs=50; net.trainParam.goal=0.001; %訓練網(wǎng)絡 net=train(net,XX,YY);
程序二:適應值函數(shù) function [sol, val] = gabpEval(sol,options) % val - the fittness of this individual % sol - the individual, returned to allow for Lamarckian evolution % options - [current_generation] load data2 nntwarn off XX=premnmx(XX); YY=premnmx(YY); P=XX; T=YY; R=size(P,1); S2=size(T,1); S1=25;%隱含層節(jié)點數(shù) S=R*S1+S1*S2+S1+S2;%遺傳算法編碼長度 for i=1:S, x(i)=sol(i); end; [W1, B1, W2, B2, P, T, A1, A2, SE, val]=gadecod(x);
程序三:編解碼函數(shù) function [W1, B1, W2, B2, P, T, A1, A2, SE, val]=gadecod(x) load data2 nntwarn off XX=premnmx(XX); YY=premnmx(YY); P=XX; T=YY; R=size(P,1); S2=size(T,1); S1=25;%隱含層節(jié)點數(shù) S=R*S1+S1*S2+S1+S2;%遺傳算法編碼長度 % 前R*S1個編碼為W1 for i=1:S1, for k=1:R, W1(i,k)=x(R*(i-1)+k); end end % 接著的S1*S2個編碼(即第R*S1個后的編碼)為W2 for i=1:S2, for k=1:S1, W2(i,k)=x(S1*(i-1)+k+R*S1); end end % 接著的S1個編碼(即第R*S1+S1*S2個后的編碼)為B1 for i=1:S1, B1(i,1)=x((R*S1+S1*S2)+i); end % 接著的S2個編碼(即第R*S1+S1*S2+S1個后的編碼)為B2 for i=1:S2, B2(i,1)=x((R*S1+S1*S2+S1)+i); end % 計算S1與S2層的輸出 A1=tansig(W1*P,B1); A2=purelin(W2*A1,B2); % 計算誤差平方和 SE=sumsqr(T-A2); val=1/SE; % 遺傳算法的適應值
|
matlab遺傳算法工具箱函數(shù)及實例講解(轉引)
2007-08-16 19:44
核心函數(shù): (1)function [pop]=initializega(num,bounds,eevalFN,eevalOps,options)--初始種群的生成函數(shù) 【輸出參數(shù)】 pop--生成的初始種群 【輸入?yún)?shù)】 num--種群中的個體數(shù)目 bounds--代表變量的上下界的矩陣 eevalFN--適應度函數(shù) eevalOps--傳遞給適應度函數(shù)的參數(shù) options--選擇編碼形式(浮點編碼或是二進制編碼)[precision F_or_B],如 precision--變量進行二進制編碼時指定的精度 F_or_B--為1時選擇浮點編碼,否則為二進制編碼,由precision指定精度)
(2)function [x,endPop,bPop,traceInfo] = ga(bounds,evalFN,evalOps,startPop,opts,... termFN,termOps,selectFN,selectOps,xOverFNs,xOverOps,mutFNs,mutOps)--遺傳算法函數(shù) 【輸出參數(shù)】 x--求得的最優(yōu)解 endPop--最終得到的種群 bPop--最優(yōu)種群的一個搜索軌跡 【輸入?yún)?shù)】 bounds--代表變量上下界的矩陣 evalFN--適應度函數(shù) evalOps--傳遞給適應度函數(shù)的參數(shù) startPop-初始種群 opts[epsilon prob_ops display]--opts(1:2)等同于initializega的options參數(shù),第三個參數(shù)控制是否輸出,一般為0。如[1e-6 1 0] termFN--終止函數(shù)的名稱,如[‘maxGenTerm‘] termOps--傳遞個終止函數(shù)的參數(shù),如[100] selectFN--選擇函數(shù)的名稱,如[‘normGeomSelect‘] selectOps--傳遞個選擇函數(shù)的參數(shù),如[0.08] xOverFNs--交叉函數(shù)名稱表,以空格分開,如[‘arithXover heuristicXover simpleXover‘] xOverOps--傳遞給交叉函數(shù)的參數(shù)表,如[2 0;2 3;2 0] mutFNs--變異函數(shù)表,如[‘boundaryMutation multiNonUnifMutation nonUnifMutation unifMutation‘] mutOps--傳遞給交叉函數(shù)的參數(shù)表,如[4 0 0;6 100 3;4 100 3;4 0 0]
注意】matlab工具箱函數(shù)必須放在工作目錄下 【問題】求f(x)=x+10*sin(5x)+7*cos(4x)的最大值,其中0<=x<=9 【分析】選擇二進制編碼,種群中的個體數(shù)目為10,二進制編碼長度為20,交叉概率為0.95,變異概率為0.08 【程序清單】 %編寫目標函數(shù) function[sol,eval]=fitness(sol,options) x=sol(1); eval=x+10*sin(5*x)+7*cos(4*x); %把上述函數(shù)存儲為fitness.m文件并放在工作目錄下
initPop=initializega(10,[0 9],‘fitness‘);%生成初始種群,大小為10 [x endPop,bPop,trace]=ga([0 9],‘fitness‘,[],initPop,[1e-6 1 1],‘maxGenTerm‘,25,‘normGeomSelect‘,... [0.08],[‘arithXover‘],[2],‘nonUnifMutation‘,[2 25 3]) %25次遺傳迭代
運算借過為:x = 7.8562 24.8553(當x為7.8562時,f(x)取最大值24.8553)
注:遺傳算法一般用來取得近似最優(yōu)解,而不是最優(yōu)解。
遺傳算法實例2
【問題】在-5<=Xi<=5,i=1,2區(qū)間內,求解 f(x1,x2)=-20*exp(-0.2*sqrt(0.5*(x1.^2+x2.^2)))-exp(0.5*(cos(2*pi*x1)+cos(2*pi*x2)))+22.71282的最小值。 【分析】種群大小10,最大代數(shù)1000,變異率0.1,交叉率0.3 【程序清單】 %源函數(shù)的matlab代碼 function [eval]=f(sol) numv=size(sol,2); x=sol(1:numv); eval=-20*exp(-0.2*sqrt(sum(x.^2)/numv)))-exp(sum(cos(2*pi*x))/numv)+22.71282; %適應度函數(shù)的matlab代碼 function [sol,eval]=fitness(sol,options) numv=size(sol,2)-1; x=sol(1:numv); eval=f(x); eval=-eval; %遺傳算法的matlab代碼 bounds=ones(2,1)*[-5 5]; [p,endPop,bestSols,trace]=ga(bounds,‘fitness‘)
注:前兩個文件存儲為m文件并放在工作目錄下,運行結果為 p = 0.0000 -0.0000 0.0055
大家可以直接繪出f(x)的圖形來大概看看f(x)的最值是多少,也可是使用優(yōu)化函數(shù)來驗證。matlab命令行執(zhí)行命令: fplot(‘x+10*sin(5*x)+7*cos(4*x)‘,[0,9])
evalops是傳遞給適應度函數(shù)的參數(shù),opts是二進制編碼的精度,termops是選擇maxGenTerm結束函數(shù)時傳遞個maxGenTerm的參數(shù),即遺傳代數(shù)。xoverops是傳遞給交叉函數(shù)的參數(shù)。mutops是傳遞給變異函數(shù)的參數(shù)。
|
一個動態(tài)遺傳算法代碼 matlab的
2008-03-19 17:11
%IAGA function best=ga clear MAX_gen=200; %最大迭代步數(shù) best.max_f=0; %當前最大的適應度 STOP_f=14.5; %停止循環(huán)的適應度 RANGE=[0 255]; %初始取值范圍[0 255] SPEEDUP_INTER=5; %進入加速迭代的間隔 advance_k=0; %優(yōu)化的次數(shù)
popus=init; %初始化 for gen=1:MAX_gen fitness=fit(popus,RANGE); %求適應度 f=fitness.f; picked=choose(popus,fitness); %選擇 popus=intercross(popus,picked); %雜交 popus=aberrance(popus,picked); %變異 if max(f)>best.max_f advance_k=advance_k+1; x_better(advance_k)=fitness.x; best.max_f=max(f); best.popus=popus; best.x=fitness.x; end if mod(advance_k,SPEEDUP_INTER)==0 RANGE=minmax(x_better); RANGE advance=0; end end return; function popus=init%初始化 M=50;%種群個體數(shù)目 N=30;%編碼長度 popus=round(rand(M,N)); return;
function fitness=fit(popus,RANGE)%求適應度 [M,N]=size(popus); fitness=zeros(M,1);%適應度 f=zeros(M,1);%函數(shù)值 A=RANGE(1);B=RANGE(2);%初始取值范圍[0 255]
for m=1:M x=0; for n=1:N x=x+popus(m,n)*(2^(n-1)); end x=x*((B-A)/(2^N))+A; for k=1:5 f(m,1)=f(m,1)-(k*sin((k+1)*x+k)); end end f_std=(f-min(f))./(max(f)-min(f));%函數(shù)值標準化 fitness.f=f;fitness.f_std=f_std;fitness.x=x; return;
function picked=choose(popus,fitness)%選擇 f=fitness.f;f_std=fitness.f_std; [M,N]=size(popus); choose_N=3; %選擇choose_N對雙親 picked=zeros(choose_N,2); %記錄選擇好的雙親 p=zeros(M,1); %選擇概率 d_order=zeros(M,1);
%把父代個體按適應度從大到小排序 f_t=sort(f,‘descend‘);%將適應度按降序排列 for k=1:M x=find(f==f_t(k));%降序排列的個體序號 d_order(k)=x(1); end for m=1:M popus_t(m,:)=popus(d_order(m),:); end popus=popus_t; f=f_t;
p=f_std./sum(f_std); %選擇概率 c_p=cumsum(p)‘; %累積概率
for cn=1:choose_N picked(cn,1)=roulette(c_p); %輪盤賭 picked(cn,2)=roulette(c_p); %輪盤賭 popus=intercross(popus,picked(cn,:));%雜交 end popus=aberrance(popus,picked);%變異 return;
function popus=intercross(popus,picked) %雜交 [M_p,N_p]=size(picked); [M,N]=size(popus); for cn=1:M_p p(1)=ceil(rand*N);%生成雜交位置 p(2)=ceil(rand*N); p=sort(p); t=popus(picked(cn,1),p(1):p(2)); popus(picked(cn,1),p(1):p(2))=popus(picked(cn,2),p(1):p(2)); popus(picked(cn,2),p(1):p(2))=t; end return; function popus=aberrance(popus,picked) %變異 P_a=0.05;%變異概率 [M,N]=size(popus); [M_p,N_p]=size(picked); U=rand(1,2);
for kp=1:M_p if U(2)>=P_a %如果大于變異概率,就不變異 continue; end if U(1)>=0.5 a=picked(kp,1); else a=picked(kp,2); end p(1)=ceil(rand*N);%生成變異位置 p(2)=ceil(rand*N); if popus(a,p(1))==1%0 1變換 popus(a,p(1))=0; else popus(a,p(1))=1; end if popus(a,p(2))==1 popus(a,p(2))=0; else popus(a,p(2))=1; end end return;
function picked=roulette(c_p) %輪盤賭 [M,N]=size(c_p); M=max([M N]); U=rand; if U<c_p(1) picked=1; return; end for m=1:(M-1) if U>c_p(m) & U<c_p(m+1) picked=m+1; break; end end
全方位的兩點雜交、兩點變異的改進的加速遺傳算法(IAGA)
|
|