混合萤火虫和粒子群优化算法(Matlab完整代码实现)

目录

 1 概述

 1.1 智能优化算法

 1.2 群智能算法

2 粒子群算法 

2.1 概念

2.1.1 粒子群优化算法思想

2.1.2 更新规则 

2.1.3 惩罚项

2.2 程序框图

3 萤火虫算法

3.1 思想来源

3.2 数学模型 

3.2.1 萤火虫相对荧光亮度

3.2.2 萤火虫吸引度

3.2.3 位置更新

3.3 算法步骤 

4 混合萤火虫和粒子群优化算法

5 Matlab代码实现

 

 1 概述

 1.1 智能优化算法

 1.2 群智能算法

2 粒子群算法 

2.1 概念

2.1.1 粒子群优化算法思想

       粒子群优化算法(PSO:Particle swarm optimization) 是一种进化计算技术(evolutionary computation)。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想:是通过群体中个体之间的协作和信息共享来寻找最优解.
  PSO的优势:在于简单容易实现并且没有许多参数的调节。目前已被广泛应用于函数优化、神经网络训练、模糊系统控制以及其他遗传算法的应用领域。

      粒子群算法思想来源于实际生活中鸟捕食的过程。假设在一个n维的空间中,有一群鸟(m只)在捕食,食物位于n维空间的某个点上,对于第i只鸟某一时刻来说,有两个向量描述,一个是鸟的位置向量,第二个是鸟的速度。假设鸟能够判断一个位置的好坏,所谓“好坏”,就是离食物更近了还是更远了。鸟在捕食的过程中会根据自己的经验以及鸟群中的其他鸟的位置决定自己的速度,根据当前的位置和速度,可以得到下一刻的位置,这样每只鸟通过向自己和鸟群学习不断的更新自己的速度位置,最终找到食物,或者离食物足够近的点。

     粒子群是比较经典的有自适应过程的算法,类似的有蝙蝠算法、布谷鸟算法、蜂群算法等,某个粒子的移动会参考历史最优和当前最优,可以通过设置c1、c2表示两者的重要程度,每个粒子移动的速度也是不一样的,速度也会收到w的影响,以上三者共同决定粒子下一步到达的位置。

2.1.2 更新规则 

       PSO初始化为一群随机粒子(随机解)。然后通过迭代找到最优解。在每一次的迭代中,粒子通过跟踪两个“极值”(pbest,gbest)来更新自己。在找到这两个最优值后,粒子通过下面的公式来更新自己的速度和位置。

  

其中:f为当前适应度函数的平均值;v为粒子速度;x为粒子位置;rand()为介于(0,1)之间的随机数;c1、c2是学习因子,通常c1=c2=2;best为当前最优解;bestx为历史最优解。

公式(1)的第一部分称为【记忆项】,表示上次速度大小和方向的影响;公式(1)的第二部分称为【自身认知项】,是从当前点指向粒子自身最好点的一个矢量,表示粒子的动作来源于自己经验的部分;公式(1)的第三部分称为【群体认知项】,是一个从当前点指向种群最好点的矢量,反映了粒子间的协同合作和知识共享。粒子就是通过自己的经验和同伴中最好的经验来决定下一步的运动。以上面两个公式为基础,形成了PSO的标准形式。


 公式(2)和 公式(3)被视为标准PSO算法

2.1.3 惩罚项

       惩罚项。它的思想类似线性规划内点法,都是通过增加罚函数,迫使模型在迭代计算的过程中始终在可行域内寻优。

       在粒子群算法中,每一步迭代都会更新 Pbest 和 Gbest,虽然可以将有约束问题转换为无约束问题进行迭代求解,但是问题的解 xi依然存在不满足约束条件的情况,因此需要编制一些规则来比较两

个粒子的优劣,规则如下

1.如果两个粒子 xi 和 xj 都可行,则比较其适应度函数 f(xi)和f(xj),值小的粒子为优。

2.当两个粒子 xi 和 xj 都不可行,则比较惩罚项 P(xi)和 P(xj), 违背约束程度小的粒子更优。

3.当粒子 xi 可行而粒子 xj 不可行,选可行解。对于粒子的上下限约束 可以体现在位置更新函数里,不必加惩 罚项。 具体思路就是遍历每一个粒子的位置,如果超除上下限,位置则更改为上下限中的任何一个位置

2.2 程序框图

2.2.1 伪代码 

3 萤火虫算法

3.1 思想来源

萤火虫算法(Fire-fly algorithm,FA)由剑桥大学 Yang 于 2009 年提出 , 作为最新的群智能优化算法之一 , 该算法具有更好的收敛速度和收敛精度 , 且易于工程实现等优点。

3.2 数学模型 

在FA 中 , 萤火虫发出光亮的主要目的是作为一个信号系统 , 以吸引其他的萤火虫个体 , 其假设为 : 1) 萤火虫不分性别 , 它将会被吸引到所有其他比它更亮的萤火虫那去 ; 2) 萤火虫的吸引力和亮度成正比 , 对
于任何两只萤火虫 , 其中一只会向着比它更亮的另一只移动 , 然而 , 亮度是随着距离的增加而减少的 ;3) 如果没有找到一个比给定的萤火虫更亮 , 它会随机移动 。

如上所述 , 萤火虫算法包含两个要素 , 即亮度和吸引度 . 亮度体现了萤火虫所处位置的优劣并决定其移动方向 , 吸引度决定了萤火虫移动的距离 , 通过亮度和吸引度的不断更新 , 从而实现目标优化 . 从数学角度对萤火虫算法的主要参数进行如下描述 :


