MATLAB 自带 Particle Swarm Optimization(PSO)工具箱 ,核心函数是 particleswarm ,属于 Global Optimization Toolbox 。下面从原理 → 参数 → 代码实战 → 高级用法 → 常见问题系统讲解。
一、PSO 核心原理(快速回顾)
**粒子群优化(PSO)**是一种群体智能优化算法,模仿鸟群觅食行为:
- 每个"粒子"代表一个候选解
- 粒子根据自身历史最优(
pbest)和群体历史最优(gbest)更新位置和速度 - 通过迭代逼近全局最优解
更新公式:
vit+1=wvit+c1r1(pbesti−xit)+c2r2(gbest−xit) v_i^{t+1} = w v_i^t + c_1 r_1 (pbest_i - x_i^t) + c_2 r_2 (gbest - x_i^t) vit+1=wvit+c1r1(pbesti−xit)+c2r2(gbest−xit)
xit+1=xit+vit+1 x_i^{t+1} = x_i^t + v_i^{t+1} xit+1=xit+vit+1
| 参数 | 含义 |
|---|---|
| www | 惯性权重 |
| c1c_1c1 | 个体学习因子 |
| c2c_2c2 | 社会学习因子 |
| r1,r2r_1, r_2r1,r2 | 0,1 随机数 |
二、MATLAB PSO 工具箱核心函数
1、主函数:particleswarm
matlab
[x, fval, exitflag, output] = particleswarm(fun, nvars)
| 参数 | 说明 |
|---|---|
fun |
目标函数(最小化) |
nvars |
变量维度 |
x |
最优解 |
fval |
最优函数值 |
exitflag |
退出标志 |
output |
迭代信息 |
三、基础示例:无约束函数寻优
示例 1:Sphere 函数(经典测试函数)
f(x)=∑i=1nxi2 f(x) = \sum_{i=1}^{n} x_i^2 f(x)=i=1∑nxi2
全局最小值:f(0,...,0) = 0
matlab
clc; clear; close all;
%% 1. 定义目标函数
fun = @(x) sum(x.^2);
%% 2. PSO 参数
nvars = 5; % 变量维度
lb = -10 * ones(1,nvars); % 下界
ub = 10 * ones(1,nvars); % 上界
options = optimoptions('particleswarm', ...
'SwarmSize', 50, ... % 粒子数
'MaxIterations', 100, ... % 最大迭代次数
'Display', 'iter', ... % 显示迭代信息
'HybridFcn', @fmincon); % 混合局部搜索(提高精度)
%% 3. 调用 PSO
[x_best, fval] = particleswarm(fun, nvars, lb, ub, options);
%% 4. 输出结果
fprintf('最优解 x = \n');
disp(x_best);
fprintf('最优函数值 f(x) = %.6e\n', fval);
四、带约束的 PSO 寻优
示例 2:带不等式约束的优化问题
minf(x)=x12+x22 \min f(x) = x_1^2 + x_2^2 minf(x)=x12+x22
s.t.x1+x2≥1 s.t.\quad x_1 + x_2 \ge 1 s.t.x1+x2≥1
matlab
clc; clear;
%% 目标函数
fun = @(x) x(1)^2 + x(2)^2;
%% 非线性约束
nonlcon = @(x) deal([], 1 - x(1) - x(2)); % c(x) ≤ 0
%% 变量边界
lb = [0, 0];
ub = [5, 5];
%% PSO 参数
options = optimoptions('particleswarm', ...
'SwarmSize', 40, ...
'MaxIterations', 80, ...
'Display', 'final');
%% 求解
[x_best, fval] = particleswarm(fun, 2, lb, ub, options);
% 使用 fmincon 精修
[x_refined, fval_refined] = fmincon(fun, x_best, [], [], [], [], lb, ub, nonlcon);
fprintf('PSO 结果: f = %.4f\n', fval);
fprintf('精修结果: f = %.4f\n', fval_refined);
五、工程级 PSO 参数配置(非常重要)
推荐参数组合(经验值)
| 参数 | 推荐值 | 说明 |
|---|---|---|
SwarmSize |
30--100 | 粒子越多越稳,但越慢 |
MaxIterations |
50--500 | 维度越高,迭代越多 |
InertiaRange |
0.1, 1.1 | 自适应惯性权重 |
SelfAdjustmentWeight |
1.5 | c1c_1c1 |
SocialAdjustmentWeight |
1.5 | c2c_2c2 |
HybridFcn |
@fmincon |
强烈推荐 |
参数设置模板(直接可用)
matlab
options = optimoptions('particleswarm', ...
'SwarmSize', 60, ...
'MaxIterations', 200, ...
'InertiaRange', [0.2, 1.0], ...
'SelfAdjustmentWeight', 1.49, ...
'SocialAdjustmentWeight', 1.49, ...
'MinNeighborsFraction', 0.25, ...
'Display', 'iter', ...
'PlotFcn', @pswplotbestf, ...
'HybridFcn', {@fmincon});
六、多目标 PSO(MOPSO)
MATLAB 原生 particleswarm 不支持多目标,但可手动实现权重法:
fmulti=w1f1+w2f2 f_{multi} = w_1 f_1 + w_2 f_2 fmulti=w1f1+w2f2
matlab
fun1 = @(x) x(1)^2 + x(2)^2;
fun2 = @(x) (x(1)-2)^2 + (x(2)-2)^2;
w1 = 0.6; w2 = 0.4;
fun_multi = @(x) w1*fun1(x) + w2*fun2(x);
[x_best, fval] = particleswarm(fun_multi, 2, [0 0], [5 5]);
参考代码 基于PSO工具箱的函数寻优算法 www.youwenfan.com/contentcsv/79169.html
七、PSO 在工程优化中的典型应用
1、神经网络权值优化(替代 BP)
matlab
% 定义 NN 权值编码
fun = @(w) neural_network_loss(w, X_train, Y_train);
lb = -5 * ones(size(w0));
ub = 5 * ones(size(w0));
w_best = particleswarm(fun, length(w0), lb, ub);
2、SVM / 机器学习超参数寻优
matlab
fun = @(params) svm_cross_validation(params, X, Y);
% params = [C, gamma]
lb = [0.1, 0.01];
ub = [100, 10];
best_params = particleswarm(fun, 2, lb, ub);
3、控制系统 PID 参数整定
matlab
fun = @(K) pid_cost_function(K, plant_model);
K_best = particleswarm(fun, 3, [0 0 0], [10 10 10]);
八、PSO 与 GA、DE 的对比
| 算法 | 收敛速度 | 全局搜索 | 参数敏感性 | 工程推荐 |
|---|---|---|---|---|
| PSO | ⭐⭐⭐⭐ | ⭐⭐⭐ | 低 | 首选 |
| GA | ⭐⭐ | ⭐⭐⭐⭐ | 高 | 备选 |
| DE | ⭐⭐⭐ | ⭐⭐⭐⭐ | 中 | 复杂问题 |
工程经验:
90% 的工程优化问题,PSO + fmincon 混合策略是最优解。
九、完整工程模板
matlab
clc; clear; close all;
%% 1. 问题定义
fun = @(x) x(1)^2 + x(2)^2 + sin(3*x(1)+x(2));
nvars = 2;
lb = [-5, -5];
ub = [5, 5];
%% 2. PSO 参数
options = optimoptions('particleswarm', ...
'SwarmSize', 80, ...
'MaxIterations', 150, ...
'InertiaRange', [0.2, 1.0], ...
'SelfAdjustmentWeight', 1.49, ...
'SocialAdjustmentWeight', 1.49, ...
'Display', 'iter', ...
'PlotFcn', @pswplotbestf, ...
'HybridFcn', @fmincon);
%% 3. 优化
[x_best, fval] = particleswarm(fun, nvars, lb, ub, options);
%% 4. 结果
fprintf('最优解: x1=%.4f, x2=%.4f\n', x_best(1), x_best(2));
fprintf('最优值: f=%.6e\n', fval);