matlab實現基於遺傳演算法求解二元函式的最大值

2021-09-14 05:18:25 字數 3210 閱讀 9684

(1) 個體編碼

遺傳演算法的運算物件是表示個體的符號串,所以必須把變數 x1, x2 編碼為一種

符號串。本題中,用無符號二進位制整數來表示。

因 x1, x2 為 0 ~ 7之間的整數,所以分別用3位無符號二進位制整數來表示,將它

們連線在一起所組成的6位無符號二進位制數就形成了個體的基因型,表示乙個可

行解。例如,基因型 x=101110 所對應的表現型是:x=[ 5,6 ]。

個體的表現型x和基因型x之間可通過編碼和解碼程式相互轉換。

(2) 初始群體的產生

遺傳演算法是對群體進行的進化操作,需要給其淮備一些表示起始搜尋點的初始

群體資料。

本例中,群體規模的大小取為4,即群體由4個個體組成,每個個體可通過隨機

方法產生。

如:011101,101011,011100,111001

(3) 適應度汁算

遺傳演算法中以個體適應度的大小來評定各個個體的優劣程度,從而決定其遺傳

機會的大小。

本例中,目標函式總取非負值,並且是以求函式最大值為優化目標,故可直接

利用目標函式值作為個體的適應度。

(4)  選擇運算

選擇運算(或稱為複製運算)把當前群體中適應度較高的個體按某種規則或模型遺傳到下一代群體中。一般要求適應度較高的個體將有更多的機會遺傳到下一代

群體中。                   

本例中,我們採用與適應度成正比的概率來確定各個個體複製到下一代群體中

的數量。其具體操作過程是:

•  先計算出群體中所有個體的適應度的總和 ;

•  其次計算出每個個體的相對適應度的大小,它即為每個個體被遺傳到下一代群體中的概率,

•  每個概率值組成乙個區域,全部概率值之和為1;

•  最後再產生乙個0到1之間的隨機數,依據該隨機數出現在上述哪乙個概率域內來確定各個個體被選中的次數。

(5)  交叉運算

交叉運算是遺傳演算法中產生新個體的主要操作過程,它以某一概率相互交換某

兩個個體之間的部分染色體。

本例採用單點交叉的方法,其具體操作過程是:

• 先對群體進行隨機配對;

• 其次隨機設定交叉點位置;

• 最後再相互交換配對染色體之間的部分基因。

(6)  變異運算

變異運算是對個體的某乙個或某一些基因座上的基因值按某一較小的概率進

行改變,它也是產生新個體的一種操作方法。

本例中,我們採用基本位變異的方法來進行變異運算,其具體操作過程是:

• 首先確定出各個個體的基因變異位置,下表所示為隨機產生的變異點位置,

其中的數字表示變異點設定在該基因座處;

• 然後依照某一概率將變異點的原有基因值取反。

對群體p(t)進行一輪選擇、交叉、變異運算之後可得到新一代的群體p(t+1)。

從上表中可以看出,群體經過一代進化之後,其適應度的最大值、平均值都得

到了明顯的改進。事實上,這裡已經找到了最佳個體「111111」。       

[注意]      

需要說明的是,表中有些欄的資料是隨機產生的。這裡為了更好地說明問題,

我們特意選擇了一些較好的數值以便能夠得到較好的結果,而在實際運算過程中

有可能需要一定的迴圈次數才能達到這個最優結果。

clc;

clear all;

format long; %設定資料顯示格式

%初始化引數

t=10; %**代數

n=4; %群體規模

pm=0.05;

pc=0.8; % 交叉變異概率

umax=7;

umin=1; %引數取值範圍

l=3; %單個引數字串長度,總編碼長度2l

bval=round(rand(n,2*l)); %初始種群

bestv=-inf; %最優適應度初值

%迭代開始

for ii=1:t

%解碼,計算適應度

for i=1:n

y1=0;y2=0;

for j=1:1:l

y1=y1+bval(i,l-j+1)*2^(j-1);

endx1=(umax-umin)*y1/(2^l-1)+umin;

for j=1:1:l

y2=y2+bval(i,2*l-j+1)*2^(j-1);

endx2=(umax-umin)*y2/(2^l-1)+umin;

obj(i)=x1.^2+x2.^2; %目標函式

xx(i,:)=[x1,x2];

endfunc=obj; %目標函式轉換為適應度函式

p=func./sum(func);

q=cumsum(p); % 累加

[fmax,indmax]=max(func); %求當代最佳個體

if fmax>=bestv

bestv=fmax; %到目前為止最優適應度值

bvalxx=bval(indmax,:); %到目前為止最佳位串

optxx=xx(indmax,:);% 到目前為止最優引數

endbfit1(ii)=bestv; %儲存每代的最優適應度

%遺傳操作開始

%輪盤賭選擇

for i=1:(n-1)

r=rand;

tmp=find(r<=q);

newbval(i,:)=bval(tmp(1),:);

endnewbval(n,:)=bvalxx; %最優保留

bval=newbval;

%單點交叉

for i=1:2:(n-1)

cc=rand;

if ccpoint=ceil(rand*(2*l-1)); %取得乙個1到2l-1的整數

ch=bval(i,:);

bval(i,point+1:2*l)=bval(i+1,point+1:2*l);

bval(i+1,point+1:2*l)=ch(1,point+1:2*l);

endendbval(n,:)=bvalxx; %最優保留

%位點變異

mm=rand(n,2*l)mm(n,:)=zeros(1,2*l); %最後一行不變異,強制賦0

bval(mm)=1-bval(mm);

end%輸出

plot(bfit1);

bestv %輸出最優適應度值

optxx %輸出最優引數

遺傳演算法的matlab實現

遺傳演算法是一種全域性最優化演算法,是運用了演化論優勝劣汰原理的隨機化搜尋方法。前些日子,在進行畢業設計的相關研究中,我接觸到了遺傳演算法,用其對乙個五元非線性函式進行最優化搜尋。平台使用的是matlab,主要使用的是謝菲爾德大學的matlab遺傳演算法工具箱。具體程式如下 clc clear al...

遺傳演算法(GA)的matlab實現

一 task 二 實現過程 1.編碼與解碼 編碼 在編碼之前需要確定求解的精度,設定求解的精度為小數點後六位,即10 6。這樣可以將每個自變數x的解空間劃分為 1 0 10 6 1000000個等分。使n滿足 1 0 10 6 2 n 1,這裡n表示使上式成立的最小整數,即表示自變數x的基因串的長度...

遺傳演算法及matlab簡單實現

遺傳演算法的實現 遺傳演算法的一次迭代稱為一代,每一代都有一組解。新的一組解不但可以有選擇的保留一些適度值高的舊的解,而且可以包括一些由其它解結合得到的新解。最初的一組解 初始群體 是隨機生成的,之後的每組解由遺傳操作生成。每個解都通過乙個與目標函式相關的適應度函式給予評價,通過遺傳過程不斷重複,達...