用于全局优化多模式函数的综合学习粒子群优化算法

介绍了一种名为CLPSO的粒子群优化算法变体,它采用了一种新颖的学习策略,利用其他粒子的历史最佳位置作为学习范例,以提高解决多模态优化问题的能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用于全局优化多模式函数的综合学习粒子群优化算法

作者:J. J. Liang, A. K. Qin, Student Member, IEEE, Ponnuthurai NagaratnamSuganthan, Senior Member, IEEE, and S. Baskar

 

Abstract—This paper presents a variant of particle swarmoptimizers (PSOs) that we call the comprehensive learning particle swarmoptimizer (CLPSO), which uses a novel learning strategy whereby all otherparticles’ historical best information is used to update a particle’s velocity.This strategy enables the

diversity of theswarm to be preserved to discourage premature convergence. Experiments wereconducted on multimodal test functions such as Rosenbrock, Griewank, Rastrigin,Ackley,and Schwefel and composition functions both with and without coordinaterotation. The results demonstrate good performance of the CLPSO in solvingmultimodal problems when compared with eight other recent variants of the PSO.IndexTerms—Composition benchmark functions, comprehensive learning particleswarm optimizer (CLPSO), global numerical

optimization, particle swarm optimizer (PSO).

 

摘要

本文介绍了粒子群优化器(PSO)的一种变体,我们将其称为综合学习粒子群优化器(CLPSO),它使用一种新颖的学习策略,其中所有其他粒子的历史最佳信息用于更新粒子的速度。 该策略使得能够保持群的多样性以防止过早收敛。 在多模式测试函数上进行了实验,例如Rosenbrock,Griewank,Rastrigin,Ackley和Schwefel以及有和没有坐标旋转的组合函数。结果表明,与PSO的其他八个变体相比,CLPSO在解决多模式问题方面具有良好的性能。

关键词:组合基准函数,综合学习粒子群优化器(CLPSO),全局数值优化,粒子群优化器(PSO)。

 

一、预备知识

无约束优化问题可以表述为一个D维的最小化问题,如下所示:

 

 

 


PSO模仿昆虫、动物、鸟类和鱼类学校的群体行为,这些群体以协作的方式寻找食物。群中的每个成员通过学习自己的经验和其他成员的经历来调整其搜索模式。 人们研究了这些现象并构建了数学模型。

1、 传统PSO

                                                                (1)

                                                                    

d维的第i个粒子的速度,为第d维的第i个粒子的位置。

 


pbesti是当前第i个粒子中,拥有最好的适度应值的位置。

 


gbest是群体中的最佳位置

c1和c2分别是将每个粒子导向pbest和gbest位置的随机加速常数。     和

       是两个在【0,1】之间的随机数。

有的学者用以下公式:                                                               

(2)

公式1有更大的搜索空间,因为独立地更新每个维度。公式2的搜索空间小些,因为相同的随机数被所有维度共用。

 

 

二、PSO的变形

其中一种变形引进了一种叫做惯性的参数w:

                                                                     

参数w是用来平衡全局和局部参数。大的w适合全局参数,相反适合局部参数。

 

三、综合学习PSO

虽然有很多PSO的变形,但是过早收敛的问题仍然未解决。在原始PSO中,每个粒子都同时从pbest和gbest学习。将向社会学习方面限制其只与gbest有关使得原始PSO快速收敛。然而,因为群中的所有粒子都从中学习,即使当前gbest远离全局最优值,如果搜索环境由许多局部解混合构成,则粒子可能很容易被吸引到该区域并陷入局部最优。接下来有三种使用综合学习PSO方法并且显著提升效果的方法。

新方法中我们采用如下的速度更新公式:

 

 


定义了粒子i应该采用哪个粒子的pbest,

可以是任何粒子的pbest所对应的维度,由概率Pc决定,也被叫做学习概率。对于粒子i的任何一个维度,都随机生成一个随机数.如果这个数字大于Pc,相应的维度就会从自身的pbest学习。否则,将会从其他的粒子的pbest学习。当从其他粒子中学习时,我们使用以下的锦标赛删选步骤。

(1)   我们先从population中随机选择两个速度没有被更新的粒子

(2)   比较这两个粒子的适应度并选择更好的那个。在本算法(CLPSO)中,我们定义适应度越大越好,这意味着当我们解决最小化问题的时候,我们会使用负函数的值作为适应度函数的值。

(3)   对于该维,我们使用胜者的pbest作为范例去学习。如果一个粒子的所有范例都是它自己的pbest,我们会随机选择其中的一维去学习另一个粒子的对应该维的pbest。求fi的细节如图。

