主要内容

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

patternsearch

使用模式搜索找到函数的最小值

说明

x = patternsearch(fun,x0) 找到局部最小值 x,传递给函数句柄 fun 计算目标函数的值。x0 是一个实数向量,指定模式搜索算法的初始点。

注意

传递额外参数说明如何将额外的参数传递给目标函数和非线性约束函数(如有必要)。

示例

x = patternsearch(fun,x0,A,b) 最小化 fun 并满足线性不等式 A*xb。请参阅 线性不等式约束

示例

x = patternsearch(fun,x0,A,b,Aeq,beq) 最小化 fun 并满足线性等式 Aeq*x = beqA*xb。如果不存在线性不等式,则设置 A = []b = []

x = patternsearch(fun,x0,A,b,Aeq,beq,lb,ub)x 中的设计变量定义一组下界和上界,使解始终在 lb x ub 范围内。如果不存在线性等式,则设置 Aeq = []beq = []。如果 x(i) 没有下界,则设置 lb(i) = -Inf。如果 x(i) 没有上界,则设置 ub(i) = Inf

示例

x = patternsearch(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon) 将最小化服从于 c(x) 中定义的非线性不等式 ceq(x) 或等式 nonlconpatternsearch 优化 fun 使得 c(x) ≤ 0ceq(x) = 0。如果不存在边界,则设置 lb = []ub = [] 或两者。

示例

x = patternsearch(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options) 使用 options 中指定的优化选项最小化 fun。使用 optimoptions 可设置这些选项。如果没有非线性不等式或等式约束,请设置 nonlcon = []

示例

x = patternsearch(problem)problem 的最小值,它是 problem 中所述的一个结构体。

[x,fval] = patternsearch(___) 对上述任何语法,返回目标函数 fun 在解 x 处的值。

示例

[x,fval,exitflag,output] = patternsearch(___) 还返回 exitflag(描述 patternsearch 的退出条件的值)以及包含有关优化过程信息的结构体 output

示例

示例

全部折叠

使用 patternsearch 求解器最小化无约束问题。

创建以下双变量目标函数。在您的 MATLAB® 路径上,将以下代码保存到名为 psobj.m 的文件中。

function y = psobj(x)

y = exp(-x(1)^2-x(2)^2)*(1+5*x(1) + 6*x(2) + 12*x(1)*cos(x(2)));

将目标函数设置为 @psobj

fun = @psobj;

从点 [0,0] 开始,找到最小值。

x0 = [0,0];
x = patternsearch(fun,x0)
patternsearch stopped because the mesh size was less than options.MeshTolerance.

x =

   -0.7037   -0.1860

最小化受某些线性不等式约束的函数。

创建以下双变量目标函数。在您的 MATLAB® 路径上,将以下代码保存到名为 psobj.m 的文件中。

function y = psobj(x)

y = exp(-x(1)^2-x(2)^2)*(1+5*x(1) + 6*x(2) + 12*x(1)*cos(x(2)));

将目标函数设置为 @psobj

fun = @psobj;

设置两个线性不等式约束。

A = [-3,-2;
    -4,-7];
b = [-1;-8];

从点 [0.5,-0.5] 开始,找到最小值。

x0 = [0.5,-0.5];
x = patternsearch(fun,x0,A,b)
patternsearch stopped because the mesh size was less than options.MeshTolerance.

x =

    5.2827   -1.8758

找到仅具有边界的约束的最小值。

创建以下双变量目标函数。在您的 MATLAB® 路径上,将以下代码保存到名为 psobj.m 的文件中。

function y = psobj(x)

y = exp(-x(1)^2-x(2)^2)*(1+5*x(1) + 6*x(2) + 12*x(1)*cos(x(2)));

将目标函数设置为 @psobj

fun = @psobj;

找出 $0 \le x(1) \le\infty$$-\infty \le x(2) \le -3$ 时的最小值。

lb = [0,-Inf];
ub = [Inf,-3];
A = [];
b = [];
Aeq = [];
beq = [];

