主要内容

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

这个例子展示了如何使用模式搜索创建和最小化目标函数。

目标函数

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

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

这个函数被称为“凸轮”,如L.C.W. Dixon和G.P. Szego[1]中所描述的那样。

编码目标函数

创建一个MATLAB®文件simple_objective.m包含以下代码:

类型simple_objective
版权所有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];%起点

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

[x,fval] = patternsearch(objecvefunction,x0)
优化终止:网格尺寸小于options.MeshTolerance。
x =1×2-0.0898 - 0.7127
Fval = -1.0316

尽量减少使用额外参数

有时你的目标函数有额外的参数,在优化过程中充当常数。例如,在simple_objective,您可能希望将常数4、2.1和4指定为变量参数,以创建一系列目标函数。

重写simple_objective要获取三个额外参数(p1p2,p3),在优化过程中充当常量(它们不会作为最小化的一部分而变化)。实现目标函数的计算,MATLAB文件parameterized_objective.m包含以下代码:

类型parameterized_objective
function y = parameterized_objective(x,p1,p2,p3) % parameterized_objective用于PATTERNSEARCH求解器的目标函数%版权所有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,但参数化目标函数有四个参数:xp1p2,p3.使用匿名函数捕获附加参数的值p1p2,p3.创建一个函数句柄ObjectiveFunction到接受一个输入的匿名函数x,但电话parameterized_objectivexp1p2,p3.创建函数句柄时ObjectiveFunction,变量p1p2,p3具有存储在匿名函数中的值。详细信息请参见传递额外参数

P1 = 4;P2 = 2.1;P3 = 4;定义常数值ObjectiveFunction = @(x) parameterized_objective(x,p1,p2,p3);[x,fval] = patternsearch(objecvefunction,x0)
优化终止:网格尺寸小于options.MeshTolerance。
x =1×2-0.0898 - 0.7127
Fval = -1.0316

向量化目标函数

默认情况下,patternsearch每次向目标函数传递一个点。有时,你可以加快求解器的速度vectorizing目标函数取一组点并返回一组函数值。

例如,求解器要在对目标函数的一次调用中计算5个点的集合,求解器在大小为5 × 2的矩阵上调用目标(其中2是变量的数量)。详细信息请参见向量化目标函数和约束函数

去向parameterized_objective,使用以下代码:

类型vectorized_objective
function y = vectorized_objective(x,p1,p2,p3) % vectorized_objective用于PATTERNSEARCH求解器的目标函数%版权所有2004-2018 The MathWorks, Inc. x1 = x(:,1);% x x2 = x(:,2)的第一列;Y = (p1 - p2.*x1。²+ x1。^4./3).*x1.^2 + x1.*x2 + (-p3 + p3.*x2.^2).*x2.^2;

这个目标函数的矢量化版本需要一个矩阵x用任意数量的点(的行)x)并返回一个列向量y的行数是多少x

若要利用向量化目标函数,请设置UseVectorized选项真正的UseCompletePoll选项真正的patternsearch需要这两个选项以向量化的方式进行计算。

选项= optimoptions(@patternsearch,“UseVectorized”,真的,“UseCompletePoll”,真正的);

指定目标函数并调用patternsearch,包括选项论点。使用抽搐/ toc计算求解时间。

ObjectiveFunction = @(x) vectorized_objective(x,4,2.1,4);抽搐[x, fval] = patternsearch (x0 ObjectiveFunction ,[],[],[],[],[],[],[], 选项)
优化终止:网格尺寸小于options.MeshTolerance。
x =1×2-0.0898 - 0.7127
Fval = -1.0316
toc
运行时间为0.027503秒。

计算非向量化的求解时间进行比较。

tic [x,fval] = patternsearch(objecvefunction,x0)
优化终止:网格尺寸小于options.MeshTolerance。
x =1×2-0.0898 - 0.7127
Fval = -1.0316
toc
运行时间为0.027502秒。

在这种情况下,向量化对求解时间没有显著影响。

参考文献

[1]迪克森,l.c.w, g.p。Szego (eds)。朝向全局优化2。北荷兰:爱思唯尔科学有限公司,阿姆斯特丹,1978年。

相关的话题