所有的           都可以在搜索空间中利用从不同粒子的历史最佳位置中提取信息以生成新的位置,为了保证粒子从好的范例中学习并且最小化浪费在不好的方向的时间,我们让粒子从范例中学习直到增加至某些代,我们称之为更新代差m,才停止更新。

(1)所有的粒子pbest都能被作为导航粒子飞行方向的范例,而不是利用粒子自身的pbests和gbests作为范例。

(2)总体中的每个粒子都可以从不同维的不同pbests中学习一些代,而不是所有维都从一样的范例粒子中学习。换句话说,一个粒子的每一维都会不同粒子的pbest中相应维中学习。

(3)粒子中的每一维只从一个粒子中学习一些代。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                              

                                    

 

图1 第i个粒子范例的选择

 

 

四、CLPSO的搜索方式

在原先的PSO中,对于某些维度,如果pbest和gbest在当前位置的相对位置X,pbest和gbest也许会让粒子产生振荡。但是,gbest可能会有更大的惯性,因为             大于            ,因此gbest可能会影响粒子移动到它自己的方向,即使它在远离gest的局部最优值。如果两者位于当前位置的同一边,且如果指向一个局部最优值,粒子会向那个方向移动,但是一旦pbest和gbest处于一样的局部最优值的位置,那么粒子将不可能跳出局部最优值的区域。但是我们提出的新式算法中就能通过整个粒子群的协作式行为解决这种问题。

在同一维的搜索空间中,PSO和CLPSO的搜索空间如图,这个图展示了在X4位置的第四个粒子的三种不同的情况:

(a)                                                                                               和                     

(b)                                                                                               

 

(c)                                                                                                


(a)

 

                                 (b)

 (c)

PSO和CLPSO的第i个粒子的第d维空间长度是   和   。上面几种情况的空间长度如下:

其中不同的学习概率Pc会在不同问题上产生不同的结果。在未旋转的问题上,小的Pc表现的更好。然而在旋转问题上,不同的Pc值在不同的问题上表现出不同的最好解。Pc的值在单模式问题上不起作用,但是在多模式问题上有很大的影响。为了统一解决这种问题,我们就对每一个粒子设置一个Pc值。通过以下公式设置Pc。

图2  CLPSO算法

 

 

五、实验测试及结果:

1、测试主函数如下:

%test CLPSO

%editor luozu

%time:2016-12-25

%%

%参数设置:w=0.9-0.4,c=1.49445,flag>=7(refreshinggap)

clear all;

clc;

 

check_vel1=[];

position=[];

value=[];

real_iteration=[];

gbest_temp_val=[];

iteration=[];

num_FES=[];

gbest_val=[];

error_FES=[];

error_k=[];

fitness=[];

a=[];%画图

load Bounds;

S=1;F=5;R=1;

for i=S:F% problem

    fprintf('\nProblem =\t %d\n',i);%输出

%     for j=1:30 % runs 每个benchmark函数运行30次

   for j=1:R

     

        fprintf('run =\t %d\n',j)

       num_particle=40;range=Bounds(i,:);dimension=30;max_iteration=7500;max_FES=300000;func_num=i;                  

       [check_vel1,position(i,j,:),gbest_val(i,j,:),gbest_k_val(i,j,:),real_iteration(i,j),iteration(i,j),num_FES(i,j),fitness(i,j,:),error_FES(i,j,:),error_k(i,j,:)]=CLPSO3(num_particle,range,dimension,max_iteration,max_FES,func_num);

%         figure(i),plot(error_log);xlabel('iteration','fontsize',12);ylabel('log(Error)','fontsize',12);

   end

    file_name= [ 'CLPSO_PS_40_',num2str(i),'_30D_30runs.mat'];

    save (file_name);  

end

%%

error_k_log=log(error_k);%变成以e为底的数

error_FES_log=log(error_FES);

for i=S:F%画图

    a(i,:)=error_FES_log(i,1,:);

    figure(i)

    plot(a(i,:));

    title(['problem ' num2str(i)],'fontsize',12);

xlabel('FES','fontsize',12);ylabel('log(Error)','fontsize',12);%设置字体大小

end

 

使用的CLPSO 函数如下:

function[check_vel1,position,value,gbest_k_val,real_iteration,iteration,max_FES,fitness,error_FES,error_k]=CLPSO(num_particle,range,dimension,max_iteration,max_FES,func_num)

load fbias_data;

 

 

check_vel=[];

check_vel1=[];

gbest_k_val=zeros(max_iteration,1);

gbest_FES_val=zeros(max_FES,1);

gbest_FES_pos=zeros(max_FES,dimension);

error_FES=zeros(max_FES,1);

