1.算法描述
粒子群优化算法(Particle Swarm Optimization,PSO)最初由Kenndy和Eberhart博士于1995年提出,是一种有效的随机全局优化技术,具有原理简单、参数少、收敛速度较快等特点,可用于求解大部分优化问题。在PSO中,群中的每个粒子表示为向量。在投资组合优化的背景下,这是一个权重向量,表示每个资产的分配资本。矢量转换为多维搜索空间中的位置。每个粒子也会记住它最好的历史位置。对于PSO的每次迭代,找到全局最优位置。这是群体中最好的最优位置。一旦找到全局最优位置,每个粒子都会更接近其局部最优位置和全局最优位置。当在多次迭代中执行时,该过程产生一个解决该问题的良好解决方案,因为粒子会聚在近似最优解上。
Ray等人通过将PSO算法和Pareto排序机制想结合起来。采用Pareto排序法来选择一组精英解,全局最优粒子的选择则是采用轮盘赌方式从中选择。实际运行时,只有少量的个体选择概率大,种群多样性保持不好。Coello等在PSO算法中选择群体最佳位置则是通过引入Pareto竞争机制和微粒知识库。该知识库用于存储微粒在每次飞行循环后的飞行经验,知识库的更新是通过考虑一个基于地理学的系统,该系统是就每个微粒的目标函数值而言来定义的。这个知识库被微粒用来确定一个指导搜索的领导者。同时非劣解的确定是通过将候选个体与从种群中随机选出的比较集进行比较,因此比较集的参数对算法成功与否有着至关重要的影响。若参数过大,则容易发生早熟收敛的现象,而参数过小,则种群中选出的非劣解的数量可能过少。
PSO模拟的是鸟群的捕食行为。设想场景:一群鸟在随机搜索食物。在这个区域里只有一块食物。所有鸟都不知道食物在哪里。但是他们知道当前的位置距离食物还有多远。那么找到食物的最优策略是什么?最简单有效的就是搜寻目前离食物最近的鸟的周围区域。
鸟群在整个搜寻过程中,通过相互传递各自的信息,让其他鸟知道自己当前的位置,通过这样的协作来判断自己找到的是不是最优解,同时也将最优解的信息传递给整个鸟群,最终整个鸟群都能聚集在食物源的周围,即找到了最优解。
PSO中,每个优化问题的解都是搜索空间的一只鸟,我们称之为“粒子”。所有的粒子都有一个被优化的函数决定的适应值,每个粒子还有一个速度决定他们飞翔的方向和距离。然后粒子们就追随当前的最优粒子在解空间中搜索。
PSO初始化为一群随机粒子(随机解)。然后通过迭代找到最优解,在每一次迭代中,粒子通过跟踪两个“极值”来更新自己。第一个就是粒子本身所找到的最优解,这个解叫做个体极值。另一个极值是整个种群目前找到的最优解,这个极值是全局机制。另外也可以不用整个种群而只是用其中一部分作为粒子的邻居,那么在所有邻居中的极值就是局部极值。
PSO初始化为一群随机粒子(随机解)。然后通过迭代找到最优解。在每一次迭代中,粒子通过跟踪两个“极值(pbest和gbest)”来更新自己。在找到这两个最优值后,粒子通过下面的公式来更新自己的速度和位置。
对于公式(1):
公式(1)中的第一部分称为记忆项,表示上次速度大小和方向的影响;
公式(1)中的第二部分称为自身认知项,是从当前点指向粒子自身最好点的一个矢量,表示粒子的动作来源于自己经验的部分;
公式(1)中的第三部分称为群体认知项,是一个从当前点指向种群最好点的矢量,反映了粒子间的协调合作和知识共享。粒子就是通过自己的经验和同伴中最好的经验来决定下一步的运动。
但粒子群算法在现阶段无论是理论分析还是实践应用都尚未完全成熟,具有易陷入局部极小点,搜索精度不高等缺点,仍留有大量的问题值得研究。
为了摆脱粒子群算法易陷入局部极值的困境,本文将混沌优化方法引入到PSO算法中,提出了基于Hénon映射的混沌粒子群优化算法(CHPSO)。该算法保持了PSO算法结构简单的特点,改善了PSO算法的全局寻优能力,提高了算法的收敛速度和计算精度。
在对粒子群算法收敛性以及算法局限性进行深入分析的基础上,指出了可以提高算法性能的三种途径:提高收敛速度、摆脱停滞的束缚、增加种群多样性,并对每种途径都做了详细分析,同时还介绍了一些其它改进方法。 混沌优化方法是近年出现的一种新的优化技术,通常使用Logistic或Tent映射产生混沌序列进行搜索。CHPSO算法在克服粒子群算法搜索后期易陷入局部极值点的缺点的同时,保持了前期搜索的快速性。
2.仿真效果预览
matlab2022a仿真结果如下:
3.MATLAB核心程序
gap = 1:(NGen/50):NGen;
% Parameters of PSO
sNP = 8;
acc = [1.49445, 1.49445];
iwt = [0.9, 0.35]; % interia weight
for funcNum = 1
[Lb, Ub,dim] = funcRange(funcNum); % for objFunc: twenty-three benchmark functions
param = struct( 'ParicleNumber', sNP,...
'AccelerationConstants', acc,...
'InteriaWeight', iwt,...
'Dimension', dim,...
'Ub', Ub,...
'Lb', Lb);
for run = 1:3
rand('state',sum(100*clock))
tic
BestChart = CHPSO_func('objFunc',NGen,param,funcNum);
t = toc;
eval(['CHPSO_F',num2str(funcNum),'(:,run) = BestChart;']);
figure(1)
semilogy(gap,BestChart(gap),'-ok','linewidth',1.4,'Markersize',3);
title({strcat('\fontsize{12}\bf Function: F',num2str(funcNum));strcat('Currunt run time: ',num2str(run))});
xlabel('\fontsize{12}\bf Generation');
ylabel('\fontsize{12}\bf Best-so-far');
legend('\fontsize{10}\bf CHPSO');
fprintf('R = %2d, time = %5.2f, best-so-far = %.4e\n', run, t, BestChart(end))
end
end