从点 [1,-5] 开始,找到最小值。

x0 = [1,-5];
x = patternsearch(fun,x0,A,b,Aeq,beq,lb,ub)
patternsearch stopped because the mesh size was less than options.MeshTolerance.

x =

    0.1880   -3.0000

找到受非线性不等式约束的函数的最小值。

创建以下双变量目标函数。在您的 MATLAB® 路径上,将以下代码保存到名为 psobj.m 的文件中。

function y = psobj(x)

y = exp(-x(1)^2-x(2)^2)*(1+5*x(1) + 6*x(2) + 12*x(1)*cos(x(2)));

将目标函数设置为 @psobj

fun = @psobj;

创建非线性约束

$$ \frac{{xy}}{2} + {\left( {x + 2} \right)^2} + \frac{{{{\left( {y - 2}
\right)}^2}}}{2} \le 2. $$

为此,在 MATLAB 路径上,将以下代码保存到名为 ellipsetilt.m 的文件中。

function [c,ceq] = ellipsetilt(x)
ceq = [];
c = x(1)*x(2)/2 + (x(1)+2)^2 + (x(2)-2)^2/2 - 2;

从起始点 patternsearch 开始 [-2,-2]

x0 = [-2,-2];
A = [];
b = [];
Aeq = [];
beq = [];
lb = [];
ub = [];
nonlcon = @ellipsetilt;
x = patternsearch(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
Optimization finished: mesh size less than options.MeshTolerance 
and constraint violation is less than options.ConstraintTolerance.

x =

   -1.5144    0.0875

有时不同的 patternsearch 算法有明显不同的行为。虽然很难预测哪种算法最适合解决问题,但您可以轻松尝试不同的算法。对于此示例,使用 sawtoothxy 目标函数,该函数在运行此示例时可用,并在 寻找全局或多个局部最小值 中描述和绘制。

type sawtoothxy
function f = sawtoothxy(x,y)
[t r] = cart2pol(x,y); % change to polar coordinates
h = cos(2*t - 1/2)/2 + cos(t) + 2;
g = (sin(r) - sin(2*r)/2 + sin(3*r)/3 - sin(4*r)/4 + 4) ...
    .*r.^2./(r+1);
f = g.*h;
end

为了观察最小化该目标函数时不同算法的行为,请设置一些不对称的边界。还设置一个初始点 x0,它离真实解 sol = [0 0] 较远,其中 sawtoothxy(0,0) = 0

rng default
x0 = 12*randn(1,2);
lb = [-15,-26];
ub = [26,15];
fun = @(x)sawtoothxy(x(1),x(2));

使用 sawtoothxy "classic" 算法最小化 patternsearch 函数。

optsc = optimoptions("patternsearch",Algorithm="classic");
[sol,fval,eflag,output] = patternsearch(fun,...
    x0,[],[],[],[],lb,ub,[],optsc)
patternsearch stopped because the mesh size was less than options.MeshTolerance.
sol = 1×2
10-5 ×

    0.9825         0

fval = 
1.3278e-09
eflag = 
1
output = struct with fields:
         function: @(x)sawtoothxy(x(1),x(2))
      problemtype: 'boundconstraints'
       pollmethod: 'gpspositivebasis2n'
    maxconstraint: 0
     searchmethod: []
       iterations: 52
        funccount: 168
         meshsize: 9.5367e-07
         rngstate: [1×1 struct]
          message: 'patternsearch stopped because the mesh size was less than options.MeshTolerance.'

"classic" 算法经过 52 次迭代和 168 次函数计算最终找到全局解。

尝试 "nups" 算法。

rng default % For reproducibility
optsn = optimoptions("patternsearch",Algorithm="nups");
[sol,fval,eflag,output] = patternsearch(fun,...
    x0,[],[],[],[],lb,ub,[],optsn)
patternsearch stopped because the mesh size was less than options.MeshTolerance.
sol = 1×2

    6.3204   15.0000

fval = 
85.9256
eflag = 
1
output = struct with fields:
         function: @(x)sawtoothxy(x(1),x(2))
      problemtype: 'boundconstraints'
       pollmethod: 'nups'
    maxconstraint: 0
     searchmethod: []
       iterations: 29
        funccount: 88
         meshsize: 7.1526e-07
         rngstate: [1×1 struct]
          message: 'patternsearch stopped because the mesh size was less than options.MeshTolerance.'

这次求解器仅仅用了 29 次迭代和 88 次函数计算就达到了局部解,但该解并不是全局解。

尝试使用 "nups-mads" 算法,该算法在坐标方向上不采取任何步骤。

rng default % For reproducibility
optsm = optimoptions("patternsearch",Algorithm="nups-mads");
[sol,fval,eflag,output] = patternsearch(fun,...
    x0,[],[],[],[],lb,ub,[],optsm)
patternsearch stopped because the mesh size was less than options.MeshTolerance.
sol = 1×2
10-4 ×

   -0.5275    0.0806

fval = 
1.5477e-08
eflag = 
1
output = struct with fields:
         function: @(x)sawtoothxy(x(1),x(2))
      problemtype: 'boundconstraints'
       pollmethod: 'nups-mads'
    maxconstraint: 0
     searchmethod: []
       iterations: 55
        funccount: 189
         meshsize: 9.5367e-07
         rngstate: [1×1 struct]
          message: 'patternsearch stopped because the mesh size was less than options.MeshTolerance.'

这次,求解器在 55 次迭代和 189 次函数计算中达到了全局解,这与 'classic' 算法类似。

设置选项以观察 patternsearch 解过程的进度。

创建以下双变量目标函数。在您的 MATLAB® 路径上,将以下代码保存到名为 psobj.m 的文件中。

function y = psobj(x)

y = exp(-x(1)^2-x(2)^2)*(1+5*x(1) + 6*x(2) + 12*x(1)*cos(x(2)));

将目标函数设置为 @psobj

fun = @psobj;

设置 options 以提供迭代显示并在每次迭代时绘制目标函数。

options = optimoptions('patternsearch','Display','iter','PlotFcn',@psplotbestf);

从点 [0,0] 开始找到目标的无约束最小值。

x0 = [0,0];
A = [];
b = [];
Aeq = [];
beq = [];
lb = [];
ub = [];
nonlcon = [];
x = patternsearch(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)

Iter     f-count          f(x)      MeshSize     Method
    0        1              1             1      
    1        4       -5.88607             2     Successful Poll
    2        8       -5.88607             1     Refine Mesh
    3       12       -5.88607           0.5     Refine Mesh
    4       16       -5.88607          0.25     Refine Mesh

(output trimmed)

   63      218       -7.02545     1.907e-06     Refine Mesh
   64      221       -7.02545     3.815e-06     Successful Poll
   65      225       -7.02545     1.907e-06     Refine Mesh
   66      229       -7.02545     9.537e-07     Refine Mesh
Optimization terminated: mesh size less than options.MeshTolerance.

x =

   -0.7037   -0.1860

找到函数的最小值并报告最小值的位置和值。

创建以下双变量目标函数。在您的 MATLAB® 路径上,将以下代码保存到名为 psobj.m 的文件中。

function y = psobj(x)

y = exp(-x(1)^2-x(2)^2)*(1+5*x(1) + 6*x(2) + 12*x(1)*cos(x(2)));

将目标函数设置为 @psobj

fun = @psobj;

从点 [0,0] 开始,找到目标的无约束最小值。返回最小值 x 的位置和 fun(x) 的值。

x0 = [0,0];
[x,fval] = patternsearch(fun,x0)
patternsearch stopped because the mesh size was less than options.MeshTolerance.

x =

   -0.7037   -0.1860


fval =

   -7.0254

为了检查 patternsearch 解过程,获取所有输出。

创建以下双变量目标函数。在您的 MATLAB® 路径上,将以下代码保存到名为 psobj.m 的文件中。

function y = psobj(x)

y = exp(-x(1)^2-x(2)^2)*(1+5*x(1) + 6*x(2) + 12*x(1)*cos(x(2)));

将目标函数设置为 @psobj

fun = @psobj;

从点 [0,0] 开始,找到目标的无约束最小值。返回解、x、解处的目标函数值、fun(x)、退出标志和输出结构体。

x0 = [0,0];
[x,fval,exitflag,output] = patternsearch(fun,x0)
patternsearch stopped because the mesh size was less than options.MeshTolerance.

x =

   -0.7037   -0.1860


fval =

   -7.0254


exitflag =

     1


output = 

  struct with fields:

         function: @psobj
      problemtype: 'unconstrained'
       pollmethod: 'gpspositivebasis2n'
    maxconstraint: []
     searchmethod: []
       iterations: 66
        funccount: 229
         meshsize: 9.5367e-07
         rngstate: [1×1 struct]
          message: 'patternsearch stopped because the mesh size was less than options.MeshTolerance.'

exitflag1,表示收敛到局部最小值。

output 结构体包含 patternsearch 进行了多少次迭代以及进行了多少次函数计算等信息。将此输出结构与 使用非默认选项的模式搜索 的结果进行比较。在该示例中,您获得了部分信息,但并未获得诸如函数计算的次数之类的信息。

输入参数

全部折叠

要最小化的函数,指定为函数句柄或函数名称。fun 函数接受向量 x 并返回实数标量 f,它是在 x 处评估的目标函数。

您可以将 fun 指定为文件的函数句柄

x = patternsearch(@myfun,x0)

这里,myfun 是一个 MATLAB 函数,例如

function f = myfun(x)
f = ...            % Compute function value at x

fun 也可以是匿名函数的函数句柄

x = patternsearch(@(x)norm(x)^2,x0,A,b);

示例: fun = @(x)sin(x(1))*cos(x(2))

数据类型: char | function_handle | string

初始点,指定为实数向量。patternsearch 使用 x0 中的元素数目来确定 fun 接受的变量的数目。

示例: x0 = [1,2,3,4]

数据类型: double

线性不等式约束,指定为实矩阵。AM×nvars 矩阵,其中 M 是不等式的数目。

A 以如下形式编写 M 个线性不等式

A*x <= b,

其中,x 是由 nvars 个变量组成的列向量 x(:)b 是具有 M 个元素的列向量。

例如,要指定

x1 +2x2 ≤10
3x1 +4x2 ≤20
5x1 +6x2 ≤30,

提供以下约束:

A = [1,2;3,4;5,6];
b = [10;20;30];

示例: 要指定控制项变量总和等于或小于 1,请给出约束 A = ones(1,N)b = 1

数据类型: double

线性不等式约束,指定为实数向量。b 是与 A 矩阵相关的包含 M 个元素的向量。如果将 b 作为行向量传递,求解器会在内部将 b 转换为列向量 b(:)

b 以如下形式编写 M 个线性不等式

A*x <= b,

其中,x 是由 N 个变量组成的列向量 x(:)A 是大小为 M×N 的矩阵。

例如,要指定

x1 +2x2 ≤10
3x1 +4x2 ≤20
5x1 +6x2 ≤30,

提供以下约束:

A = [1,2;3,4;5,6];
b = [10;20;30];

示例: 要指定控制项变量总和等于或小于 1,请给出约束 A = ones(1,N)b = 1

数据类型: double

线性等式约束,指定为实矩阵。AeqMe×nvars 矩阵,其中 Me 是等式的数目。

Aeq 以如下形式编写 Me 个线性等式

Aeq*x = beq,

其中,x 是由 N 个变量组成的列向量 x(:)beq 是具有 Me 个元素的列向量。

例如,要指定

x1 + 2x2 + 3x3 = 10
2x1 + 4x2 + x3 = 20,

提供以下约束:

Aeq = [1,2,3;2,4,1];
beq = [10;20];

示例: 要指定控制项变量总和为 1,请给出约束 Aeq = ones(1,N)beq = 1

数据类型: double

线性等式约束,指定为实数向量。beq 是与 Aeq 矩阵相关的包含 Me 个元素的向量。如果将 beq 作为行向量传递,求解器会在内部将 beq 转换为列向量 beq(:)

beq 以如下形式编写 Me 个线性等式

Aeq*x = beq,

其中,x 是由 N 个变量组成的列向量 x(:)Aeq 是大小为 Meq×N 的矩阵。

例如,要指定

x1 + 2x2 + 3x3 = 10
2x1 + 4x2 + x3 = 20,

提供以下约束:

Aeq = [1,2,3;2,4,1];
beq = [10;20];

示例: 要指定控制项变量总和为 1,请给出约束 Aeq = ones(1,N)beq = 1

数据类型: double

下界,指定为实数向量或实数数组。如果 x0 中的元素数目等于 lb 中的元素数目,则 lb 指定

x(i) >= lb(i)

(适用于所有 i)。

如果 numel(lb) < numel(x0),则 lb 指定

x(i) >= lb(i)

for

1 <= i <= numel(lb)

在这种情况下,求解器会发出警告。

示例: 要指定所有控制项变量均为正值,lb = zeros(size(x0))

数据类型: double

上界,指定为实数向量或实数数组。如果 x0 中的元素数目等于 ub 中的元素数目,则 ub 指定

x(i) <= ub(i)

(适用于所有 i)。

如果 numel(ub) < numel(x0),则 ub 指定

x(i) <= ub(i)

for

1 <= i <= numel(ub)

在这种情况下,求解器会发出警告。

示例: 要指定所有控制项变量都小于 1,ub = ones(size(x0))

数据类型: double

非线性约束,指定为函数句柄或函数名称。nonlcon 函数接受向量或数组 x,并返回两个数组 c(x)ceq(x)

  • c(x) 是由 x 处的非线性不等式约束组成的数组。patternsearch 尝试满足

    c(x) <= 0

    (对于 c 的所有条目)。

  • ceq(x) 是由 x 处的非线性等式约束组成的数组。patternsearch 尝试满足

    ceq(x) = 0

    (对于 ceq 的所有条目)。

例如,

x = patternsearch(@myfun,x0,A,b,Aeq,beq,lb,ub,@mycon)

其中 mycon 是一个 MATLAB 函数,例如

function [c,ceq] = mycon(x)
c = ...     % Compute nonlinear inequalities at x.
ceq = ...   % Compute nonlinear equalities at x.
有关详细信息,请参阅非线性约束

数据类型: char | function_handle | string

优化选项,指定为 optimoptions 返回的对象(推荐)或结构体。

下表描述了优化选项。optimoptions 隐藏以斜体显示的选项;请参阅 optimoptions 隐藏的选项{} 表示默认值。请参阅 模式搜索选项 中的选项详细信息。

适用于 patternsearch 的选项

选项描述
Algorithm

patternsearch 使用的算法。Algorithm 设置会影响可用的选项。有关算法的详细信息,请参阅 模式搜索轮询的工作原理非均匀模式搜索 (NUPS) 算法

有关算法效果的示例,请参阅 探索 patternsearch 算法探索优化实时编辑器任务中的 patternsearch 算法

{"classic"} | "nups" | "nups-gps" | "nups-mads"
缓存

Cache 设置为 "on" 后,patternsearch 会保留其轮询的网格点的历史记录。在后续迭代中,patternsearch 不会轮询靠近已轮询的点。如果在计算目标函数时 patternsearch 运行缓慢,请使用此选项。如果目标函数是随机的,请不要使用此选项。

注意

当并行运行求解器时,Cache 不起作用。

"on" | {"off"}

CacheSize

历史记录的大小。

非负标量 | {1e4}

CacheTol

当前网格点到按顺序排列的历史记录中任意点的最大距离,以便 patternsearch 避免轮询当前点。如果 Cache 选项设置为 "on" 则使用。

非负标量 | {eps}

ConstraintTolerance

约束的容差。

对于 options 结构体,使用 TolCon

正标量 | {1e-6}

Display

显示级别,表示在解过程中,patternsearch 返回到命令行多少信息。

"off" | "iter" | "diagnose" | {"final"}
FunctionTolerance

函数上的容差。如果函数值的变化小于 FunctionTolerance 且网格大小小于 StepTolerance,则迭代停止。该选项不适用于 MADS (网格自适应直接搜索)轮询。

对于 options 结构体,使用 TolFun

非负标量 | {1e-6}

InitialMeshSize

算法的初始网格大小。请参阅 模式搜索轮询的工作原理

正标量 | {1.0}

InitialPenalty

惩罚参数的初始值。请参阅 用于模式搜索的非线性约束求解算法

正标量 | {10}

MaxFunctionEvaluations

目标函数评估的最大次数。

对于 options 结构体,使用 MaxFunEvals

非负整数 | {"2000*numberOfVariables"},其中 numberOfVariables 是问题变量的数量

MaxIterations

最大迭代次数。

对于 options 结构体,使用 MaxIter

非负整数 | {"100*numberOfVariables"},其中 numberOfVariables 是问题变量的数量

MaxMeshSize

轮询或搜索步骤中使用的最大网格大小。请参阅 模式搜索轮询的工作原理

非负标量 | {Inf}

MaxTime

允许优化的总时间(以秒为单位)。

对于 options 结构体,使用 TimeLimit

非负标量 | {Inf}

MeshContractionFactor

失败迭代的网格收缩因子。

此选项仅当 Algorithm"classic" 时适用。

对于 options 结构体,使用 MeshContraction

正标量 | {0.5}

MeshExpansionFactor

成功迭代的网格扩展因子。

此选项仅当 Algorithm"classic" 时适用。

对于 options 结构体,使用 MeshExpansion

正标量 | {2.0}

MeshRotate

在声明某个点为最优点之前,标记以旋转模式。请参阅 网格选项

此选项仅当 Algorithm"classic" 时适用。

"off" | {"on"}

MeshTolerance

网格大小的容差。

对于 options 结构体,使用 TolMesh

非负标量 | {1e-6}

OutputFcn

优化函数在每次迭代时调用的函数。指定为函数句柄或函数句柄元胞数组。

对于 options 结构体,使用 OutputFcns

函数句柄或函数句柄元胞数组 | {[]}

PenaltyFactor

惩罚更新参数。请参阅 用于模式搜索的非线性约束求解算法

正标量 | {100}

PlotFcn

模式搜索的输出图。指定为内置绘图函数的名称、函数句柄,或者内置绘图函数或函数句柄名称的元胞数组。

对于 options 结构体,使用 PlotFcns

{[]} | "psplotbestf" | "psplotfuncount" | "psplotmeshsize" | "psplotbestx" | "psplotmaxconstr" | 自定义绘图函数

PlotInterval

绘图的迭代次数。1 表示每次迭代绘图,2 表示每隔一次迭代绘图,依此类推。

正整数 | {1}

PollMethod

模式搜索中采用的轮询策略。

此选项仅当 Algorithm"classic" 时适用。

注意

当问题具有线性等式约束时,您不能使用 MADS 轮询。

{"GPSPositiveBasis2N"} | "GPSPositiveBasisNp1" | "GSSPositiveBasis2N" | "GSSPositiveBasisNp1" | "MADSPositiveBasis2N" | "MADSPositiveBasisNp1"

PollOrderAlgorithm

模式搜索中轮询方向的顺序。

此选项仅当 Algorithm"classic" 时适用。

对于 options 结构体,使用 PollingOrder

"Random" | "Success" | {"Consecutive"}

ScaleMesh

变量的自动缩放。

对于 options 结构体,使用 ScaleMesh = "on""off"

{true}| false

SearchFcn

模式搜索中使用的搜索类型。指定为名称或函数句柄。

对于 options 结构体,使用 SearchMethod

"GPSPositiveBasis2N" | "GPSPositiveBasisNp1" | "GSSPositiveBasis2N" | "GSSPositiveBasisNp1" | "MADSPositiveBasis2N" | "MADSPositiveBasisNp1" | "searchga" | "searchlhs" | "searchneldermead" | "rbfsurrogate" | {[]} | 自定义搜索函数

StepTolerance

对变量的容忍度。如果位置和网格大小的变化都小于 StepTolerance,则迭代停止。此选项不适用于 MADS 轮询。

对于 options 结构体,使用 TolX

非负标量 | {1e-6}

TolBind

绑定容差。请参阅 约束参数

非负标量 | {1e-3}

UseCompletePoll

标记以完成围绕当前点的轮询。请参阅 模式搜索轮询的工作原理

此选项仅当 Algorithm"classic" 时适用。

注意

对于 "classic" 算法,必须将 UseCompletePoll 设置为 true 以进行向量化或并行轮询。类似地,将 UseCompleteSearch 设置为 true 以进行向量化或并行搜索。

从 R2019a 开始,当您将 UseParallel 选项设置为 true 时,patternsearch 会在内部将 UseCompletePoll 设置覆盖为 true,以便该函数轮询。

对于 options 结构体,使用 CompletePoll = "on""off"

true | {false}

UseCompleteSearch

当搜索方法为轮询方法时,标记以完成围绕当前点的搜索。请参阅 搜索和轮询

此选项仅当 Algorithm"classic" 时适用。

注意

对于 "classic" 算法,必须将 UseCompleteSearch 设置为 true 以进行向量化或并行搜索。

对于 options 结构体,使用 CompleteSearch = "on""off"

true | {false}

UseParallel

标记以并行计算目标和非线性约束函数。请参阅向量化和并行选项如何在 Global Optimization Toolbox 中使用并行处理

注意

对于 "classic" 算法,必须将 UseCompletePoll 设置为 true 以进行向量化或并行轮询。类似地,将 UseCompleteSearch 设置为 true 以进行向量化或并行搜索。

从 R2019a 开始,当您将 UseParallel 选项设置为 true 时,patternsearch 会在内部将 UseCompletePoll 设置覆盖为 true,以便该函数轮询。

注意

当并行运行求解器时,Cache 不起作用。

true | {false}

UseVectorized

指定函数是否向量化。请参阅向量化和并行选项向量化目标和约束函数

注意

对于 "classic" 算法,必须将 UseCompletePoll 设置为 true 以进行向量化或并行轮询。类似地,将 UseCompleteSearch 设置为 true 以进行向量化或并行搜索。

对于 options 结构体,使用 Vectorized = "on""off"

true | {false}

示例: options = optimoptions("patternsearch",MaxIterations=150,MeshTolerance=1e-4)

问题结构体,指定为含有以下字段的结构体:

  • objective - 目标函数

  • x0 - 起点

  • Aineq - 线性不等式约束矩阵

  • bineq - 线性不等式约束

  • Aeq -线性等式约束矩阵

  • beq -线性等式约束

  • lb - x 的下界

  • ub - x 的上界

  • nonlcon - 非线性约束函数

  • solver'patternsearch'

  • options — 使用 optimoptions 或结构体创建的选项

  • rngstate - 可选字段,用于重置随机数生成器的状态

注意

problem 外,rngstate 中的所有字段都是必填的。

数据类型: struct

输出参量

全部折叠

解,以实数向量形式返回。x 的大小与 x0 的大小相同。当 exitflag 为正时,x 通常是该问题的局部解。

解处的目标函数值,以实数形式返回。通常,fval = fun(x)

patternsearch 停止的原因,以整数形式返回。

退出标志含义

1

无非线性约束 - 网格大小的量级小于指定的容差,并且约束违反值小于 ConstraintTolerance

有非线性约束 - 互补性度量(在此表后定义)的量级小于 sqrt(ConstraintTolerance),子问题是使用比 MeshTolerance 更精细的网格来求解的,并且约束违反值小于 ConstraintTolerance

2

x 中的变化和网格大小都小于指定的容差,并且约束违反值小于 ConstraintTolerance

3

fval 中的变化和网格大小都小于指定的容差,并且约束违反值小于 ConstraintTolerance

4

步长小于机器精度,约束违反值小于 ConstraintTolerance

0

达到函数计算或迭代的最大次数。

-1

优化被输出函数或绘图函数终止。

-2

找不到可行点。

在非线性约束求解器中,互补性测度是元素为 ciλi 的向量的范数,其中 ci 是非线性不等式约束违反值,λi 是对应的拉格朗日乘数。

有关优化过程的信息,以包含下列字段的结构体形式返回:

  • function - 目标函数。

  • problemtype - 问题类型,包括:

    • 'unconstrained'

    • 'boundconstraints'

    • 'linearconstraints'

    • 'nonlinearconstr'

  • pollmethod - 轮询方法。

  • searchmethod - 使用的搜索技术(如果有)。

  • iterations - 总迭代次数。

  • funccount -函数计算总数。

  • meshsize - x 处的网格大小。

  • maxconstraint - 最大约束违反值(如果有)。

  • rngstate - 在算法即将开始之前 MATLAB 随机数生成器的状态。当您使用随机搜索方法或随机轮询方法时,您可以使用 rngstate 中的值来重现输出。请参阅 重现结果,其中讨论了 ga 的相同技术。

  • message - 算法终止的原因。

算法

默认情况下,在没有线性约束的情况下,patternsearch 会根据与坐标方向一致的自适应网格寻找最小值。请参阅什么是直接搜索?模式搜索轮询的工作原理

当您将 Algorithm 选项设置为 "nups" 或其变体之一时,patternsearch 将使用 非均匀模式搜索 (NUPS) 算法 中描述的算法。该算法与默认算法有几个不同之处;例如,它需要设置的选项更少。

替代功能

App

优化实时编辑器任务为 patternsearch 提供了一个可视化界面。

参考

[1] Audet, Charles, and J. E. Dennis Jr. “Analysis of Generalized Pattern Searches.” SIAM Journal on Optimization. Volume 13, Number 3, 2003, pp. 889–903.

[2] Conn, A. R., N. I. M. Gould, and Ph. L. Toint. “A Globally Convergent Augmented Lagrangian Barrier Algorithm for Optimization with General Inequality Constraints and Simple Bounds.” Mathematics of Computation. Volume 66, Number 217, 1997, pp. 261–288.

[3] Abramson, Mark A. Pattern Search Filter Algorithms for Mixed Variable General Constrained Optimization Problems. Ph.D. Thesis, Department of Computational and Applied Mathematics, Rice University, August 2002.

[4] Abramson, Mark A., Charles Audet, J. E. Dennis, Jr., and Sebastien Le Digabel. “ORTHOMADS: A deterministic MADS instance with orthogonal directions.” SIAM Journal on Optimization. Volume 20, Number 2, 2009, pp. 948–966.

[5] Kolda, Tamara G., Robert Michael Lewis, and Virginia Torczon. “Optimization by direct search: new perspectives on some classical and modern methods.” SIAM Review. Volume 45, Issue 3, 2003, pp. 385–482.

[6] Kolda, Tamara G., Robert Michael Lewis, and Virginia Torczon. “A generating set direct search augmented Lagrangian algorithm for optimization with a combination of general and linear constraints.” Technical Report SAND2006-5315, Sandia National Laboratories, August 2006.

[7] Lewis, Robert Michael, Anne Shepherd, and Virginia Torczon. “Implementing generating set search methods for linearly constrained minimization.” SIAM Journal on Scientific Computing. Volume 29, Issue 6, 2007, pp. 2507–2530.

扩展功能

全部展开

版本历史记录

在 R2006a 之前推出