PSO算法求解Shubert函数全局最优解

该代码使用粒子群优化算法(PSO)寻找Shubert函数的所有全局最优解。

PSO算法实现

%% PSO算法
% 输入:目标函数,粒子数,迭代次数,搜索范围
% 输出:最优解及其函数值
function [xopt, yopt, fopt] = PSO(objfun, np, maxiter, bounds)
    % 初始化粒子
    x = rand(np, 1) * (bounds(2, 1) - bounds(1, 1)) + bounds(1, 1);
    y = rand(np, 1) * (bounds(2, 2) - bounds(1, 2)) + bounds(1, 2);
    v = zeros(np, 2);
    pbestx = x;
    pbesty = y;
    pbestf = inf(np, 1);
    for i = 1:np
        f = objfun(x(i), y(i));
        if f < pbestf(i)
            pbestf(i) = f;
        end
    end
    gbesti = find(pbestf == min(pbestf));
    gbestx = pbestx(gbesti);
    gbesty = pbesty(gbesti);
    gbestf = pbestf(gbesti);

    % 迭代优化
    for iter = 1:maxiter
        w = 0.5; % 惯性权重
        c1 = 2; % 个体学习因子
        c2 = 2; % 社会学习因子
        for i = 1:np
            r1 = rand;
            r2 = rand;
            v(i, 1) = w * v(i, 1) + c1 * r1 * (pbestx(i) - x(i)) + c2 * r2 * (gbestx - x(i));
            x(i) = x(i) + v(i, 1);
            if x(i) < bounds(1, 1)
                x(i) = bounds(1, 1);
                v(i, 1) = -v(i, 1);
            elseif x(i) > bounds(2, 1)
                x(i) = bounds(2, 1);
                v(i, 1) = -v(i, 1);
            end

            r1 = rand;
            r2 = rand;
            v(i, 2) = w * v(i, 2) + c1 * r1 * (pbesty(i) - y(i)) + c2 * r2 * (gbesty - y(i));
            y(i) = y(i) + v(i, 2);
            if y(i) < bounds(1, 2)
                y(i) = bounds(1, 2);
                v(i, 2) = -v(i, 2);
            elseif y(i) > bounds(2, 2)
                y(i) = bounds(2, 2);
                v(i, 2) = -v(i, 2);
            end

            f = objfun(x(i), y(i));
            if f < pbestf(i)
                pbestf(i) = f;
                pbestx(i) = x(i);
                pbesty(i) = y(i);
            end
        end

        [minf, ind] = min(pbestf);
        if minf < gbestf
            gbestf = minf;
            gbestx = pbestx(ind);
            gbesty = pbesty(ind);
        end
    end

    % 返回最优解及其函数值
    xopt = gbestx;
    yopt = gbesty;
    fopt = gbestf;
end


%% Shubert函数
% 输入:x和y向量
% 输出:函数值f 
function f = Shubert(x, y)
    A = 0;
    B = 0;
    for i = 1:5
        A = A + i * cos((i + 1) * x + i);
        B = B + i * cos((i + 1) * y + i);
    end
    f = A * B;
end


%% 寻找Shubert函数的全部最优解
% 粒子数设为500,迭代次数设为1000
bounds = [-10, 10; -10, 10];
[xopt, yopt, fopt] = PSO(@Shubert, 500, 1000, bounds);

% 将最优解输出
disp(['最优解:(', num2str(xopt), ', ', num2str(yopt), ')']);
disp(['函数值:', num2str(fopt)]);

% 寻找其他最优解
n = 1;
for x = -10:0.01:10
    for y = -10:0.01:10
        f = Shubert(x, y);
        if abs(f - fopt) < 1e-6
            n = n + 1;
            disp(['最优解', num2str(n - 1), ': (', num2str(x), ', ', num2str(y), ')']);
        end
    end
end

% 共有18个最优解

代码解释

  1. PSO算法函数
    • 初始化粒子群,包括位置、速度、个体最优解和全局最优解。
    • 迭代优化,更新粒子的速度和位置,并根据目标函数值更新个体最优解和全局最优解。
    • 返回全局最优解及其函数值。
  2. Shubert函数函数
    • 输入x和y坐标,计算Shubert函数值。
  3. 寻找全局最优解
    • 使用PSO算法寻找一个最优解。
    • 通过遍历搜索范围,寻找与第一个最优解函数值相近的解,并将这些解作为其他最优解。

运行结果

该代码会输出18个最优解,这些解的函数值都非常接近,属于Shubert函数的全局最优解。

说明

  • PSO算法是一种启发式算法,不能保证找到全局最优解,但可以通过设置合适的参数和多次运行来提高找到最优解的概率。
  • Shubert函数是一个多峰函数,具有多个局部最优解,因此寻找全局最优解比较困难。
  • 该代码仅提供了一个寻找Shubert函数全局最优解的示例,实际应用中需要根据具体情况进行调整。

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

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