饥饿游戏搜索优化算法MATLAB实战

文摘   科技   2024-05-07 20:19   贵州  

    今天给大家分享饥饿游戏搜索优化算法,主要从算法原理和代码实战展开。需要了解更多算法代码的,可以点击文章左下角的阅读全文,进行获取哦~需要了解智能算法、机器学习、深度学习和信号处理相关理论的可以后台私信哦,下一期分享的内容就是你想了解的内容~


一、算法原理

    饥饿游戏搜索算法(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 allclc
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[lb,ub,dim,fobj]=Get_Functions_HGS(Function_name,dimSize);
[Destination_fitness,bestPositions,Convergence_curve]=HGS(N,FEs,lb,ub,dim,fobj);
% function topologyfigure('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 onsubplot(1,2,2);semilogy(Convergence_curve,'Color','b','LineWidth',4);title('Convergence curve')xlabel('Iteration');ylabel('Best fitness obtained so far');axis tightgrid offbox onlegend('HGS')
function [Destination_fitness,bestPositions,Convergence_curve]=HGS(N,Max_iter,lb,ub,dim,fobj)disp('HGS is now tackling your problem')
tic% initialize positionbestPositions=zeros(1,dim);tempPosition=zeros(N,dim);
Destination_fitness=inf;%change this to -inf for maximization problemsWorstest_fitness=-inf;AllFitness = inf*ones(N,1);%record the fitness of all positionsVC1 = ones(N,1);%record the variation control of all positions
weight3 = ones(N,dim);%hungry weight of each positionweight4 = ones(N,dim);%hungry weight of each position
%Initialize the set of random solutionsX=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 positionscount=0;
% Main loopwhile 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;endtocend

仿真结果

参考文献
[1]周旭,杨佳鹏,俎毓伟等.基于NMF-HGS-RF的瓦斯涌出量预测研究[J].矿业安全与环保,2023,50(03):117-123.
完整代码
回复“HGS”获取

    部分知识来源于网络,如有侵权请联系作者删除~


    今天的分享就到这里了,后续想了解智能算法、机器学习、深度学习和信号处理相关理论的可以后台私信哦~希望大家多多转发点赞加收藏,你们的支持就是我源源不断的创作动力!


作 者 | 华 夏

编 辑 | 华 夏

校 对 | 华 夏


matlab学习之家
分享学习matlab建模知识和matlab编程知识
 最新文章