主要内容

解决可行性问题surrogateopt,具体问题具体分析

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

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

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

要可视化约束,请参见可视化的约束.有关此问题的基于求解器的方法,请参见解决可行性问题

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

设立可行性问题

对于基于问题的方法,创建优化变量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;con2 = y <= exp(-x) - 3;con3 = y <= x - 4;

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

问题=优化问题(“约束”,[con1 con2 con3]);

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

解决问题

解决问题的方法surrogateopt

rng (1)%用于再现性[sol,fval] = solve(问题,“规划求解”“surrogateopt”
使用代理解决问题。

{

surrogateopt停止,因为它超过了'options.MaxFunctionEvaluations'设置的函数计算限制。
索尔=带字段的结构:X: 1.7087 y: -2.8453
Fval = 0

如图中红色所示,前几个评估点是不可行的。在大约90次评估之后,求解器找到一个可行点,用蓝色表示。

检查返回方案的可行性。

不可行性(cons1,索尔)
Ans = 0
不可行性(cons2,索尔)
Ans = 0
不可行性(cons3,索尔)
Ans = 0

所有的不可能都是零,说明了这一点索尔是可行的。

在第一个可行点停止求解器

为了更快地获得解决方案,请创建输出函数(参见输出函数),每当它到达一个可行点时,它就会停止求解器。的outfun的辅助函数。本例结束当解算器到达一个没有违反约束的点时停止解算器。

解决问题使用outfun输出函数。

Opts = optimoptions(“surrogateopt”“OutputFcn”, @outfun);rng (1)%用于再现性[sol,fval] = solve(问题,“规划求解”“surrogateopt”“选项”选择)
使用代理解决问题。

{

通过绘图函数或输出函数停止优化。
索尔=带字段的结构:X: 1.7087 y: -2.8453
Fval = 0

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

可视化的约束

为了使约束可视化,可以使用fimplicit.的fimplicit函数将数值传递给它的函数,而评估功能需要结构。要将这些函数绑定在一起,可以使用evaluateExpr函数,该函数出现在本例结束.该函数只是将传递的值放入具有适当名称的结构中。

属性导致的警告evaluateExpr函数对向量化的输入无效。

S =警告(“关闭”MATLAB: fplot: NotVectorized);图cc1 = (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;fimplicit (@ (a, b) evaluateExpr (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);

可行区域位于红色轮廓线内,黑色和蓝色线以下。可行区域在红色轮廓的右下方。

辅助函数

此代码创建outfunhelper函数。

函数stop = outfun(~,optimValues,state) stop = false;开关状态情况下“通路”如果optimValues。currentConstrviolation <= 0 stop = true;结束结束结束

此代码创建evaluateExprhelper函数。

函数p = evaluateExpr(expr,x,y) pt.x = x;Pt.y = y;P = evaluate(expr,pt);结束

另请参阅

||

相关的话题

Baidu
map