注:该算法已按照智能优化算法APP标准格式进行整改,可直接集成到APP中,方便大家与自己的算法进行对比。
饥饿游戏搜索(Hunger games search, HGS)是一种出色的优化算法,它是根据饥饿驱动的活动和动物的行为选择设计的。这种动态的、健康的搜索方法遵循一个简单的概念,即“饥饿”是所有动物生活中行为、决策和行动的最重要的稳态动机和原因,以使优化过程对新用户和决策者来说更容易理解和一致。基于饥饿概念的自适应权重被设计并用于模拟饥饿对每个搜索步骤的影响。它遵循几乎所有动物都使用的计算逻辑规则,这些竞争性活动和游戏通常是适应性进化,以确保更高的生存和食物获取机会。该方法的主要特点是其动态性,结构简单,高性能的收敛性。
该成果于2021年发表在计算机领域1区SCI期刊“Expert Systems with Applications”上,目前被引898次。
1.算法原理
(1)接近食物
群居动物在觅食过程中经常相互合作,但不排除少数个体不参与协作的可能性。下面的游戏说明代表了HGS算法的中心方程,用于个体合作通信和觅食行为:
其中R在[− a,a]的范围内;r1和r2表示两个随机数,它们在[0,1]范围内; randn(1)是满足正态分布的随机数;t表示当前迭代次数;W1和W2代表饥饿的权重,基于饥饿驱动信号的事实来设计; Xb表示本次迭代中最佳个体的位置;X(t)表示每个个体的位置; l的值将在参数设置实验中讨论,它是为了改进算法而设计的参数。 表示智能体如何在当前位置饥饿地随机搜索食物; 模拟当前个体的活动范围,时间为当前时间,并乘以W2以影响饥饿对活动范围的影响。
由于个体在不饿的时候会停止搜索,所以R是一个限制活动范围的测距控制器,其中R的范围逐渐减小到0。根据 加减活动范围模拟当前个体到达食物位置时得到同伴通知,获得食物后在当前位置再次寻找食物。引入W1作为现实中抓取实际位置的误差。E是所有位置的变分控制,其公式定义如下:
其中i∈1,2,⋯n,F(i)表示每个个体的适应度值;
BF是当前迭代过程中(到目前为止)得到的最佳适应度;
这是一个双曲函数
R的公式如下:
式中rand为[0,1]范围内的随机数;T表示最大迭代次数。
下图显示了规则在空间中搜索HGS的过程和逻辑。
从图中可以看出,根据源点的分类,搜索方向可以分为两类:
基于 的搜索:第一个游戏指令模拟的是自我依赖的,它没有团队精神,不参与合作阶段,只是想饥饿地寻找食物。
基于 的搜索:第二个游戏指令与变量 、 、 密切相关。通过对这三个因素的细化,个体的位置可以在特征空间中进化。这种方法模拟了几个实体在寻找食物时的合作。
式中的规则允许个体探索靠近最优解的可能位置和远离最优解的可能位置,这在一定程度上保证了在解空间边界内的所有位置的搜索(多样化)。同样的概念也可以应用于高维搜索空间。
(2)饥饿角色
在这一部分中,用提出的模型对个体在搜索中的饥饿特征进行了数学模拟。
式中W1的公式为:
式中W2的公式如下:
其中饥饿代表每个体的饥饿;N代表个体数;SHungry是所有个体饥饿感的总和,即sum(饥饿);r3、r4和r5是在[0,1]范围内的随机数。饥饿(i)的公式如下:
其中AllFitness(i)保留当前迭代中每个个体的适应度。在每次迭代中,最佳个体的饥饿度被设置为0。对于其他个体,基于原始饥饿度添加新饥饿度(H)。因此,不同个体的相应H是不同的。
H的公式如下:
其中r6是在[0,1]范围内的随机数;
F(i)表示每个个体的适应度值; BF是当前迭代过程中获得的最佳适应度; WF代表当前迭代过程中获得的最差适应度; UB和LB分别表示特征空间的上界和下界。
饥饿感H被限制在一个下界LH,为了使算法得到更好的性能,控制饥饿感的上下限,LH的值将在参数设置实验中讨论。
由于饥饿可能对活动范围有积极和消极的影响,因此模拟了W1和W2。
UB与LB的差异用来反映个体在不同环境中的最大饥饿感,F(i)-BF表示一个个体仍然不饿的食物量;在每一次迭代中,个体的饥饿程度都会改变。WF−DF得出个体在当前过程中的总觅食能力;
代表饥饿率
r6×2给出了环境因素对饥饿的积极或消极影响。虽然HGS算法可以产生社会动物的共性,它仍然有很大的改进空间。例如,可以通过根据活生物体对其进行映射并整合活生物体的独特特征来改进算法。还可以通过增加其他机制来改进。尽可能地简化算法,以最大限度地提高其可扩展性。
HGS算法的流程图如下所示:

2.结果展示




3.MATLAB核心代码
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
4.参考文献
[1]Yang Y, Chen H, Heidari A A, et al. Hunger games search: Visions, conception, implementation, deep analysis, perspectives, and towards performance shifts[J]. Expert Systems with Applications, 2021, 177: 114864.
完整代码获取
点击下方卡片,获取代码后台回复关键词:
TGDM819
9865

被折叠的 条评论
为什么被折叠?



