1. 程式人生 > >遺傳演算法 簡單函式優化

遺傳演算法 簡單函式優化

基本原理:

遺傳演算法是一種典型的啟發式演算法,屬於非數值演算法範疇。它是模擬達爾文的自然選擇學說和自然界的生物進化過程的一種計算模型。它是採用簡單的編碼技術來表示各種複雜的結構,並通過對一組編碼表示進行簡單的遺傳操作和優勝劣汰的自然選擇來指導學習和確定搜尋的方向。遺傳演算法的操作物件是一群二進位制串(稱為染色體、個體),即種群,每一個染色體都對應問題的一個解。從初始種群出發,採用基於適應度函式的選擇策略在當前種群中選擇個體,使用雜交和變異來產生下一代種群。如此模仿生命的進化進行不斷演化,直到滿足期望的終止條件。

運算流程:

Step 1:對遺傳演算法的執行引數進行賦值。引數包括種群規模、變數個數、交叉概率、變異概

率以及遺傳運算的終止進化代數。

Step 2:建立區域描述器。根據軌道交通與常規公交運營協調模型的求解變數的約束條件,設定變數的取值範圍。

Step 3:在Step 2的變數取值範圍內,隨機產生初始群體,代入適應度函式計算其適應度值。

Step 4:執行比例選擇運算元進行選擇操作。

Step 5:按交叉概率對交叉運算元執行交叉操作。

Step 6:按變異概率執行離散變異操作。

Step 7:計算Step 6得到區域性最優解中每個個體的適應值,並執行最優個體儲存策略。

Step 8:判斷是否滿足遺傳運算的終止進化代數,不滿足則返回Step 4,滿足則輸出運算結果。

運用遺傳演算法工具箱:

運用基於Matlab的遺傳演算法工具箱非常方便,遺傳演算法工具箱裡包括了我們需要的各種函式庫。目前,基於Matlab的遺傳演算法工具箱也很多,比較流行的有英國設菲爾德大學開發的遺傳演算法工具箱GATBX、GAOT以及MathWorks公司推出的GADS。實際上,GADS就是大家所看到的Matlab中自帶的工具箱。我在網上看到有問為什麼遺傳演算法函式不能呼叫的問題,其實,主要就是因為用的工具箱不同。因為,有些人用的是GATBX帶有的函式,但MATLAB自帶的遺傳演算法工具箱是GADS,GADS當然沒有GATBX裡的函式,因此執行程式時會報錯,當你用MATLAB來編寫遺傳演算法程式碼時,要根據你所安裝的工具箱來編寫程式碼。

以GATBX為例,運用GATBX時,要將GATBX解壓到Matlab下的toolbox資料夾裡,同時,setpath將GATBX資料夾加入到路徑當中。

例子:

這塊內容主要包括兩方面工作:1、將模型用程式寫出來(.M檔案),即目標函式,若目標函式非負,即可直接將目標函式作為適應度函式。2、設定遺傳演算法的執行引數。包括:種群規模、變數個數、區域描述器、交叉概率、變異概率以及遺傳運算的終止進化代數等等。

求解模型: f(x)=x*sin(10*pi*x)+2.0,x的範圍在【-1,2】

根據上面的求解模型,可以寫出模型的.M檔案如下,即適應度函式

function z=shang(x)
z=x.*sin(10*pi*x)+2.0;

然後寫入遺傳演算法的引數:

figure(1);
fplot('variable.*sin(10*pi*variable)+2.0',[-1,2]); %畫出函式曲線
NIND=40; %個體數目(Number of individuals)
MAXGEN=25; %最大遺傳代數(Maximum number of generations)
PRECI=20; %變數的二進位制位數(Precision of variables)
GGAP=0.9; %代溝(Generation gap)
trace=zeros(2, MAXGEN); %尋優結果的初始值
FieldD=[20;-1;2;1;0;1;1]; %區域描述器(Build field descriptor)
Chrom=crtbp(NIND, PRECI); %初始種群
gen=0; %代計數器
variable=bs2rv(Chrom, FieldD); %計算初始種群的十進位制轉換
ObjV=shang(variable); %計算目標函式值
while genFitnV=ranking(-ObjV); %分配適應度值(Assign fitness values)
SelCh=select('sus', Chrom, FitnV, GGAP); %選擇
SelCh=recombin('xovsp', SelCh, 0.7); %重組
SelCh=mut(SelCh); %變異
variable=bs2rv(SelCh, FieldD); %子代個體的十進位制轉換
ObjVSel=shang(variable); %計運算元代的目標函式值
[Chrom ObjV]=reins(Chrom, SelCh, 1, 1, ObjV, ObjVSel);%重插入子代的新種群
variable=bs2rv(Chrom, FieldD);
gen=gen+1; %代計數器增加
%輸出最優解及其序號,並在目標函式影象中標出,Y為最優解,I為種群的序號
[Y, I]=max(ObjV);hold on;
plot(variable(I), Y, 'bo');
trace(1, gen)=max(ObjV); %遺傳演算法效能跟蹤
trace(2, gen)=sum(ObjV)/length(ObjV);
end
variable=bs2rv(Chrom, FieldD); %最優個體的十進位制轉換
hold on, grid;
plot(variable,ObjV,'b*');
figure(2);
plot(trace(1,:));
hold on;
plot(trace(2,:),'-.');grid
legend('解的變化','種群均值的變化')