用Matlab写一个粒子群优化算法
时间: 2024-05-08 13:21:11 浏览: 14
以下是Matlab代码示例:
```matlab
% 定义目标函数(例如 Rosenbrock 函数)
fun = @(x) 100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
% 定义粒子群优化算法参数
nVar = 2; % 优化变量数量
VarSize = [1 nVar]; % 变量大小
VarMin = -10; % 变量最小值
VarMax = 10; % 变量最大值
MaxIt = 100; % 迭代次数
nPop = 50; % 粒子数量
w = 1; % 惯性权重
wdamp = 0.99; % 惯性权重衰减率
c1 = 2; % 个体学习因子
c2 = 2; % 社会学习因子
ShowIterInfo = true; % 是否显示迭代信息
% 初始化粒子群
empty_particle.Position = [];
empty_particle.Velocity = [];
empty_particle.Cost = [];
empty_particle.Best.Position = [];
empty_particle.Best.Cost = [];
particle = repmat(empty_particle, nPop, 1);
global_best.Cost = inf;
for i = 1:nPop
% 初始化位置和速度
particle(i).Position = unifrnd(VarMin, VarMax, VarSize);
particle(i).Velocity = zeros(VarSize);
% 计算成本
particle(i).Cost = fun(particle(i).Position);
% 更新个体最佳位置
particle(i).Best.Position = particle(i).Position;
particle(i).Best.Cost = particle(i).Cost;
% 更新全局最佳位置
if particle(i).Best.Cost < global_best.Cost
global_best = particle(i).Best;
end
end
% 迭代优化
BestCosts = zeros(MaxIt, 1);
for it = 1:MaxIt
for i = 1:nPop
% 更新粒子速度
particle(i).Velocity = w*particle(i).Velocity + ...
c1*rand(VarSize).*(particle(i).Best.Position - particle(i).Position) + ...
c2*rand(VarSize).*(global_best.Position - particle(i).Position);
% 更新粒子位置
particle(i).Position = particle(i).Position + particle(i).Velocity;
% 约束处理
particle(i).Position = max(particle(i).Position, VarMin);
particle(i).Position = min(particle(i).Position, VarMax);
% 计算成本
particle(i).Cost = fun(particle(i).Position);
% 更新个体最佳位置
if particle(i).Cost < particle(i).Best.Cost
particle(i).Best.Position = particle(i).Position;
particle(i).Best.Cost = particle(i).Cost;
% 更新全局最佳位置
if particle(i).Best.Cost < global_best.Cost
global_best = particle(i).Best;
end
end
end
% 显示迭代信息
if ShowIterInfo
disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(global_best.Cost)]);
end
% 更新惯性权重
w = w * wdamp;
% 记录最佳成本
BestCosts(it) = global_best.Cost;
end
% 绘制最佳成本曲线
figure;
plot(BestCosts, 'LineWidth', 2);
xlabel('Iteration');
ylabel('Best Cost');
grid on;
```
在上述代码中,我们首先定义了目标函数 `fun`,然后设置了粒子群优化算法的参数,并初始化了粒子群。接着,我们进行迭代优化,并在每次迭代结束后更新惯性权重和记录最佳成本。最后,我们绘制了最佳成本曲线。