存在一个三维面,其函数表达式为y = x1^2 + (1+x1).sin(x2) - 5x1+ 8*x2 + 373;
x1、x2的定义域均为[-20,20],
通过粒子群算法求出最小值
可以看出,最小值大体位于红圈的区域。
代码(主函数):
%% 自适应权重与压缩因子PSO
clear; clc
%% 绘制函数的图形
x1 = -20:1:20;
x2 = -20:1:20;
[x1,x2] = meshgrid(x1,x2);
y = x1.^2 + (1+x1).*sin(x2) - 5*x1 + 8*x2 + 373;
mesh(x1,x2,y)
xlabel('x1'); ylabel('x2'); zlabel('y'); % 加上坐标轴的标签
axis vis3d % 冻结屏幕高宽比,使得一个三维对象的旋转不会改变坐标轴的刻度显示
hold on % 不关闭图形,继续在上面画图
%% 粒子群算法中的预设参数(参数的设置不是固定的,可以适当修改)
n = 44; % 粒子数量
narvs = 2; % 变量个数
c1 = 2.2; % 每个粒子的个体学习因子,也称为个体加速常数
c2 = 2.2; % 每个粒子的社会学习因子,也称为社会加速常数
C=c1+c2;
fi = 2/abs((2-C-sqrt(C^2-4*C))); % 收缩因子
w_1 = 0.9; % 开始的惯性权重
w_2 = 0.4; % 结束的惯性权重
K = 100; % 迭代的次数
vmax = [6 6];