数学建模更新16(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)粒子群算法可以解决组合优化问题吗?
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值