MATLAB自带的粒子算法
一.概述
Matlab自带的这个函数优化的特别好,运行速度快且找到的解也比较精准,但是内部的实现比较复杂,后面我们会简单介绍这个函数的实现思路。
(代码如何跑得快:少写循环和判断语句,多基于矩阵运算来进行操作)
注意:
(1) 这个函数在R2014b版本后推出,之前的老版本Matlab中不存在。
(2) 这个函数是求最小值的,如果目标函数是求最大值则需要添加负号从而转换为求最小值
二.细节详解
1.概念
Matlab中particleswarm函数采用的是自适应的邻域模式
搜索初期使用邻域模式较好,后期使用全局模式
2.预设参数的选取
(1)粒子个数 SwarmSize:默认设置为: min{100,10nvars}, nvars是变量个数
(2)惯性权重 InertiaRange
默认设置的范围为:[0.1,1.1],注意,在迭代过程中惯性权重会采取自适应措施,随着迭代过程不断调整。
(3)个体学习因子 SelfAdjustmentWeight:默认设置为:1.49 (和压缩因子的系数几乎相同)
(4)社会学习因子 SocialAdjustmentWeight:默认设置为:1.49 (和压缩因子的系数几乎相同)
(5)邻域内粒子的比例 MinNeighborsFraction
默认设置为:0.25
由于采取的是邻域模式,因此定义了一个“邻域最少粒子数目”:
minNeighborhoodSize = max{2,(粒子数目邻域内粒子的比例)的整数部分},
在迭代开始后,每个粒子会有一个邻域,初始时邻域内的粒子个数(记为Q)就等于“邻域最少粒子数目”,后续邻域内的粒子个数Q会自适应调整。
3.变量初始化和适应度的计算
(1)速度初始化: 和我们之前的类似,只不过最大速度就是上界和下界的差额
vmax = ub – lb; v = ‐vmax + 2vmax . rand(n,narvs);
(2)位置初始化: 和我们之前的类似会将每个粒子的位置均匀分布在上下界约束内
(3)计算每个粒子的适应度
适应度仍设置为我们要优化的目标函数,由于该函数求解的是最小值问题,因此,最优解应为适应度最小即目标函数越小的解。
(4)初始化个体最优位置和我们自己写的代码一样,因为还没有开始循环,因此这里的个体最优位置就是我们初始化得到的位置。
(5)初始化所有粒子的最优位置
因为每个粒子的适应度我们都已经求出来了,所以我们只需要找到适应度最低的那个粒子,并记其位置为所有粒子的最优位置。
4.更新粒子的速度和位置
5.自适应调整参数
自适应体现在: 如果适应度开始停滞时,粒子群搜索会从邻域模式向全局模式转换,一旦适应度开始下降,则又恢复到邻域模式,以免陷入局部最优。 当适应度的停滞次数足够大时,惯性系数开始逐渐变小,从而利于局部搜索。
6.自动退出迭代循环
7.修改函数的参数
%% 求解函数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)
%% 直接调用particleswarm函数进行求解测试函数
narvs = 30; % 变量个数
% Sphere函数
% x_lb = -100*ones(1,30); % x的下界
% x_ub = 100*ones(1,30); % x的上界
% Rosenbrock函数
x_lb = -30*ones(1,30); % x的下界
x_ub = 30*ones(1,30); % x的上界
% Rastrigin函数
% x_lb = -5.12*ones(1,30); % x的下界
% x_ub = 5.12*ones(1,30); % x的上界
% Griewank函数
% x_lb = -600*ones(1,30); % x的下界
% x_ub = 600*ones(1,30); % x的上界
[x,fval,exitflag,output] = particleswarm(@Obj_fun3,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
8.函数参数修改的建议
三.粒子群算法的后续讨论
(1)粒子群算法可以解决非线性约束问题吗?
在适应度函数上构造惩罚项, 对违反约束的情况进行惩罚, 将有约束的优化问题转化为无约束的优化问题
(2)粒子群算法可以解决组合优化问题吗?