数学建模:18 粒子群算法

目录

基础的粒子群算法

流程图

核心公式

改进惯性权重

线性递减的惯性权重

非线性递减的惯性权重

自适应的惯性权重

随机的惯性权重

改进学习因子

压缩学习因子

非对称学习因子

改进:自动退出迭代

测试函数

Matlab 自带的粒子群函数 particleswarm

粒子群算法求解方程组

粒子群算法拟合多元函数

粒子群算法拟合微分方程


基础的粒子群算法

思想:

       搜索全局最优的过程中,由当前点向下一搜索位置前进的影响因素有:自身搜索过的最优解方向、鸟群得到的最优解方向、惯性

流程图

初始化参数:

n = 30;            % 粒子数量,粒子群算法的最大特点就是速度快,因此初始种群取50-1000都是可以的,虽然初始种群越大收敛性会更好,不过太大了也会影响速度;
narvs = 2;         % 变量个数
c1 = 2;            % 每个粒子的个体学习因子,也称为个体加速常数,文献表示取2合适
c2 = 2;            % 每个粒子的社会学习因子,也称为社会加速常数,文献表示取2合适
w = 0.9;           % 惯性权重,一般来说惯性权重取0.9‐1.2是比较合适的,一般取0.9就行
K = 100;           % 迭代的次数
vmax = [6 6];      % 粒子的最大速度:取变量可行域范围的10~20%
x_lb = [-15 -15];  % x的下界
x_ub = [15 15];    % x的上界

初始化粒子位置和速度(随机):

%% 初始化粒子的位置和速度
x = zeros(n,narvs);
for i = 1: narvs
    x(:,i) = x_lb(i) + (x_ub(i)-x_lb(i))*rand(n,1);    % 随机初始化粒子所在的位置在定义域内
end
v = -vmax + 2*vmax .* rand(n,narvs);  % 随机初始化粒子的速度(这里我们设置为[-vmax,vmax])

初始化该粒子的最优适应度对应的位置 pbest 为当前位置,全局最优位置 gbest 为 pbest 中最小的那个(因为求解的是最小值问题):

%% 计算适应度(注意,因为是最小化问题,所以适应度越小越好)
fit = zeros(n,1);  % 初始化这n个粒子的适应度全为0
for i = 1:n  % 循环整个粒子群,计算每一个粒子的适应度
    fit(i) = Obj_fun2(x(i,:));   % 调用Obj_fun2函数来计算适应度
end 
pbest = x;   % 初始化这n个粒子迄今为止找到的最佳位置(是一个n*narvs的向量)
ind = find(fit == min(fit), 1);  % 找到适应度最小的那个粒子的下标
gbest = x(ind,:);  % 定义所有粒子迄今为止找到的最佳位置(是一个1*narvs的向量)

核心公式

  • 最初提出的论文(没有惯性权重)中 c1、c2 取 2 比较合适最初提出的论文:Kennedy J , Eberhart R . Particle swarm optimization[C]// Proceedings of ICNN'95 ‐International Conference on Neural Networks. IEEE, 1995.
  • 惯性权重 0.9~1.2 合适,一般 0.9引入惯性权重的论文:SHI,Y. A Modified Particle Swarm Optimizer[C]// Proc. of IEEE ICEC conference, Anchorage. 1998.)

改进惯性权重

惯性权重大:利于全局搜索,不会陷入局部值

惯性权重小:倾向于局部最优值

算法前期应进行全局搜索,后期应局部搜索,所以 w 最好递减

线性递减的惯性权重

非线性递减的惯性权重

自适应的惯性权重

惯性权重和迭代次数、每个粒子的适应度有关

适应度大于平均适应度:惯性权重要大 ,因为这个解对应的适应度大,需要全局搜索

适应度小于平均适应度:惯性权重要小,因为这个解对应的适应度小,接近最优解(求最小值),需要局部搜索

随机的惯性权重

前面的惯性权重的缺点:迭代前期局部搜索能力不足、后期全局搜索能力不足

另一种随机:

改进学习因子

个体学习因子:在自身局部范围内搜索

社会学习因子:倾向于收敛到局部最优值

需要平衡,不能过早收敛也不能一直在自己范围里搜索

算法前期应 c1 大:局部搜索;后期 c2 大:倾向于收敛

压缩学习因子

非对称学习因子

算法前期应 c1 大:局部搜索;后期 c2 大:倾向于收敛

改进:自动退出迭代

当后期最优值基本不变,没必要一直迭代

设置一个计数器、函数变化量容忍度(变化误差范围)

测试函数

Matlab 自带的粒子群函数 particleswarm

Matlab  中  particleswarm  函数采用的是自适应邻域模式

自适应:

  • 邻域内粒子数越多,越偏向于全局搜索 —— 邻域模式,全局搜索(适应度又开始下降,应进入邻域模式,来进行全局搜索,以免陷入局部最优)
  • 邻域内粒子越少 —— 全局模式,局部搜索精准打击(当适应度停滞,应进行局部搜索,所以从邻域向全局模式转换,惯性系数 w 也应减小)