error_k=zeros(max_iteration,1);

num_g=num_particle;%种群规模40

real_k=0;

k=0; %迭代次数

fitcount=0;% 评价次数

fitness_data=zeros(1,max_FES);%1:30 0000

result=zeros(1,num_g); %1:40

 

%%

%======参数设置========

j=0:(1/(num_g-1)):1; % Learning Probability Curve Pc

j=j*10;

%Pc=ones(dimension,1)*(0.0+((0.25).*(exp(j)-exp(j(1)))./(exp(j(num_g))-exp(j(1)))));%学习概率

Pc=ones(dimension,1)*(0.05+((0.45).*(exp(j)-exp(j(1)))./(exp(j(num_g))-exp(j(1)))));%学习概率

% Weight=0.99-(1:max_iteration)*0.79/max_iteration;

Weight=0.9-(1:max_iteration)*0.5/max_iteration;

%K=3-(1:max_iteration)*1.5/max_iteration;%exploration子群加速度因子c公式与CLPSO一致

c=1.49445;

%%

%初始化

range_min=range(1)*ones(num_g,dimension);% Range for initial swarm's elements

range_max=range(2)*ones(num_g,dimension);

interval = range_max-range_min;

v_max=interval*0.2;

v_min=-v_max;

pos = range_min+ interval.*rand(num_g,dimension);%40个粒子,每个粒子30维

vel=v_min+(v_max-v_min).*rand(num_g,dimension); %速度初始化

for i=1:num_g

    result(i)=benchmark_func(pos(i,:),func_num);%计算粒子适应度

     fitcount=fitcount+1;

     fitness_data(fitcount)=result(i);

end

[gbest_val,g_index]=min(result);%gbest_val群体极值适应度

gbest_pos=pos(g_index,:);%群体极值位置

error_k(1)=abs(gbest_val-f_bias(func_num));

for i=1:fitcount

   error_FES(i)=abs(gbest_val-f_bias(func_num));

    gbest_FES_val(i)=gbest_val;

    gbest_FES_pos(i,:)=gbest_pos;

end

pbest_pos=pos;           %个体极值位置

pbest_val=result;        %个体极值适应度:1-40标号40个粒子的适应度

obj_func_slope=zeros(num_g,1);

fri_best=(1:num_g)'*ones(1,dimension);%40x30:列1-40

fri_best_pos=(1:num_g)'*ones(1,dimension);

%%       

for i=1:num_g % Updateding examplers

    fri_best(i,:)=i*ones(1,dimension);

friend1=ceil(num_g*rand(1,dimension));%分配30维的随机整数:随机取两个整数

