surrogateopt
用于全局最小化耗时目标函数的替代优化
语法
说明
surrogateopt
是一个耗时目标函数的全局求解器。
surrogateopt
尝试解决以下形式的问题
求解器在多个维度中搜索实值目标函数的全局最小值,并受边界、可选线性约束、可选整数约束和可选非线性不等式约束。surrogateopt
最适合需要很长时间才能评估的目标函数。目标函数可以是非平滑的。求解器要求所有变量都有有限的边界。求解器可以选择维护检查点文件,以便从崩溃或部分执行中恢复,或者在满足停止条件后继续优化。目标函数 f(x)可以为空([]
),在这种情况下 surrogateopt
会尝试找到一个满足所有约束的点。
从保存的检查点文件中的状态继续运行优化。请参阅 使用检查点文件。x
= surrogateopt(checkpointFile
)
继续从已保存的检查点文件中的状态运行优化,并用 x
= surrogateopt(checkpointFile
,opts
)checkpointFile
中的选项替换 opts
中的选项。请参阅 检查点文件。
示例
在区域 -2.1 <= x(i) <= 2.1
中寻找六峰驼峰函数的最小值。该函数有两个全局极小值,目标函数值为 -1.0316284...
,以及四个局部极小值,目标函数值更高。
rng default % For reproducibility objconstr = @(x)(4*x(:,1).^2 - 2.1*x(:,1).^4 + x(:,1).^6/3 ... + x(:,1).*x(:,2) - 4*x(:,2).^2 + 4*x(:,2).^4); lb = [-2.1,-2.1]; ub = -lb; x = surrogateopt(objconstr,lb,ub)
surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'.
x = 1×2
0.0898 -0.7131
找到罗森布洛克函数的最小值
受非线性约束,即解位于点 [1/3,1/3] 周围半径为 1/3 的圆盘中:
.
为此,编写一个函数 objconstr (x)
,它在结构体字段 Fval
中返回罗森布洛克函数的值,并在结构体字段 Ineq
中以 形式返回非线性约束值。
type objconstr
function f = objconstr(x) f.Fval = 100*(x(2) - x(1)^2)^2 + (1 - x(1))^2; f.Ineq = (x(1)-1/3)^2 + (x(2)-1/3)^2 - (1/3)^2;
在每个分量上使用 0 的下界和 2/3 的上界来调用 surrogateopt
。
lb = [0,0]; ub = [2/3,2/3]; [x,fval,exitflag] = surrogateopt(@objconstr,lb,ub)
surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'.
x = 1×2
0.6546 0.4277
fval = 0.1194
exitflag = 0
检查解处的非线性约束值。
disp(objconstr(x).Ineq)
9.9334e-04
约束函数值接近于零,表明约束在解有效。
对于二维变量 ps_example
,求出 x
函数的最小值,该变量的第一个分量限制为整数值,并且所有分量都在 -5 到 5 之间。
intcon = 1; rng default % For reproducibility objconstr = @ps_example; lb = [-5,-5]; ub = [5,5]; x = surrogateopt(objconstr,lb,ub,intcon)
surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'.
x = 1×2
-5.0000 0.0004
最小化区域 -2.1 <= x(i) <= 2.1
中的六峰驼峰函数。该函数有两个全局极小值,目标函数值为 -1.0316284...
,以及四个局部极小值,目标函数值更高。
要系统地搜索该区域,请使用规则的起点网格。将 120 设置为函数计算的最大次数。使用 'surrogateoptplot'
绘图函数。要了解 'surrogateoptplot'
图,请参阅 解释 surrogateoptplot。
rng default % For reproducibility objconstr = @(x)(4*x(:,1).^2 - 2.1*x(:,1).^4 + x(:,1).^6/3 ... + x(:,1).*x(:,2) - 4*x(:,2).^2 + 4*x(:,2).^4); lb = [-2.1,-2.1]; ub = -lb; [Xpts,Ypts] = meshgrid(-3:3); startpts = [Xpts(:),Ypts(:)]; options = optimoptions('surrogateopt','PlotFcn','surrogateoptplot',... 'InitialPoints',startpts,'MaxFunctionEvaluations',120); x = surrogateopt(objconstr,lb,ub,options)
surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'.
x = 1×2
0.0900 -0.7125
最小化受线性不等式约束的非线性目标函数。最小化 200 个函数计算。
objconstr = @multirosenbrock; nvar = 6; lb = -2*ones(nvar,1); ub = -lb; intcon = []; A = ones(1,nvar); b = 3; Aeq = []; beq = []; options = optimoptions('surrogateopt','MaxFunctionEvaluations',200); [sol,fval,exitflag,output] = ... surrogateopt(objconstr,lb,ub,intcon,A,b,Aeq,beq,options)
surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'.
sol = 1×6
0.2072 0.0437 0.1360 0.0066 0.1196 -0.0002
fval = 2.1853
exitflag = 0
output = struct with fields:
elapsedtime: 30.3115
funccount: 200
constrviolation: 0
ineq: [1×0 double]
rngstate: [1×1 struct]
message: 'surrogateopt stopped because it exceeded the function evaluation limit set by ↵'options.MaxFunctionEvaluations'.'
创建一个表示区域 -2.1 <= x(i) <= 2.1
中的六峰驼峰函数的问题结构体。将 120 设置为函数计算的最大次数。
rng default % For reproducibility objconstr = @(x)(4*x(:,1).^2 - 2.1*x(:,1).^4 + x(:,1).^6/3 ... + x(:,1).*x(:,2) - 4*x(:,2).^2 + 4*x(:,2).^4); options = optimoptions('surrogateopt','MaxFunctionEvaluations',120); problem = struct('objective',objconstr,... 'lb',[-2.1,-2.1],... 'ub',[2.1,2.1],... 'options',options,... 'solver','surrogateopt'); x = surrogateopt(problem)
surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'.
x = 1×2
0.0898 -0.7131
最小化六峰驼峰函数并返回最小化点和目标函数值。设置选项以抑制所有其他显示。
rng default % For reproducibility objconstr = @(x)(4*x(:,1).^2 - 2.1*x(:,1).^4 + x(:,1).^6/3 ... + x(:,1).*x(:,2) - 4*x(:,2).^2 + 4*x(:,2).^4); lb = [-2.1,-2.1]; ub = -lb; options = optimoptions('surrogateopt','Display','off','PlotFcn',[]); [x,fval] = surrogateopt(objconstr,lb,ub,options)
x = 1×2
0.0898 -0.7131
fval = -1.0316
通过请求 surrogateopt
返回更多输出来监控替代优化过程。使用 'surrogateoptplot'
绘图函数。要了解 'surrogateoptplot'
图,请参阅 解释 surrogateoptplot。
rng default % For reproducibility objconstr = @(x)(4*x(:,1).^2 - 2.1*x(:,1).^4 + x(:,1).^6/3 ... + x(:,1).*x(:,2) - 4*x(:,2).^2 + 4*x(:,2).^4); lb = [-2.1,-2.1]; ub = -lb; options = optimoptions('surrogateopt','PlotFcn','surrogateoptplot'); [x,fval,exitflag,output] = surrogateopt(objconstr,lb,ub,options)
surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'.
x = 1×2
0.0898 -0.7131
fval = -1.0316
exitflag = 0
output = struct with fields:
elapsedtime: 13.2674
funccount: 200
constrviolation: 0
ineq: [1×0 double]
rngstate: [1×1 struct]
message: 'surrogateopt stopped because it exceeded the function evaluation limit set by ↵'options.MaxFunctionEvaluations'.'
通过设置较小的函数计算最大次数来快速完成替代优化。为了准备重新开始优化的可能性,请求所有求解器输出。
rng default % For reproducibility objconstr = @(x)(4*x(:,1).^2 - 2.1*x(:,1).^4 + x(:,1).^6/3 ... + x(:,1).*x(:,2) - 4*x(:,2).^2 + 4*x(:,2).^4); lb = [-2.1,-2.1]; ub = -lb; options = optimoptions('surrogateopt','MaxFunctionEvaluations',20); [x,fval,exitflag,output,trials] = surrogateopt(objconstr,lb,ub,options);
surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'.
从之前评估的点开始,优化另外 20 个函数计算。
options.InitialPoints = trials; [x,fval,exitflag,output,trials] = surrogateopt(objconstr,lb,ub,options);
surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'.
通过将这 40 个函数计算的图与 搜索全局最小值 中的图进行比较,您会发现重新启动替代优化与求解器连续运行并不相同。
为了能够由于崩溃或任何其他原因重新启动替代优化,请设置检查点文件名。
opts = optimoptions('surrogateopt','CheckpointFile','checkfile.mat');
创建一个优化问题并设置少量的函数计算。
rng default % For reproducibility objconstr = @(x)(4*x(:,1).^2 - 2.1*x(:,1).^4 + x(:,1).^6/3 ... + x(:,1).*x(:,2) - 4*x(:,2).^2 + 4*x(:,2).^4); lb = [-2.1,-2.1]; ub = -lb; opts.MaxFunctionEvaluations = 30; [x,fval,exitflag,output] = surrogateopt(objconstr,lb,ub,opts)
Surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'.
x = 1×2
0.0067 -0.7343
fval = -0.9986
exitflag = 0
output = struct with fields:
elapsedtime: 28.7221
funccount: 30
constrviolation: 0
ineq: [1×0 double]
rngstate: [1×1 struct]
message: 'Surrogateopt stopped because it exceeded the function evaluation limit set by ↵'options.MaxFunctionEvaluations'.'
设置选项以使用 100 个函数计算(这意味着比已经完成的多 70 个)并重新启动优化。
opts.MaxFunctionEvaluations = 100;
[x2,fval2,exitflag2,output2] = surrogateopt('checkfile.mat',opts)
Surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'.
x2 = 1×2
0.0895 -0.7130
fval2 = -1.0316
exitflag2 = 0
output2 = struct with fields:
elapsedtime: 159.2411
funccount: 100
constrviolation: 0
ineq: [1×0 double]
rngstate: [1×1 struct]
message: 'Surrogateopt stopped because it exceeded the function evaluation limit set by ↵'options.MaxFunctionEvaluations'.'
输入参数
目标函数和非线性约束,指定为函数句柄或函数名称。objconstr
接受单个参量 x
,其中 x
通常是行向量。但是,当 Vectorized
选项为 true
时,x
是一个包含 options.BatchUpdateInterval
行的矩阵;每行代表一个要评估的点。objconstr
返回以下之一:
实数标量
fval = objconstr(x)
。结构体。如果结构体包含字段
Fval
,则surrogateopt
会尝试最小化objconstr(x).Fval
。如果结构体包含字段Ineq
,则surrogateopt
会尝试使该字段的所有分量都为非正数:所有条目均为objconstr(x).Ineq <= 0
。objconstr(x)
必须包含Fval
或Ineq
字段,或者同时包含两者。surrogateopt
会忽略其他字段。如果您没有约束,请不要设置objconstr(x).Ineq
字段,或者将objconstr(x).Ineq
设置为[]
,而不是NaN
。
当 Vectorized
选项为 true
且 BatchUpdateInterval
大于一时,objconstr
对 x
的每一行进行操作并返回下列之一:
实数向量
fval = objconstr(x)
。fval
是一个具有options.BatchUpdateInterval
个条目的列向量(当BatchUpdateInterval
不能整除MaxFunctionEvaluations
时,最后一个函数求值中的条目数会更少)。带有向量条目的结构体。如果结构体包含字段
Fval
,则surrogateopt
尝试最小化objconstr(x).Fval
,并且objconstr(x).Fval
是长度为BatchUpdateInterval
(或更短)的向量。如果结构体包含字段Ineq
,则surrogateopt
会尝试使该字段的所有分量都为非正数:objconstr(x).Ineq <= 0
代表所有条目,而objconstr(x).Ineq
最多包含BatchUpdateInterval
个条目。
目标函数 objconstr.Fval
可以为空([]
),在这种情况下 surrogateopt
会尝试找到一个满足所有约束的点。请参阅 解决可行性问题。
有关使用非线性约束的示例,请参阅解决非线性约束问题、非线性约束的替代优化 和 解决可行性问题。有关在 surrogateopt
结构体语法与其他求解器之间进行转换的信息,请参阅 packfcn
和 在 surrogateopt 形式和其他求解器形式之间转换非线性约束;有关使用向量化批量评估的示例,请参阅 并行优化 Simulink 模型。
数据类型: function_handle
| char
| string
整数变量,指定为正整数向量,其值从 1
到问题变量的数量。intcon
中的每个值表示一个整数值 x
分量。
示例: 要指定 x
中的偶数项为整数值,请将 intcon
设置为 2:2:nvars
。
数据类型: double
线性不等式约束,指定为实矩阵。A
是 M
×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
线性等式约束,指定为实矩阵。Aeq
是 Me
×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
选项,指定为 optimoptions
的输出。
有关详细信息,请参阅替代优化选项。
选项 | 描述 | 值 |
---|---|---|
BatchUpdateInterval |
| 正整数。默认值是 |
CheckpointFile | 检查点和重新启动优化的文件名。该文件具有 检查点需要时间。对于那些只需很少时间进行评估的函数来说,这种开销尤其明显。 | 文件名或文件路径,以字符串或字符数组形式给出。如果指定文件名而没有路径, |
ConstraintTolerance | 非线性约束的容差,以所有非线性约束函数值的最大值来衡量,正值表示违反规定。此容差是绝对(非相对)容差;请参阅 容差和停止条件。 | 非负标量。默认值是 1e-3 。 |
Display | 命令行返回的显示级别。 |
|
InitialPoints | 求解器的初始点。 | 初始点矩阵,每行一个点。或者,具有字段
请参阅 算法控制。默认值是 |
MaxFunctionEvaluations | 目标函数评估的最大次数,停止条件。 | 非负整数。默认值为 max(200,50*nvar) ,其中 nvar 是问题变量的数量。 |
MaxTime | 最大运行时间(秒)。由于评估目标函数所需的时间或并行处理延迟,实际运行时间可能会超过 MaxTime 。 | 非负标量。默认值是 Inf 。 |
MinSampleDistance | 自适应采样器生成的试验点之间的最小距离。请参阅 替代优化算法。 | 非负标量。默认值是 1e-6 。 |
MinSurrogatePoints | 在替代创建阶段开始时要创建的最小随机样本点数。请参阅 替代优化算法。 当 | 至少为 nvar + 1 的整数。默认值为 max(20,2*nvar) ,其中 nvar 是问题变量的数量。 |
ObjectiveLimit | 对目标函数值的容忍度。如果可行点的计算目标函数值小于 ObjectiveLimit ,则算法停止。 | 双精度标量值。默认值是 -Inf 。 |
OutputFcn | 输出函数用于报告求解器进度或停止求解器。请参阅 输出函数。 | 函数名称、函数句柄或者函数名称或句柄的元胞数组。默认值是 [] 。 |
PlotFcn | 绘图函数显示求解器进度或停止求解器。请参阅 绘图函数。 | 函数名称、函数句柄或者函数名称或句柄的元胞数组。内置绘图函数有:
|
UseParallel | 布尔值,指示是否并行计算目标函数值。 您不能同时指定 | 布尔值。默认值是 false 。有关算法的详细信息,请参阅 并行 surrogateopt 算法。 |
UseVectorized | 布尔值,指示是否以 您不能同时指定 | 布尔值。默认值是 false 。有关示例,请参阅 并行优化 Simulink 模型。 |
示例: options = optimoptions('surrogateopt','Display','iter','UseParallel',true)
问题结构体,指定为具有以下字段的结构体:
objective
-目标函数,可以包括非线性约束,指定为函数名称或函数句柄lb
-x
的下界ub
-x
的上界solver
—'surrogateopt'
Aineq
- 线性不等式约束矩阵(可选)bineq
- 线性不等式约束向量(可选)Aeq
-线性等式约束矩阵(可选)beq
-线性等式约束向量(可选)options
- 使用optimoptions
创建的选项rngstate
- 用于重置随机数生成器状态的字段(可选)intcon
- 指定整数值x
分量的字段(可选)
注意
这些 problem
字段是必需的:objective
、lb
、ub
、solver
和 options
。
数据类型: struct
检查点文件的路径,指定为字符串或字符向量。检查点文件的扩展名为 .mat
。如果指定文件名而没有路径,surrogateopt
将使用当前文件夹中的检查点文件。
检查点文件存储优化的状态以便恢复优化。surrogateopt
会在每次函数评估时更新检查点文件,因此即使 surrogateopt
过早停止,您也可以恢复优化。有关示例,请参阅 从检查点文件重新启动替代优化。
当 surrogateopt
具有有效的 CheckpointFile
选项时,它会创建一个检查点文件。
从检查点文件恢复时您可以更改一些选项。请参阅 opts
。
检查点文件中的数据采用 .mat
格式。为了避免出现错误或其他意外结果,请不要在调用 surrogateopt
之前修改数据。
警告
不要从使用不同 MATLAB® 版本创建的检查点文件恢复 surrogateopt
。surrogateopt
可能会引发错误或产生不一致的结果。
示例: 'checkfile.mat'
示例: "C:\Program Files\MATLAB\docs\checkpointNov2019.mat"
数据类型: char
| string
从检查点文件恢复优化的选项,指定为 optimoptions
选项(来自受限集合),您可以从原始选项中进行更改。您可以更改的选项包括:
BatchUpdateInterval
CheckpointFile
Display
MaxFunctionEvaluations
MaxTime
MinSurrogatePoints
ObjectiveLimit
OutputFcn
PlotFcn
UseParallel
UseVectorized
示例: opts = optimoptions(options,'MaxFunctionEvaluations',400);
输出参量
原因 surrogateopt
停止,以此表描述的整数值之一返回。
退出标志 | 描述 |
---|---|
| 由于以下原因之一,问题有唯一可行的解:
|
3 | 找到可行点。求解器停止,因为找到的新可行点太少,无法继续。 |
| 目标函数值小于 |
| 函数计算的次数超过 |
| 优化被输出函数或绘图函数终止。 |
| 由于以下原因之一,找不到可行点:
|
算法
surrogateopt
重复执行以下步骤:
通过在边界内采样
MinSurrogatePoints
个随机点来创建一组试验点,并在试验点处评估目标函数。通过对所有随机试验点插入径向基函数来创建目标函数的替代模型。
创建一个优化函数,为替代赋予一些权重,为与试验点的距离赋予一些权重。通过在现任点(自上次替代重置以来找到的最佳点)周围的区域中随机采样优值函数来找到优化函数优化函数的一个小值。使用此点(称为自适应点)作为新的试验点。
在自适应点处评估目标,并根据该点及其值更新替代。如果目标函数值足够低于之前观察到的最佳(最低)值,则算作“成功”,否则算作“失败”。
如果在
max(nvar,5)
次失败之前发生三次成功,则向上更新样本分布的离散度,其中nvar
是维数。如果在三次成功之前发生max(nvar,5)
失败,则向下更新分散度。从步骤 3 继续,直到所有试验点都在评估点的
MinSampleDistance
范围内。此时,通过丢弃替代中的所有自适应点来重置替代,重置比例,并返回步骤 1 以创建MinSurrogatePoints
个新的随机试验点进行评估。
有关详细信息,请参阅替代优化算法。
替代功能
App
优化实时编辑器任务为 surrogateopt
提供了一个可视化界面。
扩展功能
要并行运行,请将 'UseParallel'
选项设置为 true
。
options = optimoptions('
solvername
','UseParallel',true)
有关详细信息,请参阅如何在 Global Optimization Toolbox 中使用并行处理。
版本历史记录
在 R2018b 中推出MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
选择网站
选择网站以获取翻译的可用内容,以及查看当地活动和优惠。根据您的位置,我们建议您选择:。
您也可以从以下列表中选择网站:
如何获得最佳网站性能
选择中国网站(中文或英文)以获得最佳网站性能。其他 MathWorks 国家/地区网站并未针对您所在位置的访问进行优化。
美洲
- América Latina (Español)
- Canada (English)
- United States (English)
欧洲
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)