解决可行性问题surrogateopt
,具体问题具体分析
有些问题需要你找到一个满足所有约束条件的点,没有目标函数来最小化。例如,假设你有以下约束条件:
做任何点
满足约束条件?要回答这个问题,您需要在不同的点上计算表达式。的surrogateopt
Solver不需要你提供初始点,它搜索一个广泛的点集。所以,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”)举行从
警告(s);
可行区域位于红色轮廓线内,黑色和蓝色线以下。可行区域在红色轮廓的右下方。
辅助函数
此代码创建outfun
helper函数。
函数stop = outfun(~,optimValues,state) stop = false;开关状态情况下“通路”如果optimValues。currentConstrviolation <= 0 stop = true;结束结束结束
此代码创建evaluateExpr
helper函数。
函数p = evaluateExpr(expr,x,y) pt.x = x;Pt.y = y;P = evaluate(expr,pt);结束