该函数如何自适应调整参数:

该函数怎么设置自动退出迭代:下面 6 中方法,前两种用的多

%% 求解函数y = x1^2+x2^2-x1*x2-10*x1-4*x2+60在[-15,15]内的最小值(最小值为8)
narvs = 2; % 变量个数
x_lb = [-15 -15]; % x的下界(长度等于变量的个数,每个变量对应一个下界约束)
x_ub = [15 15]; % x的上界
[x,fval,exitflag,output] = particleswarm(@Obj_fun2, narvs, x_lb, x_ub) 

%% 绘制最佳的函数值随迭代次数的变化图
options = optimoptions('particleswarm','PlotFcn','pswplotbestf')   
[x,fval] = particleswarm(@Obj_fun3,narvs,x_lb,x_ub,options)

%% 展示函数的迭代过程
options = optimoptions('particleswarm','Display','iter');
[x,fval] = particleswarm(@Obj_fun3,narvs,x_lb,x_ub,options)

%% 修改粒子数量,默认的是:min(100,10*nvars)
options = optimoptions('particleswarm','SwarmSize',50);
[x,fval] = particleswarm(@Obj_fun3,narvs,x_lb,x_ub,options)

%% 在粒子群算法结束后继续调用其他函数进行混合求解(hybrid  n.混合物合成物; adj.混合的; 杂种的;) 
options = optimoptions('particleswarm','HybridFcn',@fmincon);
[x,fval] = particleswarm(@Obj_fun3,narvs,x_lb,x_ub,options)

%% 惯性权重的变化范围,默认的是0.1-1.1
options = optimoptions('particleswarm','InertiaRange',[0.2 1.2]);
[x,fval] = particleswarm(@Obj_fun3,narvs,x_lb,x_ub,options)

%% 个体学习因子,默认的是1.49(压缩因子)
options = optimoptions('particleswarm','SelfAdjustmentWeight',2);
[x,fval] = particleswarm(@Obj_fun3,narvs,x_lb,x_ub,options)

%% 社会学习因子,默认的是1.49(压缩因子)
options = optimoptions('particleswarm','SocialAdjustmentWeight',2);
[x,fval] = particleswarm(@Obj_fun3,narvs,x_lb,x_ub,options)

%% 最大的迭代次数,默认的是200*nvars
options = optimoptions('particleswarm','MaxIterations',10000);
[x,fval] = particleswarm(@Obj_fun3,narvs,x_lb,x_ub,options)

%% 领域内粒子的比例 MinNeighborsFraction,默认是0.25 
options = optimoptions('particleswarm','MinNeighborsFraction',0.2);
[x,fval] = particleswarm(@Obj_fun3,narvs,x_lb,x_ub,options)

%% 函数容忍度FunctionTolerance, 默认1e-6, 用于控制自动退出迭代的参数
options = optimoptions('particleswarm','FunctionTolerance',1e-8);
[x,fval] = particleswarm(@Obj_fun3,narvs,x_lb,x_ub,options)

%% 最大停滞迭代数MaxStallIterations, 默认20, 用于控制自动退出迭代的参数
options = optimoptions('particleswarm','MaxStallIterations',50);
[x,fval] = particleswarm(@Obj_fun3,narvs,x_lb,x_ub,options)

%% 不考虑计算时间,同时修改三个控制迭代退出的参数
tic
options = optimoptions('particleswarm','FunctionTolerance',1e-12,'MaxStallIterations',100,'MaxIterations',100000);
[x,fval] = particleswarm(@Obj_fun3,narvs,x_lb,x_ub,options)
toc

%% 在粒子群结束后调用其他函数进行混合求解
tic
options = optimoptions('particleswarm','FunctionTolerance',1e-12,'MaxStallIterations',50,'MaxIterations',20000,'HybridFcn',@fmincon);
[x,fval] = particleswarm(@Obj_fun3,narvs,x_lb,x_ub,options)
toc

粒子群算法求解方程组

vpasolve:依赖初始值

fsolve:依赖初始值

particleswarm:

粒子群算法拟合多元函数

拟合工具箱只能对一维、二维函数进行拟合

       最小二乘法拟合的思想是让预测值与真实值的残差平方和最小,这里就可以把拟合问题转化成求使得残差平方和最小的参数,可用 fmincon (求解有条件约束求最小值)、fminuco / fminsearch(无约束最小值函数)、lsqcurvefit(非线性最小二乘拟合函数)等函数、粒子群算法

       使用粒子群算法不需要给出初始值,比较好,同时使用完粒子群算法后,可将结果作为其他函数如 fmincon 的初始值,混合使用

粒子群算法拟合微分方程

这里拟合的是只有数值解的微分方程

例题:使用网格搜索(即枚举法)、粒子群算法来寻找 SIR 模型中使得拟合效果最优的参数;上面两个方法求出来的参数固定,如何让参数是变化的

猜你喜欢

转载自blog.csdn.net/m0_54625820/article/details/128752500