许多全局优化工具箱函数接受边界、线性约束或非线性约束。要查看如何在问题中包含这些约束,请参见写约束.试着查阅相关章节的链接:
请注意
的surrogateopt
求解器对非线性约束使用不同于其他求解器的语法,并要求所有组件的有限边界。具体操作请参见功能参考页面在代理选择形式和其他求解形式之间转换非线性约束.
为全局求解器设置边界比为局部求解器设置边界更重要。全局求解器以多种方式使用边界:
GlobalSearch
需要它的散点搜索点生成的边界。如果你不提供界限,GlobalSearch
限定下面的每个组件-9999年
及以上的10001
.然而,这些界限很容易是不恰当的。
如果你不提供边界和自定义起点,MultiStart
限定下面的每个组件-1000年
及以上的1000
.然而,这些界限很容易是不恰当的。
遗传算法
使用边界和线性约束的初始种群生成。对于无限问题,遗传算法
使用默认的0
作为下界和1
作为初始点生成的每个维度的上限。对于有界问题和线性约束问题,遗传算法
使用边界和约束条件来生成初始总体。
simulannealbnd
和patternsearch
不需要边界,尽管他们可以使用边界。
的遗传算法
解算器通常在边界和线性约束下保持严格的可行性。这意味着,在每次迭代中,总体的所有成员都满足边界和线性约束。
但是,您可以设置导致此可行性失败的选项。例如,如果你设置MutationFcn
来@mutationgaussian
或@mutationuniform
,突变函数不考虑约束条件,你的种群就会变得不可行的。类似地,一些交叉函数可能导致不可行的总体,尽管默认gacreationlinearfeasible
考虑边界和线性约束。同时,遗传算法
当使用自定义变异或交叉函数时,可以有不可行的点。
为保证可行性,使用默认的交叉和变异函数遗传算法
.特别要注意的是,任何自定义函数都要保持对边界和线性约束的可行性。
遗传算法
当存在整数约束时,不强制线性约束。相反,遗传算法
将线性约束违反纳入惩罚函数。看到整数ga算法.
如果你使用GlobalSearch
或MultiStart
与fmincon
,你的非线性约束函数可以返回导数(梯度或Hessian)。有关详细信息,请参见梯度和麻布.
的遗传算法
和patternsearch
求解器可选地在一次函数调用中计算向量集合的非线性约束函数。该方法比连续计算向量的目标函数所需的时间要少。这个方法称为向量化函数调用。
为了使求解器以向量化的方式进行计算,您必须同时向量化目标(适应度)函数和非线性约束函数。有关详细信息,请参见向量化目标函数和约束函数.
举个例子,假设三维问题的非线性约束是
下面的代码以向量化的方式给出这些非线性约束,假设输入矩阵的行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
可以更快更准确地计算出答案。