3.2.1 萤火虫相对荧光亮度

                

其中 ,I_{0}为萤火虫的最大萤光亮度 , 与目标函数值相关 , 目标函数值越优自身亮度越高 ; \gamma为光强吸收系数 , 荧光会随着距离的增加和传播媒介的吸收逐渐减弱 ; r_{i,j}为萤火虫ij之间的空间距离 。
 

3.2.2 萤火虫吸引度

                

其中 , \beta _{0}为最大吸引度 ; \gamma为光强吸收系数 ;r_{i,j}为萤火虫ij之间的空间距离。

3.2.3 位置更新

萤火虫i被吸引向萤火虫j移动的位置更新公式如下式所示 : 

 其中 , x_{i},x_{j}为萤火虫ij所处的空间位置 ; α∈[0,1] 为步长因子 ;rand 为 [0,1] 上服从均匀分布的随机数 。

3.3 算法步骤 

(1) 初始化萤火虫算法参数.

(2) 计算各萤火虫的亮度并排序得到亮度最大的萤火虫位置.

(3)判断迭代是否结束:判断是否达到最大迭代次数 T ,达到则转(4),否则转(5).

(4) 输出亮度最大的萤火虫位置及其亮度.

(5) 更新萤火虫位置:根据式(3)更新萤火虫的位置,对处在最佳位置的萤火虫进行随机扰动,搜索次数增加1 ,转(2),进行下一次搜索.

4 混合萤火虫和粒子群优化算法

混合萤火虫和粒子群优化,是一种元启发式搜索优化算法,可以对非线性问题搜索最优解,收敛速度快(粒子群算法有点),不会陷入局部最优(萤火虫算法优点) 。

5 Matlab代码实现

%====欢迎关注公众号:电力系统与算法之美===============
%===回复关键字:混合萤火虫和粒子群优化算法=====
%====即可领取全部代码============
function [f_valc, xc]=hfpso_v3(iter,swarm_size,c1,c2,LB,UB,D,vmax_coef,func_no,fhd)


rand('state', sum(100*clock));

v_max= vmax_coef* (UB-LB);
v_min=-v_max;

for sw=1:swarm_size
    for ds=1:D
particles_x(sw,ds)=LB+rand*(UB-LB);
particles_v(sw,ds)=v_min+rand*(v_max-v_min);
    end
end



for piiz=1:swarm_size
f_val(piiz,1)=feval(fhd,particles_x(piiz,:),func_no,D);
end

p_best=particles_x;
p_best_val=f_val;
[~,index]= min(f_val(:,1));
g_best=particles_x(index,:);
g_best_val=f_val(index,1);
dmax = (UB-LB)*sqrt(D);

for i=1:iter
w_linear = 0.9-((0.9-0.5)/iter)*i; %线性递减惯性权重
    w=w_linear;
    
for j=1:swarm_size
 
 if (i>2) && (f_val(j,1)<=g_best_val_t(i-2,:))
    
 rij=norm(particles_x(j,:) - g_best_t(i-2,:))/dmax;
alpha=0.2;
beta0=2; 
m=2;
gamma=1;
beta=beta0*exp(-gamma*rij.^m);  
e=rand(1,D)-1/2;
prev_pos=particles_x(j,:);
particles_x(j,:)= particles_x(j,:)+ beta.*(particles_x(j,:)- g_best_t(i-2,:) )+ alpha.*e;
for k=1:D
   if particles_x(j,k)>UB
       particles_x(j,k)=UB; 
   end
       if particles_x(j,k)<LB
           particles_x(j,k)=LB; 
       end
end
particles_v(j,:)=  particles_x(j,:)-prev_pos;
 
for k=1:D
   if particles_v(j,k)>v_max
       particles_v(j,k)=v_max; 
   end
       if particles_v(j,k)<v_min 
           particles_v(j,k)=v_min;
       end 
end
     
    else
       
    for k=1:D
    r1=rand();
    r2=rand();
    
particles_v(j,k)=w*particles_v(j,k)+c1*r1*(p_best(j,k)-particles_x(j,k))+c2*r2*(g_best(1,k)-particles_x(j,k)); 
    end

  for k=1:D
   if particles_v(j,k)>v_max
       particles_v(j,k)=v_max; 
   end
       if particles_v(j,k)<v_min
           particles_v(j,k)=v_min;
       end
  end


particles_x(j,:)=particles_x(j,:)+particles_v(j,:);

for k=1:D
   if particles_x(j,k)>UB
       particles_x(j,k)=UB; 
   end
       if particles_x(j,k)<LB
           particles_x(j,k)=LB; 
       end
end

 end
end


for piiz=1:swarm_size
f_val(piiz,1)=feval(fhd,particles_x(piiz,:),func_no,D);
end

for j=1:swarm_size
    
if f_val(j,1)<p_best_val(j,1)
p_best(j,:)=particles_x(j,:);
p_best_val(j,1)=f_val(j,1);
end

if p_best_val(j,1)<g_best_val
g_best=particles_x(j,:);
g_best_val=p_best_val(j,1);
end

end

g_best_t(i,:)=g_best;
g_best_val_t(i,:)=g_best_val;

variabless(i,:)=g_best;
valuess(i,1)=g_best_val;
%disp(['Iteration ' num2str(i) ': Best Cost = ' num2str(valuess(i,1))]);

end

xc=variabless(iter,:);
f_valc=valuess(iter,:);

end

猜你喜欢

转载自blog.csdn.net/weixin_46039719/article/details/125572823