1. 程式人生 > >應用遺傳演算法求函式最小值

應用遺傳演算法求函式最小值

1、遺傳演算法概論

       遺傳演算法(GA)可能是最早開發出來的模擬生物遺傳系統的演算法模型。它首先由Fraser提出,後來有Bremermann和Reed等人

 再次提出。最後,Holland對遺傳演算法做了大量工作並使之推廣,因此被認為是遺傳演算法的奠基人。遺傳演算法模擬了基因進化,在這

個模型中,個體的性狀通過基因型表達。選擇運算元(模擬適者生存)與交叉運算元(模擬繁殖),是遺傳演算法的主要驅動演算法。

2遺傳演算法的基本運算過程如下:

a)初始化:設定進化代數計數器t=0,設定最大進化代數T,隨機生成M個個體作為初始群體P(0)。 b)個體評價:計算群體P(t)中各個個體的
適應度
c)選擇運算將選擇運算元作用於群體。選擇的目的是把優化的個體直接遺傳到下一代或通過配對交叉產生新的個體再遺傳到下一代。選擇操作是建立在群體中個體的適應度評估基礎上的。 d)交叉運算:將交叉運算元作用於群體。遺傳演算法中起核心作用的就是交叉運算元。 e)變異運算:將變異運算元作用於群體。即是對群體中的個體串的某些基因座上的基因值作變動。 群體P(t)經過選擇、交叉、變異運算之後得到下一代群體P(t+1)。 f)終止條件判斷:若t=T,則以進化過程中所得到的具有最大適應度個體作為最優解輸出,終止計算。 3、應用遺傳演算法求解函式最小值

     使用的函式為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)]);

執行結果如下: