surrogateopt
,基于问题有些问题要求你找到一个满足所有约束条件的点,而不需要最小化目标函数。例如,假设你有以下约束条件:
做任何点
满足的约束?要回答这个问题,您需要在不同的点对表达式求值。的surrogateopt
解算器不需要您提供初始点,它搜索广泛的点集。所以,surrogateopt
适用于可行性问题。
要显示约束,请参阅可视化的约束.关于这个问题的基于求解器的方法,请参见解决可行性问题.
请注意:这个例子使用了两个helper函数,outfun.
和equationexpr.
.控件中提供了每个函数的代码此示例的结尾.确保每个函数的代码包含在脚本的末尾或路径上的文件中。
对于基于问题的方法,创建优化变量x
和y
,并为列出的约束创建表达式。使用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解决问题。
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解决问题。
优化被绘图函数或输出函数停止。
索尔=结构与字段: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”) 抓住离开
警告(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);结束