狐獴演算法 求解函式最值問題

2021-08-21 03:49:21 字數 3747 閱讀 7625

例:求函式f(x)=x+10sin(5x)+7cos(4x), x∈[0,10]的最大值

演算法流程圖

%%適應度函式

%%function

result = func(x)

fit=x+10*sin(5*x)+7*cos(4*x);

result = fit;

endclear all; %

清除所有變數

close

all; %清圖

clc; %清屏

%%初始化狐獴演算法引數%%

n = 46;

%種群數量

d = 10;

%狐獴個體維數

m = 25;

%覓食子群數量

c = n-m-1;

%保姆子群數量,其中哨兵的數量為1

g = 100;

%最大終止代數

fr = 0.4;

%覓食子群的弱劣比例

cr = 0.4;

%保姆子群的弱劣比例

k = 1;

%鄰域半徑

lb = 0; ub = 10;

%自變數x的取值範圍是[0,10]

%%初始化狐獴種群%%

pb = crtbp(n,d);

%建立二進位制狐獴種群,二進位制比十進位制隨機性更強

field = [size(pb,2);lb;ub;1;0;1;1];

%建立區域描述器

pd = bs2rv(pb,field);

%二進位制轉換為十進位制

%%劃分子群%%

fori = 1:n

fit(i) = func(pd(i));

%計算適應度值

end[bestfit,is] = max(fit);

%根據適應度值選擇哨兵

sentry = pd(is);

%得到哨兵

pr = pd ;

%從種群中選取剩餘子群

pr(is,:) = ;

%得到去掉哨兵的剩餘子群(即覓食子群與保姆子群之和)

idx = randperm(n-1);

%將剩餘子群打亂,增強隨機性

idx = idx(1:m);

%隨機選出覓食子群個體的序號

fg = pr(idx,:);

%生成覓食子群

cg = pr;

%選取剩餘子群中的剩餘個體

cg(idx,:) = ;

%生成保姆子群

%%終止條件執行%%

g = 0;

%代數計數器

while

gfor

j = 1:m

nei1 =rand(10,1)*((fg(j)+k)-(fg(j)-k))+fg(j)-k;

%在fg(i)的鄰域內,半徑為1,隨機產生乙個鄰域陣列(包含10個個體)

fit1 = func(fg(j));

%計算覓食子群中第j個個體的適應度值

fit2 = func(nei1);

%計算fg(i)鄰域陣列的適應度值

[bestfit2,i1] = max(fit2);

%得到fg(i)鄰域陣列中的最優個體及其序號

iffit1 >= bestfit2

nei2 =rand(10,1)*((sentry+k)-(sentry-k))+sentry-k;

%在sentry的鄰域內隨機產生乙個鄰域陣列

fit3 = func(nei2);

%計算sentry鄰域陣列的適應度值

[bestfit3,i2] = max(fit3);

%得到sentry鄰域陣列中的最優個體

iffit1 < bestfit3

fg(j) = nei2(i2);

%將sentry鄰域陣列內的最優個體賦值給fg(j)

else

fg(j) = sentry;

%將sentry值賦給fg(j)

endelse

fg(j) = nei1(i1);

%將fg(j)鄰域陣列內的最優個體賦值給fg(j)

endend

g = g+1;

%代數計數器累加

fitfg = func(fg);

%計算覓食子群個體的適應度值

fitcg = func(cg);

%計算保姆子群個體的適應度值

[sa_fitfg,ifg_a] = sort(fitfg,

'ascend'

); %

將覓食子群個體按適應度值由小到大排序並得到個體序號

worst_fitfg = sa_fitfg(1:m*fr);

%得到覓食子群中的弱劣個體

iwfg = ifg_a(1:m*fr);

%覓食子群中弱劣個體的序號

[sd_fitcg,icg_d] = sort(fitcg,

'descend'

); %

將保姆子群個體按適應度值由大到小排序並得到個體序號

best_fitcg = sd_fitcg(1:m*fr);

%得到保姆子群中的最優個體

ibcg = icg_d(1:m*fr);

%保姆子群中最優個體的序號

[sa_fitcg,icg_a] = sort(fitcg,

'ascend'

); %

將保姆子群個體按適應度值由小到大排序並得到個體序號

worst_fitcg = sa_fitcg(1:c*cr);

%得到保姆子群中的弱劣個體

iwcg = icg_a(1:c*cr);

%保姆子群中弱劣個體的序號

best_cg = cg(ibcg);

%提取保姆子群中最優個體

fg([iwfg],:) = [best_cg];

%保姆子群中的最優個體替換覓食子群中弱劣個體

cg_random = rand(c*cr,1)*(ub-lb)+lb;

%隨機產生新的個體來替換cg中的弱劣個體

cg([iwcg],:) = [cg_random];

%新的隨機個體替換保姆子群中弱劣個體

fitfg = func(fg);

%計算新覓食子群個體的適應度值

[fit_best_forg,ibest_forg] =max(fitfg);

%從新覓食子群中選取最優個體

best_forg = fg(ibest_forg);

%新覓食子群中最優個體命名為best_forg

iffit_best_forg >=bestfit

sentry = best_forg;

%將best_forg值賦給sentry

else

sentry;

%直接輸出sentry值

endtrace(g) = func(sentry);

%每一代最優適應度值

end%%

繪圖%%

figure

plot(trace)

xlabel(

'迭代次數'

); %

橫座標命名

ylabel(

'適應度值'

); %

縱座標命名

title(

'適應度進化曲線') %

標題

求解區間最值的ST演算法

作用 st演算法是用來求解給定區間rmq的最值,本文以最小值為例 舉例 給出一陣列a 0 5 則區間 2,5 之間的最值為1。1 離線預處理 運用dp思想,用於求解區間最值,並儲存到乙個二維陣列中。具體解釋 1 離線預處理 st演算法使用dp思想求解區間最值,貌似屬於區間動態規劃,不過區間在增加時,...

ST表演算法(求解區間最值)

如下 bin 0 1 for int i 1 i 20 i bin i bin i 1 2 bin i 表示2的i次方 log 0 1 for int i 1 i 200000 i log i log i 2 1 log i 表示log i for int i 1 i n i mn 0 i a i ...

模擬退火演算法實現尋找函式最值

模擬退火的演算法思想 模擬退火演算法從某一較高初溫出發,伴隨溫度引數的不斷下降,結合概率突跳特性在解空間中隨機尋找目標函式的全域性最優解,即在區域性最優解能概率性地跳出並最終趨於全域性最優。模擬退火演算法模板 初始溫度 t 100 冷卻速率 rate 0.99 while t 1 隨機生成乙個解 x...