今天给大家分享饥饿游戏搜索优化算法,主要从算法原理和代码实战展开。需要了解更多算法代码的,可以点击文章左下角的阅读全文,进行获取哦~需要了解智能算法、机器学习、深度学习和信号处理相关理论的可以后台私信哦,下一期分享的内容就是你想了解的内容~
一、算法原理
饥饿游戏搜索算法(Hunger games search,HGS)是 YANG Yutao 等于 2021 年 提出的一种新型全局种群类优化算法。该算法通过 模拟饥饿驱使动物寻找食物的行为而设计,具有较强的寻优能力和快速收敛的特点。
假设在 D 维参数搜索空间中,由 N 个饥饿个体 组成种群 X = (X1 ,X2 ,…,XN),其中 Xi = (xi1 ,xi2 ,…, xiD)代表第 i 个饥饿个体在 D 维参数空间的位置。HGS 将根据适应度函数计算每个饥饿个体的适应度值。在 t 时刻饥饿个体的位置信息为 X(t)。迭代过程中,饥饿个体通过当前个体最优值和全局最优值 更新个体的位置和特征,位置的更新规则如下:
HGS算法步骤如下:
1)初始化个体数目 N,最大迭代次数 Maxiter,常 数 l 及参数空间 D 的上下限与维度。
2)初始化饥饿个体 Xi 的位置信息,按照适应度函数计算适应度值,其中 HGS-RF 预测模型的适应 度函数为训练集的均方误差。选择适应度值最小的 饥饿个体对应的适应度值作为全局最优值。
3)根据上式更新饥饿个体的位置信息及饥饿特征,计算更新后的饥饿个体的适应度值,并与个体的适应度极值相比较,选择更优的结果进行迭代 更新。
4)将饥饿个体的最优值与全局最优值进行比 较,选择更小的适应度值作为新的全局最优值。
5)重复步骤 3)、4),判断是否达到最大迭代次数 Maxiter,若达到则终止迭代,选取全局最优值对应 的参数作为最优参数。
HGS的伪代码如下图所示。
二、代码实战
clear all
close all
clc
N=30; % Number of search agents
Function_name='F11'; % Name of the test function, range from F1-F13
FEs=100; % Maximum number of evaluation times
dimSize = 30; %dimension size
% Load details of the selected benchmark function
[ ]=Get_Functions_HGS(Function_name,dimSize);
[ ]=HGS(N,FEs,lb,ub,dim,fobj);
% function topology
figure('Position',[500 400 700 290])
subplot(1,2,1);
func_plot(Function_name);
title('Function Topology')
xlabel('x_1');
ylabel('x_2');
zlabel([Function_name,'( x_1 , x_2 )'])
%Draw objective space
% figure,
% hold on
subplot(1,2,2);
semilogy(Convergence_curve,'Color','b','LineWidth',4);
title('Convergence curve')
xlabel('Iteration');
ylabel('Best fitness obtained so far');
axis tight
grid off
box on
legend('HGS')
function [Destination_fitness,bestPositions,Convergence_curve]=HGS(N,Max_iter,lb,ub,dim,fobj)
disp('HGS is now tackling your problem')
tic
% initialize position
bestPositions=zeros(1,dim);
tempPosition=zeros(N,dim);
Destination_fitness=inf;%change this to -inf for maximization problems
Worstest_fitness=-inf;
AllFitness = inf*ones(N,1);%record the fitness of all positions
VC1 = ones(N,1);%record the variation control of all positions
weight3 = ones(N,dim);%hungry weight of each position
weight4 = ones(N,dim);%hungry weight of each position
%Initialize the set of random solutions
X=initialization(N,dim,ub,lb);
Convergence_curve=zeros(1,Max_iter);
it=1; %Number of iterations
hungry = zeros(1,size(X,1));%record the hungry of all positions
count=0;
% Main loop
while it <= Max_iter
VC2 = 0.03; %The variable of variation control
sumHungry = 0;%record the sum of each hungry
%sort the fitness
for i=1:size(X,1)
% Check if solutions go outside the search space and bring them back
Flag4ub=X(i,:)>ub;
Flag4lb=X(i,:)<lb;
X(i,:)=(X(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;
AllFitness(i) = fobj(X(i,:));
end
[AllFitnessSorted,IndexSorted] = sort(AllFitness);
bestFitness = AllFitnessSorted(1);
worstFitness = AllFitnessSorted(size(X,1));
%update the best fitness value and best position
if bestFitness < Destination_fitness
bestPositions=X(IndexSorted(1),:);
Destination_fitness = bestFitness;
count=0;
end
if worstFitness > Worstest_fitness
Worstest_fitness = worstFitness;
end
for i = 1:size(X,1)
%calculate the variation control of all positions
VC1(i) = sech(abs(AllFitness(i)-Destination_fitness));
%calculate the hungry of each position
if Destination_fitness == AllFitness(i)
hungry(1,i) = 0;
count = count+1;
tempPosition(count,:)=X(i,:);
else
temprand = rand();
c = (AllFitness(i)-Destination_fitness)/(Worstest_fitness-Destination_fitness)*temprand*2*(ub-lb);
if c<100
b=100*(1+temprand);
else
b=c;
end
hungry(1,i) = hungry(1,i)+ max(b);
sumHungry = sumHungry + hungry(1,i);
end
end
%calculate the hungry weight of each position
for i=1:size(X,1)
for j=2:size(X,2)
weight3(i,j) = (1-exp(-abs(hungry(1,i)-sumHungry)))*rand()*2;
if rand()<VC2
weight4(i,j) = hungry(1,i)*size(X,1)/sumHungry*rand();
else
weight4(i,j) = 1;
end
end
end
% Update the Position of search agents
shrink=2*(1-it/Max_iter); % a decreases linearly fron 2 to 0
for i=1:size(X,1)
if rand<VC2
X(i,:) = X(i,j)*(1+randn(1));
else
A = randi([1,count]);
for j=1:size(X,2)
r = rand();
vb = 2*shrink*r-shrink;%[-a,a]
% Moving based on the bestPosition
% The transformation range is controlled by weight3,bestPositions and X
if r>VC1(i)
X(i,j) = weight4(i,j)*tempPosition(A,j)+vb*weight3(i,j)*abs(tempPosition(A,j)-X(i,j));
else
X(i,j) = weight4(i,j)*tempPosition(A,j)-vb*weight3(i,j)*abs(tempPosition(A,j)-X(i,j));
end
end
end
end
Convergence_curve(it)=Destination_fitness;
it=it+1;
end
toc
end
仿真结果
部分知识来源于网络,如有侵权请联系作者删除~
今天的分享就到这里了,后续想了解智能算法、机器学习、深度学习和信号处理相关理论的可以后台私信哦~希望大家多多转发点赞加收藏,你们的支持就是我源源不断的创作动力!
作 者 | 华 夏
编 辑 | 华 夏
校 对 | 华 夏