写约束

咨询优化工具箱文档

许多全局优化工具箱函数接受边界、线性约束或非线性约束。要查看如何在问题中包含这些约束,请参见写约束(优化工具箱)。试试这些咨询相关链接部分:

请注意

surrogateopt解算器使用比其他求解非线性约束不同的语法,并且需要在所有组件上的有限范围。有关详细信息,请参阅函数引用页面,在surrogateopt表单和其他求解器表单之间转换非线性约束

设置范围

为全局求解器设置边界比为局部求解器设置边界更重要。全球解决方案使用范围在各种方式:

  • GlobalSearch要求其分散搜索点生成的界限。如果你不提供界限,GlobalSearch约束下面的每个组件-9999和由上述10001。然而,这些边界很容易被不恰当的。

  • 如果您不提供边界,也不提供自定义起点,MultiStart约束下面的每个组件-1000年和由上述1000。然而,这些边界很容易被不恰当的。

  • 遗传算法使用边界和线性约束来生成初始种群。对于无限问题,遗传算法使用默认值0作为下界1作为每个维度初始点生成的上界。对于有界问题和线性约束问题,遗传算法使用边界和约束来生成初始填充。

  • simulannealbndpatternsearch不需要界限,尽管他们可以使用界限。

确保ga选项保持可行性

遗传算法求解器通常保持严格的可行性关于界限和线性约束。这意味着,在每次迭代中,总体的所有成员都满足界限和线性约束。

但是,您可以设置导致此可行性失败的选项。例如,如果你设置MutationFcn@mutationgaussian要么@mutationuniform,突变函数不尊重约束,你的种群可能变得不可行的。类似地,一些交叉函数可能会导致不可行数,尽管默认是不可行数gacreationlinearfeasible尊重界限和线性约束。同时,遗传算法当使用自定义变异或交叉函数时,可能会有不可行点。

为了确保可行性,使用默认的交叉和变异功能遗传算法。特别要注意的是,任何自定义函数都要根据界限和线性约束保持可行性。

遗传算法当存在整数约束时,不强制执行线性约束。相反,遗传算法包含线性约束违规到罚函数。看到整数遗传算法

梯度和麻布

如果你使用GlobalSearch要么MultiStartfmincon,你的非线性约束函数可以返回导数(梯度或海森函数)。有关详细信息,请参见梯度和麻布

矢量化的约束

遗传算法patternsearch求解器可选择在一次函数调用中计算向量集合的非线性约束函数。这种方法比连续计算向量的目标函数的时间要短。此方法称为向量化函数调用。

对于求解器的矢量方式计算,则必须向量化双方你的目标(健身)函数和非线性约束功能。有关详细信息,请参见矢量化目标和约束功能

举个例子,假设你的三维非线性问题的约束条件

x 1 2 4 + x 2 2 9 + x 3. 2 25 6 x 3. 护身用手杖 ( x 1 + x 2 ) x 1 x 2 x 3. = 2.

下面的代码以向量化的方式给出了这些非线性约束,假设您的输入矩阵的行x是你的总体或输入向量:

函数[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;

例如,最小化向量化的二次函数

函数y = vfun(x) y = -x(:,1)。^ 2 - x (:, 2)。^ 2 - x (:, 3) ^ 2;

在具有约束区域nlinconst使用patternsearch:

选择= optimoptions (‘patternsearch’,‘UseCompletePoll’,真的,UseVectorized, true);[x fval] = patternsearch (@vfun [1, 2], [], [], [], [], [], [],…终止优化:网格大小小于选项。网格容忍和约束冲突小于选择。约束冲突。x = 0.2191 0.7500 12.1712 fval = -148.7480

使用遗传算法:

选项= optimoptions( 'GA', 'UseVectorized',TRUE);[X FVAL] = GA(@ vfun,3,[],[],[],[],[],[],@ nlinconst,选项)优化终止:超过几代的最大数目。X = -1.4098 -0.1216 11.6664 FVAL = -138.1066

这个问题patternsearch计算解决方案要快得多,也准确得多。

相关话题