用整数和非线性约束求解非线性问题
的surrogateopt
求解器同时接受整数约束和非线性约束。比较有整数约束和没有整数约束的非线性问题的解。整数约束使解位于一个相当精细的网格上。
目标函数和约束函数
目标函数为
该目标函数是非负的,并且在该点处取其最小值0 =[1.3333, 1.0370]。
该问题有两个非线性约束函数。
画出非线性约束的可行区域。
[X,Y] = meshgrid(-2:.01:3);Z = (5*sinh(y /5) >= x ^4);满足第一个约束时% Z=1,否则Z=0Z = Z+ 2*(5*tanh(X./5) >= Y.^2 - 1);% Z=2,其中满足第二个约束% Z=3,其中两个约束条件都满足冲浪(X, Y, Z,“线型”,“没有”);FIG = gcf;fig.Color =' w ';%白色背景视图(0,90)包含(“x_1”) ylabel (“x_2”)
黄色区域显示两个约束条件都得到满足的地方。
surrogateopt
要求目标函数和约束函数是返回结构的同一个函数的一部分。目标函数在Fval
场的结构,并且约束都在Ineq
字段。类的输出objconstr
在本例结束.
在精细网格上缩放整数约束
将问题设置为两个变量都有整数约束,x (1)
而且x (2)
.
Intcon = [1 2];
缩放问题,使变量被缩放S = 1/10
,在那里年代
将变量相乘。
S = 0.1;F = @(x)objconstr(x,s);
为了使这个缩放有效,你需要缩放边界 .将无缩放边界设置为 然后按 .
Lb = [-2,-2]/s;Ub = [3,3]/s;
通过缩放年代
时,问题有效地具有的间距年代
在每个组件中x (1)
而且x (2)
.将整数点画成有间距的网格年代
.
持有在网格在Ax = gca;Sp = -2:s:3;斧子。XTick = sp;斧子。YTick = sp;斧子。层=“高级”;斧子。GridAlpha = 1/2;斧子。XTickLabel =”;斧子。YTickLabel =”;包含(“x_1”) ylabel (“x_2”)举行从
解决规模问题
设置选项以使用比默认值更严格的约束,并使用surrogateoptplot
图的功能。
Opts = optimoptions(“surrogateopt”,“PlotFcn”,“surrogateoptplot”,“ConstraintTolerance”1 e-6);
调用surrogateopt
解决问题。
rng默认的%用于再现性[sol,fval,eflag,outpt] = surrogateopt(f,lb,ub,intcon,opts)
surrogateopt停止,因为它超过了'options.MaxFunctionEvaluations'设置的函数计算限制。
索尔=1×25个1
Fval = 0.8634
Eflag = 0
outpt =带字段的结构:Elapsedtime: 77.0724 funccount: 200 constrviolation: -0.0375 ineq: [-0.0375 -1.4883] rngstate: [1x1 struct] message: 'surrogateopt停止,因为它超过了函数计算限制…'
将解决方案绘制为图上的红色圆圈。注意,目标函数值约为0.86。
图(图);持有在plot3 (sol (1) * s,索尔(2)*年代,5,“罗”)举行从
与不带整数约束的解比较
将有整数约束的解决方案与没有整数约束的解决方案进行比较。
[sol2,fval2,eflag2,outpt2] = surrogateopt(f,lb,ub,[],opts)
surrogateopt停止,因为它超过了'options.MaxFunctionEvaluations'设置的函数计算限制。
sol2 =1×24.3631 - 0.3626
Fval2 = 0.8153
Eflag2 = 0
outpt2 =带字段的结构:Elapsedtime: 45.3679 funccount: 200 constrviolation: -1.7294e-05 ineq: [-1.7294e-05 -1.4339] rngstate: [1x1 struct] message: 'surrogateopt停止,因为它超过了函数计算限制…'
这里,目标函数值约为0.815。整数约束使目标函数值增加不超过10%。将新的解与之前的整数解一起绘制出来。放大以更清楚地看到解决方案点。
图(图)在plot3 (sol2 (1) * s, sol2 (2) * s, 5,“k *’,“MarkerSize”,12) xlim([0 1]) ylim([-1/2 /2])保持从
Helper函数
此代码创建objconstr
helper函数。这个函数缩放变量x
通过因子年代
对象中的目标函数值Fval
字段F
结构中的非线性约束Ineq
字段F
结构。
函数F = objconstr(x,s) x = x*s;有趣=日志(1 + 3 * (x (2) - (x (1) ^ 3 - x (1))) ^ 2 + (x (1) - 4/3) ^ 2);C1 = x(1)^4 - 5*sinh(x(2)/5);C2 = x(2)^2 - 5*tanh(x(1)/5) - 1;C = [c1 c2];F.Fval =乐趣;F.Ineq = c;结束