五行优化算法(Five phases algorithm,FPA)是一种新的元启发式算法,该方法受到中国传统思想五行学说的启发。五行学说是中国古代人民创造的一种哲学思想。中国古代以金、木、水、火、土五行作为宇宙万物形成和各种自然现象变化的基础。他们依靠五行学说来认识世界,相信天人合一。五阶段理论已被广泛应用于解释自然、人类和社会等概念领域的存在和发生的事情。FPA基于生成和克服策略以及从具有相同标签的代理学习策略来更新代理。FPA结构简单,性能优良。它也没有任何预定义的控制参数,只需要两个通用参数,包括种群大小和终端条件。该算法具有进化能力强、搜索速度快、寻优能力强的特点。
![69f21404ba0cdf0f36debadd81950de0.png](https://img-blog.csdnimg.cn/img_convert/69f21404ba0cdf0f36debadd81950de0.png)
该成果于2023年发表在计算机领域四区SCI期刊“Journal of Internet Technology”上。目前被引用2次,在工程优化、机器学习、数据挖掘等方面有着出色的优势。
![15a7191cbff938824e65db683d960d24.png](https://img-blog.csdnimg.cn/img_convert/15a7191cbff938824e65db683d960d24.png)
1、算法原理
(1)生成与克服策略
受五行理论的启发,本文提出的生成克服策略更新了智能体的位置,完成了不同阶段标签下智能体之间的信息交换。具体操作如下式所示。
其中,XG lid和,XG+l lid分别表示第i个产物在第g代的第d维,第i个agent的标号为l。XG gd和XG og分别表示标记为l的第i代产物在第g代时产生和克服产物的潜伏期维度。参数r1和r2表示[0,1]中的随机数。为了解决极小化问题,假设XG lid的标签是木,则XG gd表示生成产物的d维,对应生成产物为水标签中适应度值最小的生成物。XG od为克服产物的第d维,对应克服产物为金属标签中适应度值最大的生成物。基于五行理论中的相互生成和克服关系,对具有其他标签的智能体进行更新。
(2)学习策略
该学习策略提出了同一标签下智能体之间的相互通信机制。引导产物的更新方法是向具有相同标签的更好的产物学习。对于最小化问题,产物的更新方法为下式:
![9f9102df6d865272a54bda8d24752672.png](https://img-blog.csdnimg.cn/img_convert/9f9102df6d865272a54bda8d24752672.png)
其中XG lj表示随机选择的第j个标签为l的产物, 和 分别为XG li和XG lj的适应度值。参数r3和r4是[0,1]中的两个随机数。如果第j个智能体的适应度值小于第i个智能体,则表明第j个智能体优于第i个智能体,第i个智能体将向选择的第j个智能体移动。否则,第i个代理将向相反方向移动。
下图显示了五行算法的流程图。首先,初始化优化过程:设置种群规模和最大迭代次数两个通用参数,然后评估各智能体的适应值,选择当前最优的智能体。此外,将代理随机分为五个阶段。对于木、火、土和金属,子种群大小设置为FLOOR(种群大小/5),剩余代理数量设置为水。
![caa48cb5682822f7a141d3c89b707c33.png](https://img-blog.csdnimg.cn/img_convert/caa48cb5682822f7a141d3c89b707c33.png)
FPA对应的伪代码过程如下图所示
![8b618389e8c45415cc2407c5a3a2f910.png](https://img-blog.csdnimg.cn/img_convert/8b618389e8c45415cc2407c5a3a2f910.png)
2、结果展示
3、MATLAB核心代码
%% 淘个代码 %%
% 微信公众号搜索:淘个代码,获取更多代码
% 五行优化算法(Five phases algorithm,FPA)
function [gbest,gbestval,recordtime] = FPA_func(fhd,dim,ps,iter_max,Xmin,Xmax,varargin)
% random seeds
stm = RandStream('swb2712','Seed',sum(100*clock));
RandStream.setGlobalStream(stm);
% global best
targetbest = [300;400;600;800;900;1800;2000;2200;2300;2400;2600;2700];
Fidvec = cell2mat(varargin);
Fid = Fidvec(1);
runid = Fidvec(2);
name_convergence_curve = ['FPA_Fid_',num2str(Fid),'_',num2str(dim),'D','.dat'];
f_out_convergence = fopen(name_convergence_curve,'a');
NP= 5;
ps_subps= floor(ps/NP);
ps_subps_last= ps - 4*ps_subps;
%% set 51 points to plot convergence_curve
if runid ==1
for i=1:51
if i==1
iteration=1;
fprintf(f_out_convergence,'%s:%s\t','iter_F',num2str(Fid));
else
iteration=iter_max/50*(i-1);
end
fprintf(f_out_convergence,'%d\t',iteration);
end
fprintf(f_out_convergence,'\n');
end
%%
tic;
%initialize ÖÖȺλÖÃ
for i = 1:ps
pos(i,:) = Xmin+(Xmax-Xmin)*rand(1,dim);
end
%pos = randn(ps,D);
eval = feval(fhd,pos',varargin{:}); %·µ»ØֵΪÖÖȺ´óСµÄÐÐÏòÁ¿
[gbestval,gbestid] = min(eval);
gbest = pos(gbestid,:);
fprintf(f_out_convergence,'%s\t%.15f\t',num2str(runid),gbestval-targetbest(Fid));
for iter = 2:iter_max
%% randomly division
% shuffle
indexr = randperm(ps)';
pos = pos(indexr,:);
eval = eval(1,indexr);
% wood,fire,earth,metal,water
wo_pos = pos(1:ps_subps,:);
wo_eval = eval(1,1:ps_subps);
f_pos = pos(ps_subps+1:2*ps_subps,:);
f_eval = eval(1,ps_subps+1:2*ps_subps);
e_pos = pos(2*ps_subps+1:3*ps_subps,:);
e_eval = eval(1,2*ps_subps+1:3*ps_subps);
m_pos = pos(3*ps_subps+1:4*ps_subps,:);
m_eval = eval(1,3*ps_subps+1:4*ps_subps);
wa_pos = pos(4*ps_subps+1:ps,:);
wa_eval = eval(1,4*ps_subps+1:ps);
%% search operators
for number_label=1:NP
switch number_label
case 1
% wood_search
[~,wa_gid] = min(wa_eval);
[~,m_oid] = max(m_eval);
for i= 1:ps_subps
if rand < rand
wo_posnew(i,:)= wo_pos(i,:) + rand(1,dim).*(wa_pos(wa_gid,:)-wo_pos(i,:)) + rand(1,dim).*(wo_pos(i,:)-m_pos(m_oid,:));
else
j= randi([1, ps_subps]);
while j == i
j= randi([1, ps_subps]); % let j not equal to i
end
if wo_eval(1,j) < wo_eval(1,i)
wo_posnew(i,:)= wo_pos(i,:) + rand(1,dim).*(wo_pos(j,:)-wo_pos(i,:));
else
wo_posnew(i,:)= wo_pos(i,:) + rand(1,dim).*(wo_pos(i,:)-wo_pos(j,:));
end
end
end
case 2
% fire_search
[~,wo_gid] = min(wo_eval);
[~,wa_oid] = max(wa_eval);
for i= 1:ps_subps
if rand < rand
f_posnew(i,:)= f_pos(i,:) + rand(1,dim).*(wo_pos(wo_gid,:)-f_pos(i,:)) + rand(1,dim).*(f_pos(i,:)-wa_pos(wa_oid,:));
else
j= randi([1, ps_subps]);
while j == i
j= randi([1, ps_subps]); % let j not equal to i
end
if f_eval(1,j) < f_eval(1,i)
f_posnew(i,:)= f_pos(i,:) + rand(1,dim).*(f_pos(j,:)-f_pos(i,:));
else
f_posnew(i,:)= f_pos(i,:) + rand(1,dim).*(f_pos(i,:)-f_pos(j,:));
end
end
end
case 3
% earth_search
[~,f_gid] = min(f_eval);
[~,wo_oid] = max(wo_eval);
for i= 1:ps_subps
if rand < rand
e_posnew(i,:)= e_pos(i,:) + rand(1,dim).*(f_pos(f_gid,:)-e_pos(i,:)) + rand(1,dim).*(e_pos(i,:)-wo_pos(wo_oid,:));
else
j= randi([1, ps_subps]);
while j == i
j= randi([1, ps_subps]); % let j not equal to i
end
if e_eval(1,j) < e_eval(1,i)
e_posnew(i,:)= e_pos(i,:) + rand(1,dim).*(e_pos(j,:)-e_pos(i,:));
else
e_posnew(i,:)= e_pos(i,:) + rand(1,dim).*(e_pos(i,:)-e_pos(j,:));
end
end
end
case 4
% metal_search
[~,e_gid] = min(e_eval);
[~,f_oid] = max(f_eval);
for i= 1:ps_subps
if rand < rand
m_posnew(i,:)= m_pos(i,:) + rand(1,dim).*(e_pos(e_gid,:)-m_pos(i,:)) + rand(1,dim).*(m_pos(i,:)-f_pos(f_oid,:));
else
j= randi([1, ps_subps]);
while j == i
j= randi([1, ps_subps]); % let j not equal to i
end
if m_eval(1,j) < m_eval(1,i)
m_posnew(i,:)= m_pos(i,:) + rand(1,dim).*(m_pos(j,:)-m_pos(i,:));
else
m_posnew(i,:)= m_pos(i,:) + rand(1,dim).*(m_pos(i,:)-m_pos(j,:));
end
end
end
case 5
% water_search
[~,m_gid] = min(m_eval);
[~,e_oid] = max(e_eval);
for i= 1:ps_subps_last
if rand < rand
wa_posnew(i,:)= wa_pos(i,:) + rand(1,dim).*(m_pos(m_gid,:)-wa_pos(i,:)) + rand(1,dim).*(wa_pos(i,:)-e_pos(e_oid,:));
else
j= randi([1, ps_subps_last]);
while j == i
j= randi([1, ps_subps_last]); % let j not equal to i
end
if wa_eval(1,j) < wa_eval(1,i)
wa_posnew(i,:)= wa_pos(i,:) + rand(1,dim).*(wa_pos(j,:)-wa_pos(i,:));
else
wa_posnew(i,:)= wa_pos(i,:) + rand(1,dim).*(wa_pos(i,:)-wa_pos(j,:));
end
end
end
end
end
posnew = [wo_posnew; f_posnew; e_posnew; m_posnew; wa_posnew];
posnew = ((posnew>=Xmin)&(posnew<=Xmax)).*posnew + (posnew<Xmin).*Xmin + (posnew>Xmax).*Xmax;
evalnew = feval(fhd,posnew',varargin{:});
%% update mechanism
bin = (eval > evalnew)';
pos(bin==1,:) = posnew(bin==1,:);
eval(bin==1) = evalnew(bin==1);
[gbestval,gbestid] = min(eval);
gbest = pos(gbestid,:);
if mod(iter,iter_max/50)==0
fprintf(f_out_convergence,'%.15f\t',gbestval-targetbest(Fid));
end
end
recordtime = toc;
fprintf(f_out_convergence,'\n');
fclose(f_out_convergence);
end
%微信公众号搜索:淘个代码,获取更多免费代码
%禁止倒卖转售,违者必究!!!!!
%唯一官方店铺:https://mbd.pub/o/author-amqYmHBs/work
%代码清单:https://docs.qq.com/sheet/DU3NjYkF5TWdFUnpu
参考文献
[1]Wang X, Chu S C, Snášel V, et al. Five Phases Algorithm: A Novel Meta-heuristic Algorithm and Its Application on Economic Load Dispatch Problem[J]. Journal of Internet Technology, 2023, 24(4): 837-848.
完整代码获取
后台回复关键词:
TGDM835
获取更多代码:
或者复制链接跳转:
https://docs.qq.com/sheet/DU3NjYkF5TWdFUnpu