狐獴算法——求解函数最值问题
例:求函数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;
end
clear 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); %二进制转换为十进制
%%划分子群%%
for i = 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 g<G
for 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)邻域数组中的最优个体及其序号
if Fit1 >= bestFit2
nei2 =rand(10,1)*((sentry+k)-(sentry-k))+sentry-k; %在sentry的邻域内随机产生一个邻域数组
Fit3 = func(nei2); %计算sentry邻域数组的适应度值
[bestFit3,I2] = max(Fit3); %得到sentry邻域数组中的最优个体
if Fit1 < bestFit3
Fg(j) = nei2(I2); %将sentry邻域数组内的最优个体赋值给Fg(j)
else
Fg(j) = sentry; %将sentry值赋给Fg(j)
end
else
Fg(j) = nei1(I1); %将Fg(j)邻域数组内的最优个体赋值给Fg(j)
end
end
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
if Fit_best_forg >=bestFit
sentry = best_forg; %将best_forg值赋给sentry
else
sentry; %直接输出sentry值
end
trace(g) = func(sentry); %每一代最优适应度值
end
%%绘图%%
figure
plot(trace)
xlabel('迭代次数'); %横坐标命名
ylabel('适应度值'); %纵坐标命名
title('适应度进化曲线') %标题