写约束
咨询优化工具箱文档
许多全局优化工具箱函数接受范围、线性约束或非线性约束。如何将这些约束纳入你的问题,看看写约束。试着咨询这些相关的部分:
请注意
的surrogateopt
解算器使用不同的语法比其他解决非线性约束,并要求所有组件上的有限范围。详情,请参见页面和功能参考surrogateopt之间转换非线性约束形式和其他形式的解算器。
设置范围
更重要的是为解决全球范围比当地的解决者。在各种方式解决全球使用范围:
GlobalSearch
需要界限scatter-search点生成。如果你不提供,GlobalSearch
下面的每个组件-9999年
及以上的10001年
。然而,这些界限可以很容易地不合适。如果你不提供边界和不提供定制的开始点,
MultiStart
下面的每个组件-1000年
及以上的1000年
。然而,这些界限可以很容易地不合适。遗传算法
使用范围和线性约束的初始种群生成。对于无限问题,遗传算法
使用一个默认的0
下界和1
作为初始点每个维度的上界的一代。为有界问题,线性约束问题,遗传算法
使用范围和约束,使初始种群。simulannealbnd
和patternsearch
不需要界限,尽管他们可以使用范围。
确保ga选项保持可行性
的遗传算法
解算器通常严格可行性界限和线性约束。这意味着,在每一个迭代中,所有成员的人口满足范围和线性约束。
然而,您可以设置的选项,导致这个可行性失败。例如,如果你设置MutationFcn
来@mutationgaussian
或@mutationuniform
、变异函数不尊重约束和人口会变得不可行。同样,一些交叉功能会导致人口不可行,尽管默认gacreationlinearfeasible
并尊重界限和线性约束。同时,遗传算法
可以使用自定义时不可行点突变或交叉功能。
为了确保可行性,使用默认的交叉和变异函数遗传算法
。特别注意,任何定制函数保持可行性界限和线性约束。
请注意
当一个问题整数约束,遗传算法
确保所有操作符(变异、交叉和创建)返回可行的人群范围,在每个迭代线性约束和整数约束。这个可行性坚持小公差之内。
梯度和麻布
如果你使用GlobalSearch
或MultiStart
与fmincon
,你的非线性约束函数可以返回衍生品(梯度或麻绳)。有关详细信息,请参见梯度和麻布。
矢量化的约束
的遗传算法
和patternsearch
解决可计算的非线性约束函数向量的集合在一个函数调用。该方法可以花更少的时间比串行计算向量的目标函数。这种方法被称为矢量函数调用。
为解决计算矢量化的方式,你必须vectorize客观(健身)函数和非线性约束函数。有关详细信息,请参见Vectorize目标和约束函数。
作为一个例子,假设你为一个三维非线性约束问题
下面的代码提供了这些非线性约束矢量化的方式,假设输入矩阵的行x
你的人口或输入向量:
测查函数[c] = nlinconst c (x) (: 1) = x (: 1)。^ 2/4 + x (:, 2)。^ 2/9 + x (: 3)。^ 2/25 - 6;c (: 2) = cosh (x (: 1) + (2):,) - x (:, 3);测查= 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], [], [], [], [], [], [],…@nlinconst选项)优化终止:网格大小小于选项。MeshTolerance和约束违反小于options.ConstraintTolerance。x = 0.2191 0.7500 12.1712 fval = -148.7480
使用遗传算法
:
选择= optimoptions(“遗传算法”,“UseVectorized”,真正的);[x fval] = ga (@vfun 3 []、[] [], [], [], [], @nlinconst,选项)优化终止:超过了一代又一代的最大数目。x = -1.4098 -0.1216 11.6664 fval = -138.1066
这个问题patternsearch
更快速、准确地计算解决方案。