使用模式搜索对目标函数进行编码和最小化
此示例说明如何使用模式搜索创建和最小化目标函数。
目标函数
对于这个问题,要最小化的目标函数是二维变量 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
以采用三个附加参数(p1
、p2
和 p3
),它们在优化期间充当常量(它们不会作为最小化的一部分而变化)。为了实现目标函数计算,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
调用目标函数,但参数化目标函数有四个参量:x
、p1
、p2
和 p3
。使用匿名函数捕获附加参量 p1
、p2
和 p3
的值。创建一个函数句柄 ObjectiveFunction
到一个匿名函数,该函数接受一个输入 x
,但使用 parameterized_objective
、x
、p1
和 p2
调用 p3
。当您创建函数句柄 ObjectiveFunction
时,变量 p1
、p2
和 p3
具有存储在匿名函数中的值。有关详细信息,请参阅传递额外参数。
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
选项设置为 true
。patternsearch
需要这两个选项都以向量化方式进行计算。
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.