例:求函式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...