主要内容

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

编写约束

查阅 Optimization Toolbox 文档

许多 Global Optimization Toolbox 函数接受边界、线性约束或非线性约束。要了解如何将这些约束纳入您的问题中,请参阅 编写约束。请尝试查阅以下相关部分的链接:

注意

surrogateopt 求解器对于非线性约束使用不同于其他求解器的语法,并且要求所有分量都有有限的边界。有关详细信息,请参阅函数参考页和在 surrogateopt 形式和其他求解器形式之间转换非线性约束

设置界限

为全局求解器设置边界比为局部求解器设置界限更重要。全局求解器以多种方式使用边界:

  • GlobalSearch 需要其散射搜索点生成的界限。如果不提供边界,则 GlobalSearch 将每个分量的下方边界为 -9999,上方限制为 10001。然而,这些边界很容易不合适。

  • 如果不提供边界并且不提供自定义起点,则 MultiStart 将每个分量边界在 -1000 以下和 1000 以上。然而,这些边界很容易不合适。

  • ga 使用边界和线性约束来进行其初始种群代。对于无界问题,ga 使用默认值 0 作为初始点生成的每个维度的下界,使用默认值 1 作为上界。对于有界问题和具有线性约束的问题,ga 使用边界和约束来确定初始种群。

  • simulannealbndpatternsearch 不需要边界,尽管它们可以使用边界。

确保 ga 选项保持可行性

ga 求解器通常在边界和线性约束方面保持严格的可行性。这意味着,在每次迭代中,种群的所有成员都满足边界和线性约束。

但是,您可以设置导致此可行性失败的选项。例如,如果将 MutationFcn 设置为 @mutationgaussian@mutationuniform,则变异函数不尊重约束,并且您的种群可能变得不可行。类似地,尽管默认的 gacreationlinearfeasible 确实遵守边界和线性约束,但一些交叉函数可能会导致不可行的群体。此外,当使用自定义变异或交叉函数时,ga 可能会出现不可行的点。

为了确保可行性,请使用 ga 的默认交叉和变异函数。要特别小心,任何自定义函数在边界和线性约束方面都应保持可行性。

注意

当问题具有整数约束时,ga 确保所有运算符(变异、交叉和创建)在每次迭代时都返回符合边界、线性约束和整数约束的可行总体。这种可行性在很小的容差范围内。

梯度和黑塞

如果将 GlobalSearchMultiStartfmincon 一起使用,则非线性约束函数可以返回导数(梯度或 Hessian)。有关详细信息,请参阅梯度和黑塞

向量化约束

gapatternsearch 求解器可选择在一次函数调用中计算一组向量的非线性约束函数。该方法比串行计算向量的目标函数花费的时间更少。这种方法称为向量化函数调用。

为了使求解器以向量化方式计算,您必须对目标(适应度)函数和非线性约束函数进行向量化。有关详细信息,请参阅向量化目标和约束函数

例如,假设三维问题的非线性约束为

x124+x229+x32256x3cosh(x1+x2)x1x2x3=2.

以下代码以向量化方式给出这些非线性约束,假设输入矩阵 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 可以更快、更准确地计算出解。

另请参阅

主题