主要内容

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

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

目标函数

对于这个问题,最小化的目标函数是一个二维变量的简单函数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]中所描述的。

编码目标函数

创建一个名为simple_objective.m包含以下代码:

类型simple_objective
函数y = simple_objective(x) % simple_objective for PATTERNSEARCH solver %版权所有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
函数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;定义常量值objecvefunction = @(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
函数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计算求解时间。

objecvefunction = @(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秒。

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

参考文献

狄克逊,l.c.w., G . p。Szego (eds)。向着全球优化2。荷兰北部:爱思唯尔科学有限公司,阿姆斯特丹,1978。

相关的话题

Baidu
map