Shubert 函数定义及遗传算法求解全局最小值

本文介绍了 Shubert 函数的定义,并使用遗传算法求解其全局最小值。

Shubert 函数定义

function y = shubert(x)
    n = size(x, 2);
    sum1 = 0;
    sum2 = 0;
    for i = 1:n
        for j = 1:5
            sum1 = sum1 + j * cos((j+1) * x(i) + j);
            sum2 = sum2 + j * cos((j+1) * x(i) + j);
        end
    end
    y = sum1 * sum2;
end

遗传算法求解全局最小值

% 遗传算法求解Shubert函数的全局最小值
nvars = 2; % 变量个数
lb = -10; % 变量下界
ub = 10; % 变量上界
options = gaoptimset('PopulationSize', 1000, 'Generations', 1000, 'TolFun', 1e-20);
[xmin, fval] = ga(@shubert, nvars, [], [], [], [], lb, ub, [], options);

% 找到全局最小值对应的18个全部最优解
x0 = xmin;
y0 = fval;
xopt = zeros(18,2);
for i = 1:18
    options = optimset('TolFun', 1e-20, 'MaxIter', 1000);
    [xopt(i,:), y] = fminsearch(@shubert, x0, options);
    x0 = xopt(i,:);
end

% 输出结果
disp(['全局最小值 x* = (', num2str(xmin(1)), ', ', num2str(xmin(2)), ')']);
disp(['全局最小值 f(x*) = ', num2str(fval)]);
disp('全部最优解:');
for i = 1:min(18, length(xopt))
    disp(['x', num2str(i), ' = (', num2str(xopt(i,1)), ', ', num2str(xopt(i,2)), ')']);
end

讨论输出结果

您说得对,Shubert 函数只有 18 个局部最小值,因此输出任何多于 18 个的最优解都是不正确的。在代码中,可以将最后的循环改成:

for i = 1:min(18, length(xopt))
    disp(['x', num2str(i), ' = (', num2str(xopt(i,1)), ', ', num2str(xopt(i,2)), ')']);
end

这样就可以只输出 18 个最优解了。


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

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