二进制粒子群算法 (BPSO) 优化:绘制多个非最优粒子轨迹
文件 BPSO.m 的修改后的代码:
function [BestX, BestF, PSOCurve] = BPSO(pop, dim, fobj, MaxIter, Vmax, Vmin)
%% 参数设置
w = 0.9; % 惯性因子
c1 = 2; % 加速常数
c2 = 2; % 加速常数
% 二进制初始化粒子群种群
X = zeros(pop, dim);
for i = 1:pop
for j = 1:dim
if rand > 0.5
X(i, j) = 1;
end
end
end
% 初始化速度
V = zeros(pop, dim);
for i = 1:pop
V(i, :) = (Vmax - Vmin) .* rand(1, dim) + Vmin;
end
% 计算适应度值
fitness = zeros(1, pop);
for i = 1:pop
fitness(i) = fobj(X(i, :));
end
[BestF, index] = max(fitness);
BestX = X(index, :);
PbestX = X;
PbestFit = fitness;
% 修改部分:记录所有粒子的轨迹
AllX = zeros(MaxIter, pop, dim);
AllX(1, :, :) = X;
for t = 1:MaxIter
for i = 1:pop
V(i, :) = w * V(i, :) + c1 * rand * (PbestX(i, :) - X(i, :)) + c2 * rand * (BestX - X(i, :));
% 计算sigmoid
SigV = zeros(1, dim);
for j = 1:dim
if V(i, j) > Vmax
SigV(j) = 0.98;
V(i, j) = Vmax;
elseif V(i, j) < Vmin
SigV(j) = -0.98;
V(i, j) = Vmin;
else
SigV(j) = 1 / (1 + exp(-V(i, j)));
end
end
% 更新位置
for j = 1:dim
if rand < SigV(j)
X(i, j) = 1;
else
X(i, j) = 0;
end
end
end
for i = 1:pop
fitness(i) = fobj(X(i, :));
if fitness(i) > PbestFit(i)
PbestFit(i) = fitness(i);
PbestX(i, :) = X(i, :);
end
if fitness(i) > BestF
BestF = fitness(i);
BestX = X(i, :);
end
end
PSOCurve(t) = BestF;
% 修改部分:记录当前迭代的所有粒子位置
AllX(t, :, :) = X;
end
% 修改部分:绘制多个非最优粒子的轨迹
figure
hold on
plot(-PSOCurve, 'b-', 'linewidth', 1.5);
for i = 2:pop
plot(reshape(AllX(:, i, :), [], dim), 'color', rand(1, 3));
end
title('二进制粒子群算法迭代曲线和粒子轨迹')
xlabel('迭代次数(generations)');
ylabel('适应度值(minimum fitness)');
grid on;
legend('最优粒子', '非最优粒子');
hold off
disp(['得到的最优解为:', num2str(BestX)]);
disp(['故障节点为:', num2str(find(BestX))]);
end
文件 main.m 的代码不需要修改。
运行后,会生成一幅包含最优粒子轨迹和多个非最优粒子轨迹的图像。
原文地址: https://www.cveoy.top/t/topic/XHo 著作权归作者所有。请勿转载和采集!