0.前言
上一篇文章主要对基于反向学习的改进粒子群算法原理及matlab代码进行讲解,并将改进后粒子群算法的寻优能力进行测试。上篇文章链接如下:https://blog.csdn.net/hbdlhy/article/details/134035085
该篇文章同样基于上部分改进方向,针对群体智能算法中的种群初始化部分进行改进讲解,本次主要介绍基于Tent混沌映射的改进粒子群优化算法。
1.Tent混沌映射原理
混沌映射特别适用于优化算法的初始化种群,用混沌映射代替随机参数使得算法能够在搜索空间中生成具有良好多样性的初始解。高质量的初始种群对算法的收敛速度和求解精度等性能有很大的帮助。 Tent混沌映射具体步骤如下: (1)确定混沌参数%基于Tent映射的种群初始化function%20x_apply%20=%20Tent_int(dim,a,Lb,Ub)x(1,1)=(Lb(1,1)+rand()*(Ub(1,1)-Ub(1,1)))/Ub(1,1);%20%初始点%根据Tent映射函数,生成后续初始种群for%20i=1:dim-1%20%20%20%20if%20x(i)<a%20%20%20%20%20%20%20%20x(i+1)=2*x(i);%20%20%20%20elseif%20x(i)>=a%20%20%20%20%20%20%20%20x(i+1)=2*(1-x(i))%20;%20%20%20%20endend%获取在粒子边界约束内的种群解x_apply=x.*Ub;%粒子边界约束检查I=x_apply<Lb;x_apply(I)=Lb(I);U=x_apply>Ub;x_apply(U)=Ub(U);end
%20%202.基于Tent混沌映射的改进粒子群算法
%20%20%20 %20 %20 %20第1节主要对Tent混沌映射原理及matlab代码复现进行讲解,该部分将Tent混沌映射初始化与传统粒子群算法相结合,实现基于Tent混沌映射的改进粒子群算法,具体matlab代码如下所示:
%20%20%%%20基于Tent混沌映射的改进粒子群算法主程序clc;clear%20all;close%20all%%%20算法基本参数设置c1=2;%20%学习因子1c2=2;%学习因子2w=0.7;%惯性权重MaxDT=500;%最大迭代次数D=3;%搜索空间维数(未知数个数)N=30;%初始化群体个体数目Lb=[-100,-100,-100];%种群解的下限Ub=[100,100,100];%种群解的上限Vmax=[1,1,1];%速度上限Vmin=[-1,-1,-1];%速度下限a=0.5;%Tent混沌系数,0~1之间Best_f=[];pop=[];%%%20基于Tent混沌映射的种群初始化for%20L=1:N%20%20%20%20pop(L,:)%20=%20Tent_int(D,a,Lb,Ub);%20%20%20%20Best_f(1,L)=fitness_obl(pop(L,:));endV=rand(N,D);%计算各个粒子的适应度值并初始化Pi和Pg[fitnessgbest%20bestindex]=min(Best_f);gbest=pop(bestindex,:);pbest=pop;fitnesspbest=Best_f;%20%%%20粒子群算法更新迭代部分for%20i=1:MaxDT%20%20%20%20for%20j=1:N%20%20%20%20%20%20%20%20%种群更新%20%20%20%20%20%20%20%20V(j,:)=w*V(j,:)+c1*rand*(pbest(j,:)-pop(j,:))+c2*rand*(gbest-pop(j,:));%20%20%20%20%20%20%20%20%更新速度边界检查%20%20%20%20%20%20%20%20I=V(j,:)<Vmin;%20%20%20%20%20%20%20%20V(j,I)=Vmin(I);%20%20%20%20%20%20%20%20U=V(j,:)>Vmax;%20%20%20%20%20%20%20%20V(j,U)=Vmax(U);%20%20%20%20%20%20%20%20pop(j,:)=pop(j,:)+V(j,:);%20%20%20%20%20%20%20%20%粒子边界检查%20%20%20%20%20%20%20%20PI=pop(j,:)<Lb;%20%20%20%20%20%20%20%20pop(j,PI)=Lb(PI);%20%20%20%20%20%20%20%20PU=pop(j,:)>Ub;%20%20%20%20%20%20%20%20pop(j,PU)=Ub(PU);%20%20%20%20%20%20%20%20%计算更新后种群的适应度函数值%20%20%20%20%20%20%20%20%20%20%20%20%20Best_f(j)=fitness_obl(pop(j,:));%20%20%20%20%20%20%20%20%20%个体极值更新%20%20%20%20%20%20%20if%20Best_f(j)<fitnesspbest(j)%20%20%20%20%20%20%20%20%20%20%20%20pbest(j,:)=pop(j,:);%20%20%20%20%20%20%20%20%20%20%20%20fitnesspbest(j)=Best_f(j);%20%20%20%20%20%20%20end%20%20%20%20%20%20%20%20%全局极值更新%20%20%20%20%20%20%20if%20Best_f(j)<fitnessgbest%20%20%20%20%20%20%20%20%20%20%20gbest=pop(j,:);%20%20%20%20%20%20%20%20%20%20%20fitnessgbest=Best_f(j);%20%20%20%20%20%20%20%20%20end%20%20%20%20%20%20%20%20%20%20%20end%20%20%20%记录粒子全局最优解%20%20%20Fgbest(i)=fitnessgbest;%20%20%20end%%%20结果可视化figureplot(Fgbest)title(['适应度曲线%20'%20'终止次数='%20num2str(MaxDT)]);xlabel('进化代数');ylabel('适应度')
%20%20%20 %20 %20 %20为了验证改进后粒子群算法寻优效果,同时对各改进方式进行对比,本文应用第二期相同测试函数对改进后粒子群算法性能进行对比,具体测试函数及相关matlab文件见第二期“基于反向学习的改进粒子群算法”,链接如下:https://blog.csdn.net/hbdlhy/article/details/134035085
%20%20%20 %20 %20 %20基于上述测试函数,运行10次后目标函数值及适应度曲线如下所示:
%20%20图1 基于Tent映射的改进粒子群算法迭代曲线
表1 改进前后不同算法适应度函数对比
运行次数 | 基于反向学习改进后 | 标准粒子群算法 | 基于Tent映射改进后 |
1 | 3.36E-31 | 0.0831 | 3.71E-29 |
2 | 1.82E-29 | 0.0547 | 5.55E-31 |
3 | 1.85E-32 | 0.0294 | 3.24E-28 |
4 | 2.74E-29 | 0.0119 | 2.26E-28 |
5 | 3.08E-33 | 0.0477 | 1.02E-28 |
6 | 2.28E-29 | 0.0399 | 3.00E-28 |
7 | 7.67E-31 | 0.0459 | 3.73E-29 |
8 | 2.90E-31 | 0.0235 | 8.03E-28 |
9 | 1.26E-31 | 0.0043 | 4.35E-29 |
10 | 1.39E-31 | 0.0532 | 8.26E-30 |
均值 | 7.01E-30 | 0.03936 | 1.88215E-28 |
最小值 | 3.08E-33 | 0.0043 | 5.54668E-31 |
最大值 | 2.74E-29 | 0.0831 | 8.03128E-28 |
根据表中结果可知,基于Tent映射改进后粒子群算法的寻优能力明显增强,但在该测试函数下,运行10次后其性能与基于反向学习的改进策略略有差距。但算法寻优能力在不同适应度函数下的表现不同,因此大家可自行使用其他经典测试函数进行测试对比,本文暂不对其余测试函数进行对比补充。
3.后续改进
本部分仅对种群初始化部分进行介绍,后续该部分将在种群更行迭代部分,对t分布自适应变异、Levy飞行策略等改进方法进行讲解,感谢大家耐心阅读,本文代码改进部分均为作者自身复现,谢绝转载,严禁以此进行二次售卖。
作者主要更新方向为:
(1)智能算法复现及改进;
(2)微电网/综合能源系统容量配置、优化调度等方向
(3)时间序列预测(机器学习、深度学习方向)
欢迎大家相互交流,另作者水平有限,难免存在疏忽之处,若有错误请大家指正,谢谢。