狐獴算法——求解函数最值问题

例:求函数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(
'适应度进化曲线') %标题