本文为北海的数模课程学习笔记,课程出自微信公众号:数学建模BOOM。
求赞!求收藏!求关注!

粒子群算法(Particle Swarm Optimization, PSO)


若鸟群(粒子)太大:
计算开销增加: 粒子的数量增加会导致算法的计算开销增加,因为每个粒子都需要更新位置和速度,并计算适应度值。
收敛速度变慢: 当粒子数量很多时,群体中的信息交流和协作会变得更加复杂,导致收敛速度变慢。算法可能需要更多的迭代次数才能找到接近最优解的解决方案。
若鸟群(粒子)太小:
收敛速度快但易陷入局部最优: 少量的粒子会导致群体信息交流简单,可能会导致算法收敛速度加快,但容易陷入局部最优解。
不稳定性增加: 粒子数量少可能导致算法的性能在不同问题上表现不稳定,因为少量粒子的搜索策略可能无法适应多样的问题特性。

直接求解,或为这些问题的模型提供初始值或参数优化

个体(personal)最优解pbest:第i只鸟去过的适应度最高的位置
pbest中的最优解为全局(global)最优解gbest
第k次迭代后的速度=W*当前速度+C1*向pbest的方向移动+C2*向gbest的方向移动
(位移=速度*时间,算法中速度默认为1,因此位移=速度)


新位置=当前位置+位移量
迭代:重复步骤4~6
终止:输出最后的gbest和对应适应度
Schaffer函数:![\min f\left(x_1, x_2\right)=0.5+\frac{\left(\sin \sqrt{x_1^2+x_2^2}\right)^2-0.5}{\left[1+0.001\left(x_1^2+x_2^2\right)\right]^2}](https://1000bd.com/contentImg/2023/11/21/151542974.png)
求解, 在[0,10]范围内Schaffer的最小值。
- clear,clc,close all;
- % 定义变量
- x1 = (-10:0.05:10);
- x2 = (-10:0.05:10);
- [X1,X2] = meshgrid(x1,x2);% 建立网格,X1是每个格点的横坐标,X2是每个格点的纵坐标
- [m,n] = size(X1);
-
- % 把这个函数画出来,先求出函数值
- for i = 1:m
- for j = 1:n
- f(i,j) = PSO_Schaffer(X1(i,j),X2(i,j));
- end
- end
- mesh(X1,X2,f); % 创建schaffer的三维曲面图
- %粒子群算法中的三个参数
- w=0.5; % 惯性
- c1 = 1; % 个体经验
- c2 = 1; % 社会经验
-
- maxg = 200; % 迭代次数,太少解不稳定,太大浪费时间。越复杂的表达式,可设的越大
- N = 100; % 粒子数,一般50到1000都可以,若函数自变量范围越大,可把粒子数设的越多些
-
- Vmax = 1; % 速度范围,增加稳定性
- Vmin = -1;
- Xmax = 10; % 变量取值范围,根据定义域取
- Xmin = -10;
- dim = 2; % 适应度函数的维数,即函数表达式的自变量个数
-
- % 初始化N个粒子
- for i=1:N
- location(i,:)=Xmax*rands(1,dim); % 初始化坐标;rands求得-1到1之间的随机数
- V(i,:)=Vmax*rands(1,dim); % 初始化速度
- fitness(i)=PSO_Schaffer(location(i,1),location(i,2)); % 相应的适应度
- end
-
- % 个体最优解和群体最优解
- % fitnessgbest是最优解对应的函数值,bestindex是最优解对应的下标(即相应鸟的编号)
- [fitnessgbest,bestindex]=min(fitness); % 本题求最小值;fitnessgbest是全局最优解对应的适应度
- gbest=location(bestindex,:); % 全局最优解
- pbest=location; % 所有鸟的个体最优解,这是初始化,还没开始迭代
- fitnesspbest=fitness; % 所有鸟的个体最优解对应的适应度
迭代maxg轮,每轮更新N个粒子;
也可写成while循环,终止条件设为“连续10次全体最优解变化小于0.01”之类的。
- for i=1:maxg
- % 一轮迭代中,对每一个粒子进行处理
- for j=1:N
- % 根据惯性、个体最优pbest和群体最优gbest更新速度
- V(j,:) = w*V(j,:) + c1*(pbest(j,:) - location(j,:)) + c2*(gbest - location(j,:));
- % 限制速度不能过大
- for k = 1:dim
- if V(j,k) > Vmax
- V(j,k) = Vmax;
- elseif V(j,k) < Vmin
- V(j,k) = Vmin;
- end
- end
-
- % 更新位置
- location(j,:) = location(j,:) + V(j,:);
- % 限制位置不能超过边界
- for k = 1:dim
- if location(j,k) > Xmax
- location(j,k) = Xmax;
- elseif location(j,k) < Xmin
- location(j,k) = Xmin;
- end
- end
-
- %更新第j个粒子的适应度值
- fitness(j) = PSO_Schaffer(location(j,1),location(j,2));
- end
-
- for j = 1:N
- % 更新个体最优解
- if fitnesspbest(j) > fitness(j)
- pbest(j,:) = location(j,:);
- fitnesspbest(j) = fitness(j);
- end
-
- %群体最优更新
- if fitnessgbest > fitness(j)
- gbest = location(j,:);
- fitnessgbest = fitness(j);
- end
- end
- yy(i) = fitnessgbest;
- end
- %% 结果分析
- figure;
- plot(yy)
- title('群体最优适应度','fontsize',12);
- xlabel('迭代代数','fontsize',18);ylabel('适应度','fontsize',18);
- function Y = PSO_Schaffer(x1,x2)
- temp1 = x1^2 + x2^2;
- temp2 = sin(sqrt(temp1));
- Y = 0.5 + (temp2^2 - 0.5)/((1+0.001*temp1)^2);
- end