目录
基础的粒子群算法
流程图
核心公式
改进惯性权重
线性递减的惯性权重
非线性递减的惯性权重
自适应的惯性权重
随机的惯性权重
改进学习因子
压缩学习因子
非对称学习因子
改进:自动退出迭代
测试函数
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
自适应:
- 邻域内粒子数越多,越偏向于全局搜索 —— 邻域模式,全局搜索(适应度又开始下降,应进入邻域模式,来进行全局搜索,以免陷入局部最优)
- 邻域内粒子越少 —— 全局模式,局部搜索精准打击(当适应度停滞,应进行局部搜索,所以从邻域向全局模式转换,惯性系数 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 的初始值,混合使用
粒子群算法拟合微分方程
这里拟合的是只有数值解的微分方程文章来源:https://www.toymoban.com/news/detail-462748.html
例题:使用网格搜索(即枚举法)、粒子群算法来寻找 SIR 模型中使得拟合效果最优的参数;上面两个方法求出来的参数固定,如何让参数是变化的文章来源地址https://www.toymoban.com/news/detail-462748.html
到了这里,关于数学建模:18 粒子群算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!