friend2=ceil(num_g*rand(1,dimension));

   friend=(pbest_val(friend1)<pbest_val(friend2)).*friend1+(pbest_val(friend1)>=pbest_val(friend2)).*friend2;

       toss=ceil(rand(1,dimension)-Pc(:,i)');

    if toss==ones(1,dimension)

       temp_index=randperm(dimension);

       toss(1,temp_index(1))=0;

       clear temp_index;

    end

   

   fri_best(i,:)=(1-toss).*friend+toss.*fri_best(i,:);

    for d=1:dimension

       fri_best_pos(i,d)=pbest_pos(fri_best(i,d),d);

    end

end

 

while k<=max_iteration && fitcount<=max_FES

        k=k+1;

        real_k=real_k+1;

       delta=(c.*rand(num_g,dimension).*(fri_best_pos(1:num_g,:)-pos(1:num_g,:)));

        vel=Weight(k)*vel(1:num_g,:)+delta;

       vel=((vel<v_min(1:num_g,:)).*v_min(1:num_g,:))+((vel>v_max(1:num_g,:)).*v_max(1:num_g,:))+(((vel<v_max(1:num_g,:))&(vel>v_min(1:num_g,:))).*vel);

        pos=pos(1:num_g,:)+vel;  

         for i=1:num_g 

              if obj_func_slope(i)>=7

               fri_best(i,:)=i*ones(1,dimension);

               friend1=ceil(num_g*rand(1,dimension));

               friend2=ceil(num_g*rand(1,dimension));

               friend=(pbest_val(friend1)<pbest_val(friend2)).*friend1+(pbest_val(friend1)>=pbest_val(friend2)).*friend2;

               toss=ceil(rand(1,dimension)-Pc(:,i)');

                if toss==ones(1,dimension)

                   temp_index=randperm(dimension);

                    toss(1,temp_index(1))=0;

                    clear temp_index;

                end

               fri_best(i,:)=(1-toss).*friend+toss.*fri_best(i,:);

                for d=1:dimension

                   fri_best_pos(i,d)=pbest_pos(fri_best(i,d),d);

                end

                obj_func_slope(i)=0;

            end

            

            if(sum(pos(i,:)>range_max(i,:))+sum(pos(i,:)<range_min(i,:))==0)

               result(i)=benchmark_func(pos(i,:),func_num);

                 fitcount=fitcount+1;

                fitness_data(fitcount)=result(i);

             

                 if result(i)<pbest_val(i)

                   pbest_pos(i,:)=pos(i,:);  

                    pbest_val(i)=result(i);

                    obj_func_slope(i)=0;

                 else

                   obj_func_slope(i)=obj_func_slope(i)+1;

                 end

           

                if pbest_val(i)<gbest_val;

                    gbest_pos=pbest_pos(i,:);

                    gbest_val=pbest_val(i);

                    gbest_FES_val(fitcount)=gbest_val;

                   gbest_FES_pos(fitcount,:)=gbest_pos;

                else

                   gbest_FES_val(fitcount)=gbest_val;

                   gbest_FES_pos(fitcount,:)=gbest_pos;

                end

                error_FES(fitcount)=abs(gbest_FES_val(fitcount)-f_bias(func_num));

                if fitcount>=max_FES

                   break;

                end

            else

                pbest_pos(i,:)=pbest_pos(i,:);

            end

         end

      

         check_vel=[check_vel(sum(abs(vel'))/dimension)'];

         check_vel1=[check_vel1sum(check_vel(1:num_g,end))/num_g];

 

        error_k(k)=abs(gbest_val-f_bias(func_num));

         if mod(real_k,100)==0

             fprintf('\nreal_iteration=%d gbest=%e error=%e',real_k,gbest_val,abs(gbest_val-f_bias(func_num)));

         end

   

        

        if fitcount>=max_FES

            break;

        end

       

        if(k==max_iteration)&&(fitcount<max_FES)

            k=k-1;

        end       

end

check_vel1=check_vel1./(range(2)-range(1));

position=gbest_pos;

value=gbest_FES_val;

real_iteration=real_k;

iteration=k;

max_FES=fitcount;

fitness=fitness_data;

error_FES;

error_k;

end

 

 

使用的1-16函数如下:

Sphere function

Rosenbrock’s function

Ackley’s function

Griewanks’s function

Weierstrass function

Rastrigin’s function

NoncontinuousRastrigin’s function

Schwefel’s function

Rotated Ackley’sfunction

RotatedGriewanks’s function

Rotated Weierstrass function

Rotated Rastrigin’s function

Rotated noncontinuousRastrigin’s function

Rotated Schwefel’sfunction

 

 

2、实验结果:

使用前五个函数,横坐标为Fes(fitness evalutions),纵坐标为log(error)值,其结果为:

 

 

迭代过程:

可见,CLPSO有非常强的优化能力,能将问题的错误率从104降至10-14

 

下表展示了9种PSO变体在16种函数上的结果对比,结果为均值和协方差的值。从结果中,我们观察到对于A组单模式问题,由于CLPSO具有较大的潜在搜索空间,因此它无法像原始PSO一样快速收敛。CLPSO在所有三个多模式组上取得了比原始PSO更好的结果。CLPSO超越了函数4,5,7,8,10,12,13,14,15和16上的所有其他算法,特别是显着改进了函数7和8的结果。根据测试结果,这些结果与第二好的结果不同。CLPSO在函数6上获得了与CPSO-H相同的最佳结果,并且它们在这个函数上都比其他变体好得多。FIPS在多模态问题上也表现良好。 FIPS在功能3,9和11上的性能优于CLPSO。但是,当其他算法错过全局最优流域时,CLPSO在更复杂的问题上表现更好。Schwefel的函数是一个很好的例子,因为它捕获了局部最优的所有其他算法。CLPSO成功地避免陷入远离全局最优的深局部最优。在具有随机分布的局部和全局最优的两个组合函数中,CLPSO表现最佳。

 

 

 

六、总结

   本文介绍了一种采用新颖学习策略的综合学习PSO,其中其他粒子的先前最佳位置是任何粒子都可以学习的范例,粒子的每个维度都可以从不同的范例中学习。新策略使粒子有更多的学习范例和更大的潜在空间。从分析和实验中,我们观察到这种学习策略使CLPSO能够更有效地利用群体中的信息,与8种PSO变体相比,能够更频繁地生成质量更高的解决方案。基于九种算法的结果在16个选择的测试问题属于四个类别,我们可以得出结论,CLPSO显着提高了PSO的性能,并在大多数多模态问题上提供最佳性能,无论它们是未旋转还是旋转与其他八个PSO版本相比。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值