主要内容

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

使用模式搜索对目标函数进行编码和最小化

此示例说明如何使用模式搜索创建和最小化目标函数。

目标函数

对于这个问题,要最小化的目标函数是二维变量 x 的简单函数。

simple_objective(x) = (4 - 2.1*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)*x(2) + (-4 + 4*x(2)^2)*x(2)^2;

该函数被称为 "cam",如 LCW Dixon 和 GP Szego [1] 所述。

编写目标函数代码

创建一个名为 simple_objective.m 的 MATLAB® 文件,其中包含以下代码:

type simple_objective
function y = simple_objective(x)
%SIMPLE_OBJECTIVE Objective function for PATTERNSEARCH solver

%   Copyright 2004 The MathWorks, Inc.  

x1 = x(1);
x2 = x(2);
y = (4-2.1.*x1.^2+x1.^4./3).*x1.^2+x1.*x2+(-4+4.*x2.^2).*x2.^2;

诸如 patternsearch 之类的求解器接受单个输入 x,其中 x 的元素数量与问题中的变量数量一样多。目标函数计算目标函数的标量值并在其单个输出参量 y 中返回它。

尽量减少使用 patternsearch

将目标函数指定为函数句柄。

ObjectiveFunction = @simple_objective;

为求解器指定一个初始点。

x0 = [0.5 0.5];   % Starting point

调用求解器,请求最优点 x 和最优点 fval 处的函数值。

[x,fval] = patternsearch(ObjectiveFunction,x0)
Optimization terminated: mesh size less than options.MeshTolerance.
x = 1×2

   -0.0898    0.7127

fval = -1.0316

尽量减少使用附加参量

有时,您的目标函数具有额外的参量,这些参量在优化期间充当常量。例如,在 simple_objective 中,您可能希望指定常数 4、2.1 和 4 作为变量参数来创建一组目标函数。

重写 simple_objective 以采用三个附加参数(p1p2p3),它们在优化期间充当常量(它们不会作为最小化的一部分而变化)。为了实现目标函数计算,MATLAB 文件 parameterized_objective.m 包含以下代码:

type parameterized_objective
function y = parameterized_objective(x,p1,p2,p3)
%PARAMETERIZED_OBJECTIVE Objective function for PATTERNSEARCH solver

%   Copyright 2004 The MathWorks, Inc.
  
x1 = x(1);
x2 = x(2);
y = (p1-p2.*x1.^2+x1.^4./3).*x1.^2+x1.*x2+(-p3+p3.*x2.^2).*x2.^2;

patternsearch 仅使用一个参量 x 调用目标函数,但参数化目标函数有四个参量:xp1p2p3。使用匿名函数捕获附加参量 p1p2p3 的值。创建一个函数句柄 ObjectiveFunction 到一个匿名函数,该函数接受一个输入 x,但使用 parameterized_objectivexp1p2 调用 p3。当您创建函数句柄 ObjectiveFunction 时,变量 p1p2p3 具有存储在匿名函数中的值。有关详细信息,请参阅传递额外参数

p1 = 4; p2 = 2.1; p3 = 4;    % Define constant values
ObjectiveFunction = @(x) parameterized_objective(x,p1,p2,p3);
[x,fval] = patternsearch(ObjectiveFunction,x0)
Optimization terminated: mesh size less than options.MeshTolerance.
x = 1×2

   -0.0898    0.7127

fval = -1.0316

向量化目标函数

默认情况下,patternsearch 每次将一个点传递给目标函数。有时,您可以通过向量化目标函数来获取一组点并返回一组函数值,从而加快求解器的速度。

例如,为了让求解器在一次调用目标函数中评估一组 5 个点,求解器会在大小为 5×2 的矩阵上调用目标(其中 2 是变量的数量)。有关详细信息,请参阅向量化目标和约束函数

要向量化 parameterized_objective,请使用以下代码:

type vectorized_objective
function y = vectorized_objective(x,p1,p2,p3)
%VECTORIZED_OBJECTIVE Objective function for PATTERNSEARCH solver

%   Copyright 2004-2018 The MathWorks, Inc.

x1 = x(:,1); % First column of x
x2 = x(:,2);
y = (p1 - p2.*x1.^2 + x1.^4./3).*x1.^2 + x1.*x2 + (-p3 + p3.*x2.^2).*x2.^2;

这个向量化版本的目标函数采用具有任意数量点(x 的行)的矩阵 x,并返回其长度为 y 的行数的列向量 x

要利用向量化目标函数,请将 UseVectorized 选项设置为 true,将 UseCompletePoll 选项设置为 truepatternsearch 需要这两个选项都以向量化方式进行计算。

options = optimoptions(@patternsearch,'UseVectorized',true,'UseCompletePoll',true);

指定目标函数并调用 patternsearch,包括 options 参量。使用 tic/toc 来评估解时间。

ObjectiveFunction = @(x) vectorized_objective(x,4,2.1,4);
tic
[x,fval] = patternsearch(ObjectiveFunction,x0,[],[],[],[],[],[],[],options)
Optimization terminated: mesh size less than options.MeshTolerance.
x = 1×2

   -0.0898    0.7127

fval = -1.0316
toc
Elapsed time is 0.027503 seconds.

评估非向量化解时间以进行比较。

tic
[x,fval] = patternsearch(ObjectiveFunction,x0)
Optimization terminated: mesh size less than options.MeshTolerance.
x = 1×2

   -0.0898    0.7127

fval = -1.0316
toc
Elapsed time is 0.027502 seconds.

在这种情况下,向量化不会对解时间产生显著影响。

参考资料

[1] Dixon, L. C. W., and G .P. Szego (eds.).Towards Global Optimisation 2.North-Holland:Elsevier Science Ltd., Amsterdam, 1978.

另请参阅

主题