Main Content

本页采用了机器翻译。点击此处可查看英文原文。

使用 surrogateopt 优化多维函数,基于问题

此示例展示了如何在基于问题的方法中使用替代优化来最小化多维函数。要最小化的函数 multirosenbrock(x) 出现在此示例的末尾multirosenbrock 函数在点 [1,1,...,1] 处具有 0 的单个局部最小值。该函数的设计对于求解器来说具有挑战性。

注意multirosenbrock 辅助函数的代码在本示例末尾提供。确保代码包含在脚本末尾或路径上的文件中。

创建一个 4-D 优化变量 xmultirosenbrock 函数期望变量为行向量,因此将 x 指定为 4 元素行向量。

x = optimvar("x",1,4);

surrogateopt 求解器要求所有问题变量都有有限的边界。指定下界为 -3,上界为 3。当您指定标量边界时,它们适用于所有问题变量。

x.LowerBound = -3;
x.UpperBound = 3;

要使用 multirosenbrock 作为目标函数,请使用 fcn2optimexpr 将该函数转换为优化表达式。

fun = fcn2optimexpr(@multirosenbrock,x);

用目标函数 multirosenbrock 创建一个优化问题。

prob = optimproblem("Objective",fun);

解决问题,指定 surrogateopt 求解器。

rng default % For reproducibility
[sol,fval] = solve(prob,"Solver","surrogateopt")
Solving problem using surrogateopt.

surrogateopt stopped because it exceeded the function evaluation limit set by 
'options.MaxFunctionEvaluations'.
sol = struct with fields:
    x: [0.2895 0.0882 0.5829 0.3348]

fval = 0.6831

尝试改进解决方案

返回的解并不好,因为目标函数值不太接近 0。尝试通过运行 surrogateopt 进行更多评估来改进解。使用先前的解作为起点。

options = optimoptions("surrogateopt","MaxFunctionEvaluations",1000);
[sol2,fval2] = solve(prob,sol,"Solver","surrogateopt","Options",options)
Solving problem using surrogateopt.

surrogateopt stopped because it exceeded the function evaluation limit set by 
'options.MaxFunctionEvaluations'.
sol2 = struct with fields:
    x: [1.0410 1.0844 0.8870 0.7865]

fval2 = 0.0145

这一次,求解器找到了一个很好的解。

辅助函数

以下代码会创建 multirosenbrock 辅助函数。

function F = multirosenbrock(x)
% This function is a multidimensional generalization of Rosenbrock's
% function. It operates in a vectorized manner, assuming that x is a matrix
% whose rows are the individuals.

% Copyright 2014 by The MathWorks, Inc.

N = size(x,2); % assumes x is a row vector or 2-D matrix
if mod(N,2) % if N is odd
    error('Input rows must have an even number of elements')
end

odds  = 1:2:N-1;
evens = 2:2:N;
F = zeros(size(x));
F(:,odds)  = 1-x(:,odds);
F(:,evens) = 10*(x(:,evens)-x(:,odds).^2);
F = sum(F.^2,2);
end

另请参阅

| |

相关主题