clc
clear
close all
MaxIt = 1000; %迭代次数
lowerbound = -5;
upperbound = 5; %边界
dimension = 30; %种群维度
nVar = 30; %种群数量
fitness = @(x) sum(x.^2);%测试函数
for i1=1:nVar
pop(i1).Position = unifrnd(lowerbound, upperbound, [1 dimension]);
pop(i1).Cost = fitness(pop(i1).Position);
end
[SHO_curve ,pop]=SHO(MaxIt,lowerbound,upperbound,dimension,fitness,nVar,pop);
plot(SHO_curve)
function [SHO_curve ,pop]=SHO(MaxIt,lowerbound,upperbound,dimension,fitness,nVar,pop)
%% SHO
u=ones(1,dimension).*upperbound;
l=ones(1,dimension).*lowerbound;
pop=sortingF(pop,nVar);
popt = pop;
for t = 1:MaxIt
h = 5 - (t*(5/(MaxIt)));
count=noh([pop.Cost])+1;
for i1=1:nVar
CV = zeros(1,dimension);
for j1=1:count
B = rand(1, dimension)*2;
E = 2 * h * rand(1, dimension) - h;
D = abs(pop(j1).Position.*B - popt(j1).Position);
X = pop(j1).Position - D.*E;
CV = CV + X;
end
CV = CV./(count);
CV = max(CV,l);
CV = min(CV,u);
popt(i1).Position=CV;
popt(i1).Cost=fitness(CV);
end
pops = [pop;popt];
pop=sortingF(pops,nVar);
SHO_curve(t)=pop(1).Cost;
disp(['迭代次数 ' num2str(t) '最优解' num2str(SHO_curve(t))]);
end
end
%% 攻击选择
function X=noh(best_hyena_fitness)
min = 0.5;
max = 1;
count=0;
M=(max-min).*rand(1,1) + min;
M=M+best_hyena_fitness(1);
for i=2:numel(best_hyena_fitness)
if M>=best_hyena_fitness(i)
count=count+1;
end
end
X=count;
end
%% 排序选择
function F=sortingF(f,nVar)
[~,FS] = sort([f.Cost]);
F=f(FS);
L=numel(F);
if L>nVar
F=F(1:nVar);
end
end
自己编写版斑鬣狗算法(SHO算法)
最新推荐文章于 2024-08-14 11:57:07 发布