Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

使用基于问题的 Optimize 实时编辑器任务求解可行性问题

问题描述

此示例说明如何使用 Optimize 实时编辑器任务通过各种求解器找到可行点。问题可以表示为找到满足以下约束的点 [x,y]

(y+x2)2+0.1y21

yexp(-x)-3

yx-4.

绘制约束函数等于零的曲线。要查看域的哪个部分可行(约束函数值为负),请绘制约束函数值等于 -1/2 的曲线。使用此脚本末尾plotobjconstr 函数。

plotobjconstr

Figure contains an axes object. The axes object contains 3 objects of type contour.

x=1.75,y=-3 附近似乎有一个小的可行域。请注意,不存在所有约束值都小于 -1/2 的点,因此可行集很小。

使用基于问题的 Optimize 实时编辑器任务

要找到可行点,请通过选择代码选项卡或插入选项卡上的任务 > 优化,从实时脚本启动 Optimize 实时编辑器任务。选择基于问题的任务。

将问题变量 x 设置为下界为 -5,上界为 5。将问题变量 y 设置为下界为 -10,上界为 10。将 x 的初始点设置为 2,将 y 的初始点设置为 -2。

目标设置为可行性

创建表示三个约束的不等式。您的任务如下图所示。

optimizelet_feasible.png

将任务模式切换到求解问题。该任务会选择 fmincon 求解器并得出以下解。

feasibility_sol1.png

初始点的影响

从不同初始点开始可能会导致 fmincon 找不到解。将 x 的初始点设置为 -2。

feasibility_setup2.png

此时 fmincon 找不到可行解。

feasibility_sol2.png

尝试使用其他求解器

要找到解,请尝试使用其他求解器。将求解器设置为 ga。为此,请在指定与问题相关的求解器选项扩展按钮中指定求解器。为了监控求解器进度,请将绘图函数设置为最大约束违反值

feasibility_setup3.png

ga 找到一个在约束容差范围内的可行点。

feasibility_sol3.png

ga 找到的解与 fmincon 不同。该解不太可行。要获得不可行性较低的解,您可以将约束容差选项设置为小于默认值的值。或者,尝试使用其他求解器。

尝试 surrogateopt

尝试使用 surrogateopt 求解器。将绘图函数设置为最大约束违反值;此设置不会自动从 ga 解继承。

feasibility_sol4.png

surrogateopt 找到一个可行解,但在第一次找到解时不停止。surrogateopt 而是会继续迭代,直到达到其函数计算限制。要提前停止迭代,请指定输出函数,一旦最大约束违反值达到 1e-6 或更小,该函数就会停止求解器。这样做会导致求解器更早停止。使用 surrout 辅助函数,它位于此脚本末尾。要指定此函数,请创建该函数的函数句柄。

outfun = @surrout;

指定与问题相关的求解器选项 > 选项 > 诊断 > 输出函数下拉菜单中指定此函数句柄。

feasibility_setup5.png

feasibility_sol5.png

此时,求解器在大约 30 次(而不是 200 次)函数计算后停止。该解与上一个解略有不同,但均为可行解。

结论

借助基于问题的 Optimize 实时编辑器任务,您可以尝试使用其他求解器来求解问题,即使这些求解器具有不同语法,如 fminconsurrogateopt。该任务还可以帮助您设置绘图函数,以及其他选项。

此处显示的任务处于其最终状态。您可以随意试用不同的求解器和选项。

Live Task

辅助函数

以下代码会创建 plotobjconstr 辅助函数。

function plotobjconstr
[XX,YY] = meshgrid(-2:0.1:2,-4:0.1:2);
ZZ = objconstr([XX(:),YY(:)]).Ineq;
ZZ = reshape(ZZ,[size(XX),3]);
h = figure;
ax = gca;
contour(ax,XX,YY,ZZ(:,:,1),[-1/2 0],'r','ShowText','on');
hold on
contour(ax,XX,YY,ZZ(:,:,2),[-1/2 0],'k','ShowText','on');
contour(ax,XX,YY,ZZ(:,:,3),[-1/2 0],'b','ShowText','on');
hold off
end

以下代码会创建 objconstr 辅助函数。

function f = objconstr(x)
c(:,1) = (x(:,2) + x(:,1).^2).^2 + 0.1*x(:,2).^2 - 1;
c(:,2) = x(:,2) - exp(-x(:,1)) + 3;
c(:,3) = x(:,2) - x(:,1) + 4;
f.Ineq = c;
end

以下代码创建 surrout 辅助函数

function stop = surrout(~,optimValues,~)
stop = false;
if optimValues.constrviolation <= 1e-6 % Tolerance for constraint
    stop = true;
end
end

另请参阅

| | (Global Optimization Toolbox) | (Global Optimization Toolbox)

相关主题