人类学习优化(HLO)是一种基于简化人类学习模型开发的简单而高效的元启发式算法。该算法收敛速度快,全局寻优能力强不易陷入局部最优等优点,且设置参数少、算法简单易实现,已在多个应用问题上表现良好的性能。HLO算法中的每个个体可以通过3个学习算子即随机学习算子、个体学习算子和社会学习算子来模拟人类的3种学习行为进行寻优。
1、初始化
其中,xi表示第i个个体,N是人口的大小,M是解的维数。二进制字符串的每一位都随机初始化为“0”或“1”,这表示人们想要学习和掌握的知识或技能的基本元素。
2、学习阶段
2.1随机学习算子
在学习开始时,人们通常随机学习,因为没有问题的先验知识。在接下来的研究中,由于遗忘,仅知道问题和其他因素的部分知识,个体无法完全复制之前的经验,因此他们仍然以一定的随机性学习。为了模拟人类学习中的这些随机现象,为SHLO开发了简化的随机学习算子,如等式(2)
2.2个体学习算子
个人学习被定义为通过对外部刺激和来源的个人反思建立知识的能力。在学习过程中,人们利用自己的经验和知识来避免错误和提高绩效是非常普遍的。为了模拟SHLO中人类的个人学习,使用个人知识数据库(IKD)存储个人最佳经验,如等式(3-4)。当SHLO进行个体学习时,它根据IKD中的知识生成新的解决方案,如等式(5)所示
2.3 社会学习算子
通过个人学习,如果问题复杂,学习过程可能非常缓慢和低效。在社会环境中,人们可以通过社会学习从集体经验中学习,以进一步发展自己的能力。在这种情况下,人们直接或间接地转移知识和技能,因此,经验分享将提高学习的效率和有效性。为了模拟这种有效的学习策略,使用社会知识数据(SKD)来保留人群的知识,如等式(6)。基于SKD中的知识,SHLO可以执行等式(7)中的社会学习,以在搜索过程中生成更好的解决方案。
综上所述,SHLO使用随机学习算子、个体学习算子和社会学习算子来产生新的解决方案,并基于存储在IKD和SKD中的知识搜索最优值,就像人类学习和通过这三种学习形式提高技能一样,这三种形式可以被整合和操作为等式(8)
3、流程图
4、Matlab代码
主要代码部分
%% Code starts
clear;
clc;
format long;
popsize = 50;
runtimes = 1; %Number of runs
Gmax = 3000; %Max number of generations - stopping criteria
Dim = 2; %Variable number
bit = 32; %Bits numbers
m = bit * Dim; %Individual lenth
Xmax = 100; %Vaiable range
Xmin = -100; %Vaiable range
p_r = 5.0 / m;
p_i = 0.85 + 2.0 / m;
load sphere_func_data.mat; %Transfer the data of the F1:Shifted Sphere Function in CEC2005
for cn=1:runtimes
%% Initial population
popus = inipop(popsize,m);
Rpopus = B2R(popus,Dim,Xmax,Xmin); %Transform binary to real code
%% Evaluate fitness function and initial the IKD and SKD
Fits = Evfit(Rpopus,popsize,o); % Fitness function evaulation
IKDfits = Fits; % the best individual fitness
IKD = popus;
%% Initial the SKD
[arrange,position] = sort(IKDfits,1);
SKDfit = IKDfits(position(1,1),1);
SKD = IKD(position(1,1),:); % the best individual (binary)
%% Generation Starts
for t = 1:Gmax
for i = 1:popsize
for j = 1:m
prob = rand;
if prob < p_r && prob > 0 %random learning
if rand < 0.5
popus(i,j) = 1;
else
popus(i,j) = 0;
end
elseif prob >= p_r && prob < p_i %individual learning
popus(i,j) = IKD(i,j);
elseif prob >= p_i && prob < 1 %social learning
popus(i,j) = SKD(1,j);
end
end
end
%% Evaluate fitness function
Rpopus = B2R(popus,Dim,Xmax,Xmin); %transform binary-string to real variables
Fits = Evfit(Rpopus,popsize,o); %Fitness function evaulation
%% Evaluate IKD
for i = 1:popsize
if Fits(i) < IKDfits(i)
IKDfits(i) = Fits(i);
IKD(i,:) = popus(i,:);
end
end
%% Evaluate SKD
[arrange,postion] = sort(IKDfits,1);
if arrange(1,1) < SKDfit % when the best fitness of this generation is better than gloabl best fitness, then update
SKDfit = arrange(1,1);
SKD = IKD(postion(1,1),:);
end
if (mod(t,200))==0
fprintf('the %d round\n',t);
end
end
fprintf('runtimes = %d\n the best value is:',cn);
disp(SKDfit);
end
6、实验结果
本文只运行了样例中的函数,被测函数:%% y=x1x1+x2x2
结论
该算法主要适用于二进制问题,且该算法与GA,PSO,DE都有一定的相似性,可以对比学习。个人觉得HLO与PSO最为相似,不同的是应用的问题不同,一个是二进制,一个是实数问题。但是两者的更新公式主要都是借鉴了全局最优解和个体最优解。但是PSO实在原先解的基础上更新,这一点HLO并没有限制。HLO算法的研究较多,在此原型基础上开发了许多的高效算法,为我们研究提高算法性能提供了研究方案。很多变种都是换汤不换药。详细的代码也可以在网上找到。
参考文献
[1] Wang L, Ni H, Yang R, et al. A simple human learning optimization algorithm[M]//Computational Intelligence, Networked Systems and Their Applications. Springer, Berlin, Heidelberg, 2014: 56-65.