编写约束
查阅 Optimization Toolbox 文档
许多 Global Optimization Toolbox 函数接受边界、线性约束或非线性约束。要了解如何将这些约束纳入您的问题中,请参阅 编写约束。请尝试查阅以下相关部分的链接:
注意
surrogateopt
求解器对于非线性约束使用不同于其他求解器的语法,并且要求所有分量都有有限的边界。有关详细信息,请参阅函数参考页和在 surrogateopt 形式和其他求解器形式之间转换非线性约束。
设置界限
为全局求解器设置边界比为局部求解器设置界限更重要。全局求解器以多种方式使用边界:
GlobalSearch
需要其散射搜索点生成的界限。如果不提供边界,则GlobalSearch
将每个分量的下方边界为-9999
,上方限制为10001
。然而,这些边界很容易不合适。如果不提供边界并且不提供自定义起点,则
MultiStart
将每个分量边界在-1000
以下和1000
以上。然而,这些边界很容易不合适。ga
使用边界和线性约束来进行其初始种群代。对于无界问题,ga
使用默认值0
作为初始点生成的每个维度的下界,使用默认值1
作为上界。对于有界问题和具有线性约束的问题,ga
使用边界和约束来确定初始种群。simulannealbnd
和patternsearch
不需要边界,尽管它们可以使用边界。
确保 ga
选项保持可行性
ga
求解器通常在边界和线性约束方面保持严格的可行性。这意味着,在每次迭代中,种群的所有成员都满足边界和线性约束。
但是,您可以设置导致此可行性失败的选项。例如,如果将 MutationFcn
设置为 @mutationgaussian
或 @mutationuniform
,则变异函数不尊重约束,并且您的种群可能变得不可行。类似地,尽管默认的 gacreationlinearfeasible
确实遵守边界和线性约束,但一些交叉函数可能会导致不可行的群体。此外,当使用自定义变异或交叉函数时,ga
可能会出现不可行的点。
为了确保可行性,请使用 ga
的默认交叉和变异函数。要特别小心,任何自定义函数在边界和线性约束方面都应保持可行性。
注意
当问题具有整数约束时,ga
确保所有运算符(变异、交叉和创建)在每次迭代时都返回符合边界、线性约束和整数约束的可行总体。这种可行性在很小的容差范围内。
梯度和黑塞
如果将 GlobalSearch
或 MultiStart
与 fmincon
一起使用,则非线性约束函数可以返回导数(梯度或 Hessian)。有关详细信息,请参阅梯度和黑塞。
向量化约束
ga
和 patternsearch
求解器可选择在一次函数调用中计算一组向量的非线性约束函数。该方法比串行计算向量的目标函数花费的时间更少。这种方法称为向量化函数调用。
为了使求解器以向量化方式计算,您必须对目标(适应度)函数和非线性约束函数进行向量化。有关详细信息,请参阅向量化目标和约束函数。
例如,假设三维问题的非线性约束为
以下代码以向量化方式给出这些非线性约束,假设输入矩阵 x
的行是您的种群或输入向量:
function [c ceq] = nlinconst(x)
c(:,1) = x(:,1).^2/4 + x(:,2).^2/9 + x(:,3).^2/25 - 6;
c(:,2) = cosh(x(:,1) + x(:,2)) - x(:,3);
ceq = x(:,1).*x(:,2).*x(:,3) - 2;
例如,最小向量化二次函数
function y = vfun(x)
y = -x(:,1).^2 - x(:,2).^2 - x(:,3).^2;
在具有约束 nlinconst
的区域上使用 patternsearch
:
options = optimoptions('patternsearch','UseCompletePoll',true,'UseVectorized',true); [x fval] = patternsearch(@vfun,[1,1,2],[],[],[],[],[],[],... @nlinconst,options)
Optimization terminated: mesh size less than options.MeshTolerance and constraint violation is less than options.ConstraintTolerance. x = 0.2191 0.7500 12.1712 fval = -148.7480
使用 ga
:
options = optimoptions('ga','UseVectorized',true); [x fval] = ga(@vfun,3,[],[],[],[],[],[],@nlinconst,options)
Optimization terminated: maximum number of generations exceeded. x = -1.4098 -0.1216 11.6664 fval = -138.1066
对于这个问题,patternsearch
可以更快、更准确地计算出解。