许多全局优化工具箱函数接受边界、线性约束或非线性约束。要查看如何在问题中包含这些约束,请参见写约束(优化工具箱)。试试这些咨询相关链接部分:
的surrogateopt
解算器使用比其他求解非线性约束不同的语法,并且需要在所有组件上的有限范围。有关详细信息,请参阅函数引用页面,在surrogateopt表单和其他求解器表单之间转换非线性约束。
为全局求解器设置边界比为局部求解器设置边界更重要。全球解决方案使用范围在各种方式:
GlobalSearch
要求其分散搜索点生成的界限。如果你不提供界限,GlobalSearch
约束下面的每个组件-9999
和由上述10001
。然而,这些边界很容易被不恰当的。
如果您不提供边界,也不提供自定义起点,MultiStart
约束下面的每个组件-1000年
和由上述1000
。然而,这些边界很容易被不恰当的。
遗传算法
使用边界和线性约束来生成初始种群。对于无限问题,遗传算法
使用默认值0
作为下界1
作为每个维度初始点生成的上界。对于有界问题和线性约束问题,遗传算法
使用边界和约束来生成初始填充。
simulannealbnd
和patternsearch
不需要界限,尽管他们可以使用界限。
的遗传算法
求解器通常保持严格的可行性关于界限和线性约束。这意味着,在每次迭代中,总体的所有成员都满足界限和线性约束。
但是,您可以设置导致此可行性失败的选项。例如,如果你设置MutationFcn
来@mutationgaussian
要么@mutationuniform
,突变函数不尊重约束,你的种群可能变得不可行的。类似地,一些交叉函数可能会导致不可行数,尽管默认是不可行数gacreationlinearfeasible
尊重界限和线性约束。同时,遗传算法
当使用自定义变异或交叉函数时,可能会有不可行点。
为了确保可行性,使用默认的交叉和变异功能遗传算法
。特别要注意的是,任何自定义函数都要根据界限和线性约束保持可行性。
遗传算法
当存在整数约束时,不强制执行线性约束。相反,遗传算法
包含线性约束违规到罚函数。看到整数遗传算法。
如果你使用GlobalSearch
要么MultiStart
与fmincon
,你的非线性约束函数可以返回导数(梯度或海森函数)。有关详细信息,请参见梯度和麻布。
的遗传算法
和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) 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
计算解决方案要快得多,也准确得多。