🌞欢迎来到智能优化算法的世界
🌈博客主页:卿云阁💌欢迎关注🎉点赞👍收藏⭐️留言📝
🌟本文由卿云阁原创!
🌠本阶段属于筑基阶段之一,希望各位仙友顺利完成突破
📆首发时间:🌹2021年11月07日🌹
✉️希望可以和大家一起完成进阶之路!
🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!
目录
0️⃣✨✨✨基本原理✨✨✨
一群鸟在随机搜索食物。在这个区域里只有一块食物。所有的鸟都不知道食物在那里。但是他们知道当前的位置离食物还有多远。那么找到食物的最优策略是什么呢。最简单有效的就是搜寻目前离食物最近的鸟的周围区域。
鸟群在整个搜寻的过程中,通过相互传递各自的信息,让其他的鸟知道自己的位置,通过这样的协作,来判断自己找到的是不是最优解,同时也将最优解的信息传递给整个鸟群,最终,整个鸟群都能聚集在食物源周围,即找到了最优解。
PSO中,每个优化问题的解都是搜索空间中的一只鸟。我们称之为“粒子”。所有的粒子都有一个由被优化的函数决定的适应值(fitness value),每个粒子还有一个速度决定他们飞翔的方向和距离。然后粒子们就追随当前的最优粒子在解空间中搜索。
PSO 初始化为一群随机粒子(随机解)。然后通过迭代找到最优解。在每一次迭代中,粒子通过跟踪两个"极值"来更新自己。第一个就是粒子本身所找到的最优解,这个解叫做个体极值pBest。另一个极值是整个种群目前找到的最优解,这个极值是全局极值gBest。另外也可以不用整个种群而只是用其中一部分作为粒子的邻居,那么在所有邻居中的极值就是局部极值。
1️⃣✨✨✨基本流程✨✨✨
Step1:初始化每个粒子的速度和位置;Step2:计算每个粒子的适应度值;
Step3:计算每个粒子的个体最优值;
Step4:计算整个群体的全局最优值;
Step5:对粒子的速度和位置进行初始化;
Step6:进行边界条件处理;
Step7:判断是否满足条件;
2️⃣✨✨✨主要步骤✨✨✨
4️⃣✨✨✨代码部分✨✨✨
在数学最优化中,Rosenbrock函数是一个用来测试最优化算法性能的非凸函数,由Howard Harry Rosenbrock在1960年提出。也称为Rosenbrock山谷或Rosenbrock香蕉函数,也简称为香蕉函数。
%%%%%%%%%%%%%%%%%粒子群算法求函数极值%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clear all; %清除所有变量 close all; %清图 clc; %清屏 N=100; %群体粒子个数 D=4; %粒子维数 T=200; %最大迭代次数 c1=1.5; %学习因子1 c2=1.5; %学习因子2 w=0.8; %惯性权重 Xmax=30; %位置最大值 Xmin=-30; %位置最小值 Vmax=10; %速度最大值 Vmin=-10; %速度最小值 %%%%%%%%%%%%%%%%初始化种群个体(限定位置和速度)%%%%%%%%%%%%%%%% x=rand(N,D) * (Xmax-Xmin)+Xmin; v=rand(N,D) * (Vmax-Vmin)+Vmin; %%%%%%%%%%%%%%%%%%初始化个体最优位置和最优值%%%%%%%%%%%%%%%%%%% p=x; pbest=ones(N,1); for i=1:N pbest(i)=func1(x(i,:)); end %%%%%%%%%%%%%%%%%%%初始化全局最优位置和最优值%%%%%%%%%%%%%%%%%% g=ones(1,D); gbest=inf; for i=1:N if(pbest(i)<gbest) g=p(i,:); gbest=pbest(i); end end gb=ones(1,T); %%%%%%%%%%%按照公式依次迭代直到满足精度或者迭代次数%%%%%%%%%%%%% for i=1:T for j=1:N %%%%%%%%%%%%%%更新个体最优位置和最优值%%%%%%%%%%%%%%%%% if (func1(x(j,:))<pbest(j)) p(j,:)=x(j,:); pbest(j)=func1(x(j,:)); end %%%%%%%%%%%%%%%%更新全局最优位置和最优值%%%%%%%%%%%%%%% if(pbest(j)<gbest) g=p(j,:); gbest=pbest(j); end %%%%%%%%%%%%%%%%%跟新位置和速度值%%%%%%%%%%%%%%%%%%%%% v(j,:)=w*v(j,:)+c1*rand*(p(j,:)-x(j,:))... +c2*rand*(g-x(j,:)); x(j,:)=x(j,:)+v(j,:); %%%%%%%%%%%%%%%%%%%%边界条件处理%%%%%%%%%%%%%%%%%%%%%% for ii=1:D if (v(j,ii)>Vmax) | (v(j,ii)< Vmin) v(j,ii)=rand * (Vmax-Vmin)+Vmin; end if (x(j,ii)>Xmax) | (x(j,ii)< Xmin) x(j,ii)=rand * (Xmax-Xmin)+Xmin; end end end %%%%%%%%%%%%%%%%%%%%记录历代全局最优值%%%%%%%%%%%%%%%%%%%%% gb(i)=gbest; end g; %最优个体 gb(end); %最优值 figure plot(gb) xlabel('迭代次数'); ylabel('适应度值'); title('适应度进化曲线') %%%%%%%%%%%%%%%%%%%适应度函数%%%%%%%%%%%%%%%%%%%% function result=func1(x) summ= sum(100*(x(:,2)-x(:,1).^2).^2+(1-x(:,1)).^2); result=summ; end