主要内容

解决可行性问题surrogateopt,基于问题

有些问题要求你找到一个满足所有约束条件的点,而不需要最小化目标函数。例如,假设你有以下约束条件:

y + x 2 2 + 0 1 y 2 1 y 经验值 - x - 3. y x - 4

做任何点 x y 满足的约束?要回答这个问题,您需要在不同的点对表达式求值。的surrogateopt解算器不需要您提供初始点,它搜索广泛的点集。所以,surrogateopt适用于可行性问题。

要显示约束,请参阅可视化的约束.关于这个问题的基于求解器的方法,请参见解决可行性问题

请注意:这个例子使用了两个helper函数,outfun.equationexpr..控件中提供了每个函数的代码此示例的结尾.确保每个函数的代码包含在脚本的末尾或路径上的文件中。

建立可行性问题

对于基于问题的方法,创建优化变量xy,并为列出的约束创建表达式。使用surrogateopt求解器,你必须为所有变量设置有限的界。设置-10的下界和10的上界。

x = optimvar (“x”“下界”, -10,“UpperBound”10);y = Optimvar(“y”“下界”, -10,“UpperBound”10);con1 = (y + x^2)^2 + 0.1*y^2 <= 1;x = 0, x = 0;con3 = y <= x - 4; / /

创建一个优化问题,并在问题中包含约束条件。

prob = OptimProblem(“约束”,[CONS1 CONS2 CONS3]);

这个问题没有目标函数。在内部,求解器将目标函数值设为0每一点。

解决问题

使用方法解决问题surrogateopt

rng (1)再现性的百分比[溶胶,fval] =解决(概率,“求解器”“surrogateopt”
使用TrustogateOpt解决问题。

图优化绘图功能包含轴对象。具有标题最佳功能值的轴对象:0包含2个类型的2个对象。这些对象代表最佳功能值(不可行),最佳函数值。

surrogateopt停止,因为它超过了'options.MaxFunctionEvaluations'设置的函数求值限制。
索尔=结构与字段:X: 1.7684 y: -3.0296
fval = 0

前面几个评估点是不可行的,如图中的红色所示。经过大约90次计算后,求解器找到一个可行点,用蓝色标出。

在返回的溶液上检查可行性。

缺点(cons1,sol)
ans = 0
缺点(CONS2,SOL)
ans = 0
缺点(CONS3,SOL)
ans = 0

所有的不可行性都为零,表示该点索尔是可行的。

在第一个可行点停止求解

要更快地达到解决方案,请创建输出功能(参见输出函数)只要达到可行点,就会停止求解器。的outfun.的辅助函数此示例的结尾当求解器到达没有违反约束的点时停止求解器。

用……解决问题outfun.输出函数。

选择= optimoptions (“surrogateopt”“OutputFcn”, @outfun);rng (1)再现性的百分比[溶胶,fval] =解决(概率,“求解器”“surrogateopt”“选项”选择)
使用TrustogateOpt解决问题。

图优化绘图功能包含轴对象。具有标题最佳功能值的轴对象:0包含2个类型的2个对象。这些对象代表最佳功能值(不可行),最佳函数值。

优化被绘图函数或输出函数停止。
索尔=结构与字段:X: 1.7684 y: -3.0296
fval = 0

这一次,求解器比以前更早地停止。

可视化的约束

要可视化约束条件,可以使用fimplicis..的fimplicis.函数将数值传递给它的函数,而评估函数需要一个结构。要将这些函数连接在一起,请使用equationexpr.辅助功能,出现在此示例的结尾.这个函数只是将传递的值放入具有适当名称的结构中。

避免由于equationexpr.函数不能处理向量化的输入。

s =警告('离开''matlab:fplot:否定');图1 = (y + x^2)^2 + 0.1*y^2 - 1;fimplicit (@ (a, b) evaluateExpr (cc1, a, b), (2 2 4 2),“r”) 抓住CC2 = Y  -  EXP(-X)+ 3;Fimplic(@(a,b)评估expr(cc2,a,b),[ -  2 2 -4 2],'k') cc3 = y - x + 4;fimplicit (@ (x, y) evaluateExpr (cc3, x, y) (2 2 4 2),“b”) 抓住离开

图中包含一个轴对象。axis对象包含3个implicitfunctionline类型的对象。

警告(s);

可行区域在红色轮廓线内,在黑色和蓝色线条下面。可行区域在红色轮廓的右下角。

辅助函数

此代码创建outfun.helper函数。

功能停止= outfun(〜,优化值,状态)停止= false;转变状态情况下“通路”如果OptimValues.CurrentConstrviolation <= 0 stop = true;结束结束结束

此代码创建equationexpr.helper函数。

功能p = equateExpr(expr,x,y)pt.x = x;pt.y = y;p =评估(expr,pt);结束

另请参阅

||

相关话题