下面使用一個(gè)具體的例子來(lái)解釋遺傳算法。
問題如下:
求函數(shù)
f(x)=9×sin(5x)+8×cos(4x), x∈[5,10]
的最大值。
設(shè)置參數(shù)
首先需要設(shè)定幾個(gè)參數(shù):
popsize = 30; % 種群規(guī)模
chromlength = 10; % 染色體長(zhǎng)度
pc = 0.5; % 交叉概率
pm = 0.05; % 變異概率
maxgen = 20; % 最大迭代數(shù)
lx = 5; ux = 10;
上面分別設(shè)定了遺傳算法的參數(shù)和自變量x的取值范圍洲敢。
下面是對(duì)幾個(gè)參數(shù)選取的說明:
參數(shù) | 太大 | 太小 | 常用值 |
---|---|---|---|
種群規(guī)模 | 難以收斂且浪費(fèi)資源 | 近親交配锰悼,產(chǎn)生病態(tài)基因 | 0~100 |
變異概率 | 可能破壞已有的有利模式 | 多樣性下降太快勒极,容易丟失有效基因 | 0.0001~0.2 |
交叉概率 | 可能破壞已有的有利模式 | 不能有效更新種群 | 0.4~0.99 |
進(jìn)化代數(shù) | 容易早熟后浪費(fèi)資源 | 不容易收斂 | 100~500 |
初始化
初始化的種群是隨機(jī)的饲帅,這里使用二進(jìn)制對(duì)自變量進(jìn)行編碼敞恋,初始化子程序如下:
function pop = initpop(popsize, chromlength)
% 初始化種群丽啡,二進(jìn)制編碼
% popsize input 種群規(guī)模
% chromlength input 染色體長(zhǎng)度
% pop output popsize x chromelength的二進(jìn)制矩陣
pop = round(rand(popsize, chromlength));
end
目標(biāo)函數(shù)值
由于自變量采用二進(jìn)制編碼,因此需要首先將種群中的染色體從二進(jìn)制轉(zhuǎn)化為十進(jìn)制硬猫。下面的子程序?qū)⒍M(jìn)制編碼轉(zhuǎn)換成十進(jìn)制:
function rpop = decodebinary(pop)
% 將二進(jìn)制矩陣中的每一行轉(zhuǎn)化為十進(jìn)制數(shù)
% pop input 二進(jìn)制矩陣
% rpop output 十進(jìn)制列向量
[n, l] = size(pop);
temp = zeros(l, 1);
for i = 1:l
temp(i,1) = 2^(l-i);
end
rpop = pop * temp;
end
使用該函數(shù)對(duì)染色體進(jìn)行解碼:
function rpop = decodechrom(pop, spoint, length)
% 將每行中列為spoint : spoint+length-1的二進(jìn)制矩陣轉(zhuǎn)化為十進(jìn)制數(shù)
% pop input 種群
% spoint input 開始位置
% length input 長(zhǎng)度
% rpop output 十進(jìn)制列向量
tpop = pop(:, spoint: spoint+length-1);
rpop = decodebinary(tpop);
end
decodechrom()
與decodebinary()
的區(qū)別是补箍,decodechrom()
可以使用參數(shù)spoint
和length
指定需要解碼的列,而decodebinary()
不行啸蜜。
最后坑雅,使用下面的子程序求出目標(biāo)函數(shù)值:
function [objvalue] = calobjvalue(pop, lx, ux)
% 計(jì)算目標(biāo)函數(shù)值,需根據(jù)實(shí)際情況重寫
% pop input 種群
% lx input 自變量最小值
% ux input 自變量最大值
% objvalue output 目標(biāo)函數(shù)值
decchrom = decodechrom(pop, 1, size(pop, 2)); % 將二進(jìn)制轉(zhuǎn)化為十進(jìn)制
x = decchrom / (2^size(pop ,2)-1) * (ux - lx) + lx;
objvalue = 9 * sin(5 * x) + 8 * cos(4 * x);
end
calobjvalue()
函數(shù)首先將二進(jìn)制解碼為十進(jìn)制衬横,將解碼后的數(shù)值對(duì)應(yīng)到自變量變化范圍裹粤,最后求出函數(shù)值。
適應(yīng)值
設(shè)f(x)
為目標(biāo)函數(shù)值蜂林,F(x)
為適應(yīng)值遥诉,這里采用下面的策略求適應(yīng)值,但是此方法并不適用于所有情況悉尾,需要需根據(jù)實(shí)際情況重寫:
對(duì)于最小化問題:
image
對(duì)于最大化問題:
image
下面是代碼實(shí)現(xiàn):
function fitvalue = calfitvalue(objvalue, opt)
% 根據(jù)目標(biāo)函數(shù)值生成適應(yīng)度值突那,需根據(jù)實(shí)際情況重寫
% objvalue input 目標(biāo)函數(shù)值
% opt input 操作模式,指定為'min'或'max'
% fitvalue output 適應(yīng)度值
fitvalue = zeros(size(objvalue,1), 1);
for i = 1 : size(objvalue, 1)
if strcmp(opt, 'min')
if objvalue(i) < 0
temp = -objvalue(i);
else
temp = 0;
end
else
if objvalue(i) > 0
temp = objvalue(i);
else
temp = 0;
end
end
fitvalue(i) = temp;
end
fitvalue = fitvalue';