有些问题要求你找到一个满足所有约束条件的点,没有目标函数来最小化。例如,假设你有以下约束:
做任何点
满足的约束?为此,编写一个返回结构字段中的约束的函数Ineq
.把约束条件写成二元向量的形式
而不是
.把每个不等式写成一个函数
,表示不等式
等号两边同时减去等号右边。为了便于绘图,以向量化的方式编写函数,其中每一行代表一个点。此助手函数的代码,名为objconstr
,出现在本例结束.
画出三个函数满足等式的点 和 ,并绘制函数值为-1/2的等值线来表示不等式。
[XX, YY] = meshgrid (2:0.1:2 4:0.1:2);ZZ = objconstr ([XX (:), YY (:))) .Ineq;ZZ =重塑(ZZ,[大小(XX), 3]);h =图;甘氨胆酸ax =;轮廓(ax, XX, YY, ZZ (:,: 1), [0] 1/2,“r”,“ShowText”,“上”);持有在轮廓(ax, XX, YY, ZZ (:,: 2), [0] 1/2,“k”,“ShowText”,“上”);轮廓(ax, XX, YY, ZZ (:,:, 3), [0] 1/2,“b”,“ShowText”,“上”);持有从
该图显示在[1.75,-3]附近存在可行点。
设置下界为-5,上界为3,然后使用surrogateopt
.
rng (1)%的再现性磅= (5,5);乌兰巴托= (3 3);[x, fval exitflag、输出试验]= surrogateopt (@objconstr磅,乌兰巴托)
surrogateopt停止是因为它超过了'options. maxfunctionevalues '设置的函数计算限制。
x =1×21.7312 - -3.0312
Fval = 1x0空双行向量
exitflag = 0
输出=结构体字段:[-0.0800 -0.2083 -0.7625] rngstate: [1x1 struct] message: 'surrogateopt stopped because it exceeded the function evaluation limit set by…' message: 'surrogateopt stopped because it exceeded the function evaluation limit set by…'
试验=结构体字段:X: [200x2 double] inq: [200x3 double]
检查返回溶液的可行性x
.
disp (output.ineq)
-0.0800 -0.2083 -0.7625
等价地,对函数求值objconstr
在返回的解决方案x
.
disp (objconstr (x) .Ineq)
-0.0800 -0.2083 -0.7625
等价于检查Ineq
字段试用
解决方案的结构x
.首先,找到索引x
在试用X
字段。
indx = ismember(试验。X, X,“行”);disp (trials.Ineq (indx:))
-0.0800 -0.2083 -0.7625
所有约束函数值均为负值,表示点x
是可行的。
查看评估的可行点surrogateopt
.
选择= optimoptions (“surrogateopt”);indexx = max(trials.Ineq,[],2) <= opts. constraintolerance;可行点指数图(h);持有在情节(trials.X (indx, 1), trials.X (indx, 2),‘*’) xlim([1 2]) ylim([-3.5 -2.5]从
此代码创建objconstr
helper函数。
函数F = objconstr(x) c(:,1) = (x(:,2) + x(:,1).^2)。^ 2 + 0.1 * x(:, 2)。^ 2 - 1;exp(-x(: 1)) + 3;C: = x(:,2) - x(:,1) + 4;f.Ineq = c;结束