粒子群算法(Particle Swarm Optimization,PSO)的MATLAB程序,一般需要包含以下几个关键步骤:
1.初始化粒子群:随机初始化一定数量的粒子,包括它们的位置和速度,同时记录每个粒子的历史最优位置和全局最优位置。
2.计算适应度值:计算每个粒子的适应度值,即目标函数在当前位置的函数值。
3.更新速度和位置:根据粒子的历史最优位置和全局最优位置,以及当前速度和位置,更新粒子的速度和位置。
4.更新历史最优位置和全局最优位置:根据当前位置的适应度值,更新粒子的历史最优位置和全局最优位置。
5.终止条件判断:根据预设的终止条件,判断是否需要结束算法。
下面是粒子群算法的MATLAB程序实现,使用了二维的粒子群来最小化Rosenbrock函数:
% 粒子群算法
% 目标函数:Rosenbrock函数,f(x,y) = (1-x)^2 + 100*(y-x^2)^2
% 初始化
nPop = 30; %粒子数
nVar = 2; %变量数
MaxIter = 100; %最大迭代次数
c1 = 1.5; %学习因子1
c2 = 1.5; %学习因子2
w = 0.8; %初始惯性权重
xMax = 10; %搜索上限
xMin = -10; %搜索下限
% 随机初始化粒子位置和速度
x = xMin + (xMax - xMin) * rand(nPop, nVar); %位置
v = zeros(nPop, nVar); %速度
% 初始化历史最优位置和全局最优位置
pBest = x; %每个粒子的历史最优位置
pBestFit = inf(nPop, 1); %每个粒子的历史最优适应度值
gBest = zeros(1, nVar); %全局最优位置
gBestFit = inf; %全局最优适应度值
% 迭代
for iter = 1:MaxIter
% 计算每个粒子的适应度值
fit = (1 - x(:,1)).^2 + 100 * (x(:,2) - x(:,1).^2).^2;
% 更新历史最优位置和全局最优位置
for i = 1:nPop
if fit(i) < pBestFit(i)
pBest(i,:) = x(i,:);
pBestFit(i) = fit(i);
end
if fit(i) < gBestFit
gBest = x(i,:);
gBestFit = fit(i);
end
end
% 根据历史最优位置和全局最优位置更新速度和位置
for i = 1:nPop
v(i,:) = w * v(i,:) + c1 * rand(1,nVar) .* (pBest(i,:) - x(i,:)) + c2 * rand(1,nVar) .* (gBest - x(i,:));
x(i,:) = x(i,:) + v(i,:);
end
% 限制位置在搜索空间内
x(x > xMax) = xMax;
x(x < xMin) = xMin;
% 输出每次迭代的最优值
disp(['Iteration ' num2str(iter) ': Best Fitness = ' num2str(gBestFit)]);