从零开始人工智能Matlab案例-粒子群优化
目标:求解Rastrigin函数最小值(多峰测试函数)
粒子群优化算法是一种基于群体智能的优化算法,模拟了鸟群或鱼群等群体的行为,通过粒子在搜索空间中的移动来寻找最优解。
% PSO参数
nParticles = 30; % 粒子数量
maxIter = 100; % 最大迭代次数
dim = 2; % 变量维度
w = 0.7; % 惯性权重
c1 = 1.5; % 个体学习因子
c2 = 2.0; % 群体学习因子
% 初始化粒子
positions = -5.12 + 10.24*rand(nParticles, dim);
velocities = zeros(nParticles, dim);
pBestPos = positions;
pBestVal = inf(nParticles,1);
% 计算初始适应度
for i = 1:nParticles
pBestVal(i) = rastrigin(positions(i,:));
end
[gBestVal, gBestIdx] = min(pBestVal);
gBestPos = pBestPos(gBestIdx,:);
% 用于记录每次迭代的全局最优值和粒子位置
globalBestValues = zeros(maxIter, 1);
particlePositions = zeros(nParticles, dim, maxIter);
particlePositions(:, :, 1) = positions;
globalBestValues(1) = gBestVal;
% 主循环
for iter = 1:maxIter
for i = 1:nParticles
% 更新速度和位置
velocities(i,:) = w*velocities(i,:) + ...
c1*rand*(pBestPos(i,:) - positions(i,:)) + ...
c2*rand*(gBestPos - positions(i,:));
positions(i,:) = positions(i,:) + velocities(i,:);
% 计算新适应度
currentVal = rastrigin(positions(i,:));
% 更新个体最优
if currentVal < pBestVal(i)
pBestVal(i) = currentVal;
pBestPos(i,:) = positions(i,:);
end
end
% 更新全局最优
[newGBestVal, idx] = min(pBestVal);
if newGBestVal < gBestVal
gBestVal = newGBestVal;
gBestPos = pBestPos(idx,:);
end
% 记录当前迭代的信息
globalBestValues(iter) = gBestVal;
particlePositions(:, :, iter) = positions;
% 显示结果
fprintf('Iter %d: Best Value = %.4f\n', iter, gBestVal);
end
% 可视化部分
% 绘制全局最优适应度值随迭代次数的变化曲线
figure;
plot(1:maxIter, globalBestValues, 'b-o');
xlabel('迭代次数');
ylabel('全局最优适应度值');
title('全局最优适应度值随迭代次数的变化');
grid on;
% Rastrigin函数定义
function y = rastrigin(x)
y = 10*numel(x) + sum(x.^2 - 10*cos(2*pi*x));
end
Rastrigin 函数定义
function y = rastrigin(x)
y = 10*numel(x) + sum(x.^2 - 10*cos(2*pi*x));
end
Rastrigin是一个复杂的多峰函数,常用于测试优化算法的性能。numel(x)
表示向量 x
的元素个数,这里是 2。函数的全局最小值在所有变量都为 0 的位置。
nParticles = 30; % 粒子数量
maxIter = 100; % 最大迭代次数
dim = 2; % 变量维度
w = 0.7; % 惯性权重
c1 = 1.5; % 个体学习因子
c2 = 2.0; % 群体学习因子
- 粒子数量(
nParticles
):表示在搜索空间中同时进行搜索的粒子个数,这里设置为 30 个。每个粒子代表一个可能的解。 - 最大迭代次数(
maxIter
):算法最多进行 100 次迭代,每一次迭代粒子都会更新自己的位置和速度。 - 变量维度(
dim
):表示问题的维度,这里是 2 维,意味着每个粒子的位置由两个变量组成。 - 惯性权重(
w
):控制粒子保持原有速度的程度,值越大,粒子越倾向于保持原来的运动方向,这里设置为 0.7。 - 个体学习因子(
c1
):表示粒子向自身历史最优位置学习的能力,值越大,粒子越容易向自己曾经找到的最优位置靠近,这里设置为 1.5。 - 群体学习因子(
c2
):表示粒子向全局最优位置学习的能力,值越大,粒子越容易向整个群体找到的最优位置靠近,这里设置为 2.0。
positions = -5.12 + 10.24*rand(nParticles, dim);
velocities = zeros(nParticles, dim);
pBestPos = positions;
pBestVal = inf(nParticles,1);
- 位置初始化(
positions
):在 区间内随机生成 30 个粒子的初始位置,每个粒子的位置是一个 2 维向量。 - 速度初始化(
velocities
):将所有粒子的初始速度都设为 0。 - 个体最优位置初始化(
pBestPos
):初始时,每个粒子的个体最优位置就是它的初始位置。 - 个体最优值初始化(
pBestVal
):将每个粒子的个体最优值初始化为无穷大,方便后续更新。
for i = 1:nParticles
pBestVal(i) = rastrigin(positions(i,:));
end
[gBestVal, gBestIdx] = min(pBestVal);
gBestPos = pBestPos(gBestIdx,:);
- 遍历每个粒子,计算其初始位置的适应度值(即 Rastrigin 函数的值),并将其作为该粒子的初始个体最优值。
- 从所有粒子的个体最优值中找出最小值,将其作为全局最优值(
gBestVal
),并记录对应的粒子索引(gBestIdx
)。 - 根据索引找到全局最优位置(
gBestPos
)。