主要内容

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

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

目标函数

对于这个问题,要最小化的目标函数是一个二维变量的简单函数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]所描述的,这个功能被称为“cam”。

编写目标函数代码

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

类型simple_objective
function y = simple_objective(x) % simple_objective for PATTERNSEARCH solver %版权所有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 (x0 ObjectiveFunction)
优化终止:网格尺寸小于选项。网格公差。
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目标函数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,但参数化目标函数有四个参数:xp1p2,p3.使用匿名函数来捕获附加参数的值p1p2,p3.创建一个函数句柄ObjectiveFunction到接受一个输入的匿名函数x电话,但parameterized_objectivexp1p2,p3.当你创建函数句柄时ObjectiveFunction,变量p1p2,p3具有存储在匿名函数中的值。有关详细信息,请参见传递额外的参数

p1 = 4;p2 = 2.1;p3 = 4;定义常量值@(x) parameterized_objective(x,p1,p2,p3);[x, fval] = patternsearch (x0 ObjectiveFunction)
优化终止:网格尺寸小于选项。网格公差。
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目标函数% 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选项真正的UseCompletePoll选项真正的patternsearch需要这两个选项以向量化的方式计算。

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

指定目标函数和调用patternsearch,包括选项论点。使用抽搐/ toc评估解决时间。

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

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

tic [x,fval] = parent_id (parent_id, parent_id) = parent_id (parent_id, parent_id)
优化终止:网格尺寸小于选项。网格公差。
x =1×2-0.0898 - 0.7127
fval = -1.0316
toc
运行时间为0.027502秒。

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

参考文献

L. C. W.迪克森和G . p。Szego (eds)。面向全局优化北荷兰:爱思唯尔科学有限公司,阿姆斯特丹,1978。

相关的话题