粒子群测试Rastrigin函数matlab
实现粒子群优化算法测试Rastrigin函数
Matlab中的粒子群优化算法简介
粒子群优化(Particle Swarm Optimization, PSO)是一种基于群体智能的随机搜索技术,广泛应用于连续空间内的全局最优化问题。该方法模拟鸟群觅食行为,在多维解空间中寻找最优位置。
Rastrigin函数介绍
Rastrigin函数是一个典型的非线性多峰函数,常被用来评估优化算法性能。其特点是存在大量局部极小值点,增加了找到全局最小值难度[^1]。
参数设定与初始化
为了有效执行PSO算法并对其进行合理配置,需定义如下参数:
- 种群规模
PopulationSize
: 设定为30; - 迭代次数
MaxIteration
: 设置成500次迭代; - 惯性权重
w
: 初始设为0.9逐渐减至0.4; - 加速度因子
c1
,c2
: 均取值为2;
% 初始化参数
PopulationSize = 30; % 粒子数量
Dimension = 2; % 变量维度 (对于二维情况)
MaxIteration = 500;
w = linspace(0.9, 0.4, MaxIteration); % 动态调整惯性权值
c1 = 2; % 自我认知学习率
c2 = 2; % 社会经验学习率
LowerBound = -5.12 * ones(Dimension, 1);
UpperBound = 5.12 * ones(Dimension, 1);
% 随机生成初始种群及其速度向量
Position = LowerBound + rand(PopulationSize, Dimension).*(UpperBound-LowerBound);
Velocity = zeros(size(Position));
PersonalBest = Position;
GlobalBest = min(sum(Rastrigin(PersonalBest), 2));
定义适应度函数-Rastrigin函数
针对给定变量$x_i$,Rastrigin函数表达式如下所示:
$$f(x)=A*n+\sum_{i=1}^{n}(x_i^2-A\cos{(2πx_i)})$$
其中$n$表示输入向量长度,默认情况下$A=10$.
function y = Rastrigin(X)
A = 10;
n = size(X, 2);
sum_term = X.^2 - A*cos(2*pi*X);
y = A*n + sum(sum_term, 2);
end
更新规则及主循环逻辑
通过更新每个粒子的位置和速度来进行寻优过程。具体来说就是按照下面公式不断刷新个体最佳和个人历史记录直到达到最大迭代数为止。
$v_{id}=ω⋅v_{id}+c_1r_1(pbest−x_id)+c_2r_2(gbest−x_id)$
$x_{id}=x_{id}+v_{id}$
这里$r_1,r_2∈U[0,1]$代表两个独立同分布的标准均匀分布随机数列。
```matlab for iter = 1:MaxIteration
% 计算当前种群适应度值
FitnessValue = Rastrigin(Position);
% 更新个人最好位置 Personal Best
[~, idx] = min(FitnessValue);
if FitnessValue(idx)<min(sum(Rastrigin(PersonalBest)))
GlobalBestPos = Position(idx,:);
GlobalBestFit = FitnessValue(idx);
end
% 更新社会最好位置 Global Best
for i = 1:PopulationSize
r1=rand(); r2=rand();
Velocity(i,:) = w(iter)*Velocity(i,:)+...
c1*r1.*(PersonalBest(i,:)-Position(i,:))+...
c2*r2*(GlobalBestPos'-Position(i,:))';
Position(i,:) = Position(i,:)+Velocity(i,:);
% 边界处理
Position(i,find(Position(i,:)>UpperBound))=UpperBound(find(Position(i,:)>UpperBound));
Position(i,find(Position(i,:)<LowerBound))=LowerBound(find(Position(i,:)<LowerBound));
% 如果新位置更优,则更新personal best
if Rastrigin(Position(i,:))<RaстрIGIN(PersonalBest(i,:))
PersonalBest(i,:)=Position(i,:);
end
end
disp(['Iter ', num2str(iter), ': Best fitness=',num2str(GlobalBestFit)]);
end disp('Optimal solution found:'); disp([num2str(GlobalBestPos)]);
plot3(Position(:,1), Position(:,2), Rastrigin(Position),'o'); title('Final Particle Positions and Their Fitness Values') xlabel('X-axis'); ylabel('Y-axis'); zlabel('Fitness Value'); grid on;
相关推荐


















