文件 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 的代码不需要修改。

运行后,会生成一幅包含最优粒子轨迹和多个非最优粒子轨迹的图像。

二进制粒子群算法 (BPSO) 优化:绘制多个非最优粒子轨迹

原文地址: https://www.cveoy.top/t/topic/XHo 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录