應用遺傳演算法求函式最小值
阿新 • • 發佈:2019-02-11
1、遺傳演算法概論
遺傳演算法(GA)可能是最早開發出來的模擬生物遺傳系統的演算法模型。它首先由Fraser提出,後來有Bremermann和Reed等人
再次提出。最後,Holland對遺傳演算法做了大量工作並使之推廣,因此被認為是遺傳演算法的奠基人。遺傳演算法模擬了基因進化,在這
個模型中,個體的性狀通過基因型表達。選擇運算元(模擬適者生存)與交叉運算元(模擬繁殖),是遺傳演算法的主要驅動演算法。
2、遺傳演算法的基本運算過程如下:
a)初始化:設定進化代數計數器t=0,設定最大進化代數T,隨機生成M個個體作為初始群體P(0)。 b)個體評價:計算群體P(t)中各個個體的使用的函式為f(x)=7*sin(6*x)+6*cos(5*x),x∈[0,2*pi]
遺傳演算法的MATLAB實現如下:
L=16; %編碼長度,即用16位二進位制表示 N=32; %種群數目 M=48; %M>=N,M箇中間體,運用運算元選擇出M/2對母體,進行交叉;對M箇中間體進行變異 T=100; %最大繁殖代數 Pc=0.8; %交叉概率 Pm=0.03; %變異概率 x1=zeros(1,N); x2=zeros(1,N); x4=zeros(1,N); %grayCode=zeros(1,N)'; grayCode=cell(N,1); grayCodeNew=cell(N,1); for i=1:1:N %初始化種群N x1(1,i)=rand()*2*pi; x2(1,i)=uint16(x1(1,i)/(2*pi)*65535); %grayCode(i,:)=num2gray(x2(1,i),L); grayCode{i}=num2gray(x2(1,i),L); end %=========進化,開始進行遺傳運算元操作 for t=1:1:T y1=7*sin(6*x1)+6*cos(5*x1); for i=1:1:M/2 [~,b]=min(y1); %grayCodeNew(i,:)=grayCode(b,:); grayCodeNew{i}=grayCode{b}; %grayCodeNew(i+M/2,:)=grayCode(b,:); grayCodeNew{i+M/2}=grayCode{b}; y1(1,b)=inf; end for i=1:1:M/2 p=unidrnd(L); if rand()< Pc %rand()產生一個隨機數 for j=p:1:L temp=grayCodeNew{i}(j); grayCodeNew{i}(j)=grayCodeNew{M-i+1}(j); grayCodeNew{M-i+1}(j)=temp; end end end %將全部染色體按概率進行變異 for i=1:1:M for j=1:1:L if rand()< Pm grayCodeNew{i}(j)=dec2bin(1-bin2dec(grayCodeNew{i}(j))); end end end for i=1:1:M %x4(1,i)=gray2num(grayCodeNew(i,:)); x4(1,i)=gray2num(grayCodeNew{i}); end x3=double(x4)*2*pi/65535; y3=11*sin(6*x3)+7*cos(5*x3); for i=1:1:N %更新種群 %[a,b]=min(y3); [~,b]=min(y3); x1(1,i)=x3(1,b); %grayCode(i,:)=grayCodeNew(b,:); grayCode{i}=grayCodeNew{b}; y3(1,b)=inf; end end %經過第T代後,由x1計算出y1,找出最小者 %x1 y1=11*sin(6*x1)+7*cos(5*x1); [a,b]=min(y1); x0=x1(1,b); y0=a; disp(['x0=',num2str(x0)]); disp(['y0=',num2str(y0)]);
執行結果如下: