主要内容

写约束

咨询优化工具箱文档

许多全局优化工具箱函数接受边界、线性约束或非线性约束。要查看如何在问题中包含这些约束,请参见写约束.试着查阅相关章节的链接:

请注意

surrogateopt求解器对非线性约束使用不同于其他求解器的语法,并要求所有组件的有限边界。具体操作请参见功能参考页面在代理选择形式和其他求解形式之间转换非线性约束

设置范围

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

  • GlobalSearch需要它的散点搜索点生成的边界。如果你不提供界限,GlobalSearch限定下面的每个组件-9999年及以上的10001.然而,这些界限很容易是不恰当的。

  • 如果你不提供边界和自定义起点,MultiStart限定下面的每个组件-1000年及以上的1000.然而,这些界限很容易是不恰当的。

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

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

确保总选方案的可行性

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

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

为保证可行性,使用默认的交叉和变异函数遗传算法.特别要注意的是,任何自定义函数都要保持对边界和线性约束的可行性。

遗传算法当存在整数约束时,不强制线性约束。相反,遗传算法将线性约束违反纳入惩罚函数。看到整数ga算法

梯度和麻布

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

矢量化的约束

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

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

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

x 1 2 4 + x 2 2 9 + x 3. 2 25 6 x 3. cosh 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)^ 2 - x(:, 2)。^ 2 - x (:, 3) ^ 2;

在有约束的区域上nlinconst使用patternsearch

选择= optimoptions(‘patternsearch’,‘UseCompletePoll’,真的,UseVectorized, true);[x fval] = patternsearch (@vfun, (1, 1, 2 ],[],[],[],[],[],[],...优化终止:网格大小小于选项。MeshTolerance和constraint violation小于options. constraintolerance。X = 0.2191 0.7500 12.1712 fval = -148.7480

使用遗传算法

选择= optimoptions(“遗传算法”,“UseVectorized”,真正的);[x fval] = ga(@vfun,3,[],[],[],[],[], @nlinconst,options)X = -1.4098 -0.1216 11.6664 fval = -138.1066

这个问题patternsearch可以更快更准确地计算出答案。

相关的话题