主要内容

使用基于问题的 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_feasibility_setup.png

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

feasibility_sol1.png

初始点的影响

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

feasibility_setup2.png

此时 fmincon 找不到可行解。

feasibility_failed.png

尝试使用其他求解器

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

feasibility_setup3.png

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

feasibility_ga.png

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

尝试 surrogateopt

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

feasibility_surrogateopt.png

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

outfun = @surrout;

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

feasibility_setup5.png

feasibility_surr_short.png

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

结论

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

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

Live Task
Solving problem using surrogateopt.

Figure Optimization Plot Function contains an axes object. The axes object with title Maximum Constraint Violation: -0.0219896, xlabel Iteration, ylabel Constraint violation contains an object of type scatter.

Optimization stopped by a plot function or output function.
solution = struct with fields:
    x: 1.5639
    y: -2.8127

reasonSolverStopped = 
    OutputFcnStop

objectiveValue = 
0

辅助函数

以下代码会创建 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

Copyright 2022–2024 The MathWorks, Inc.

另请参阅

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

主题