主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

使用 patternsearchOptimize 实时编辑器任务进行约束最小化

此示例展示了如何使用优化实时编辑器任务(提供可视化方法)和命令行来解决约束最小化问题。

问题描述

该问题涉及在使用 patternsearch 最小化非线性函数时使用线性和非线性约束。目标函数为

F(x)=12xTHx+fTx,

其中

H = [36 17 19 12  8 15; 
     17 33 18 11  7 14; 
     19 18 43 13  8 16;
     12 11 13 18  6 11; 
      8  7  8  6  9  8; 
     15 14 16 11  8 29];

f = [ 20 15 21 18 29 24 ]';
 
F = @(x)0.5*x'*H*x + f'*x;

线性约束是

Axb,Aeqx=beq,

其中

A = [-8 7 3 -4 9 0];
b = 7;
Aeq = [7 1 8 3 3 3;
      5 0 -5 1 -5 8;
     -2 -6 7 1 1 9;
      1 -1 2 -2 3 -3];
beq = [84 62 65 1]';

在继续之前,输入前面的代码部分以将问题变量放入您的工作区。

优化实时编辑器任务中使用 patternsearch 进行求解

  1. 点击主页选项卡上文件部分中的新建实时脚本按钮,创建一个新的实时脚本。

    New Live Script button

  2. 插入一个优化实时编辑器任务。点击插入选项卡,然后在代码部分中选择任务 > 优化

    Insert Optimize Live Editor task.

    Choose between problem-based and solver-based task.

  3. 对于此示例,请选择基于求解器的任务。

    Optimize Live Editor task solver-based initial screen

  4. 指定问题类型

    在任务的指定问题类型部分,点击目标 > 非线性按钮。

  5. 点击约束> 线性不等式线性等式按钮。

  6. 选择求解器 > patternsearch - 模式搜索

  7. 选择问题数据

    在任务的选择问题数据部分输入问题变量。要指定目标函数,请选择目标函数> 函数句柄并选择 F

  8. 将不等式约束设置为 Ab。将等式约束设置为 Aeqbeq

  9. 要设置初始点,首先需要在任务上方创建一个新的部分。为此,点击插入选项卡上的分节符按钮。在任务上方的新节中,输入以下初始点代码。

    x0 = [2 1 0 9 1 0]';
  10. 运行该部分将 x0 放入工作区。要运行该部分,请将光标放在该部分并按 Ctrl+Enter 或点击行号左侧的蓝色条纹。

  11. 在任务的选择问题数据部分,将 x0 设置为初始点。

  12. 指定求解器选项

    由于该问题是线性约束的,因此请指定一个附加求解器选项。展开任务的指定求解器选项部分,然后点击添加按钮。将轮询设置 >轮询方法设置为 GSSPositiveBasis2N。有关 GSS 轮询方法针对线性约束问题的效率的更多信息,请参阅 使用 patternsearch 搜索全局最小值

  13. 设置显示选项

    在任务的显示进度部分,选择最佳值网格大小绘图函数。

    您的设置如下所示:

    patternsearch solver, function handle F, initial point x0, linear constraints A, b, Aeq, beq, poll algorithm GSSPositiveBasis2N, plots Best value and Mesh size

  14. 运行求解器并检查结果

    要运行求解器,请点击任务窗口右上角的选项按钮 ,并选择运行节

    Run the solver; the keyboard equivalent is Ctrl+Enter.

    图表出现在单独的图形窗口和任务输出区域中。

    Plots show the objective function value decreasing with iterations to 1919 and the mesh size eventually decreasing below 1e-6.

  15. 要获取解点和解处的目标函数值,请查看任务的顶部。

    Optimize returns "solution" and "objectiveValue" variables

    Optimize 实时编辑器任务在名为 solution 的变量中返回解,并在名为 objectiveValue 的变量中返回目标函数值。通过在任务下方的部分中输入以下代码然后运行该部分,或者在 MATLAB® 命令行中输入代码来查看这些值。

    disp(solution)
        8.5165
       -6.1094
        4.0989
        1.2877
       -4.2348
        2.1812
    disp(objectiveValue)
       1.9195e+03
  16. 包括非线性约束

    向问题添加以下非线性约束。

    1.5+x1x2+x1x20x1x2100.

    要包含这些约束,首先点击约束 > 非线性按钮。

    Include a nonlinear constraint.

  17. 选择问题数据部分的约束下,选择非线性 > 局部函数,然后点击新建按钮。该函数出现在任务下方的新节中。编辑生成的代码以包含以下行。

    function [c, ceq] = double_ineq(x)
    c = [-1.5 + x(1)*x(2) + x(1) - x(2);
        -x(1)*x(2) - 10];
    ceq = [];
    end
  18. 非线性约束部分,选择 double_ineq

  19. 非线性约束算法导致 patternsearch 需要进行多次函数计算。在指定求解器选项部分中,点击当前选项右侧的加号以显示其他选项。然后将最大函数评估限制增加到 5e4。

    Max function evals = 5e4

  20. 再次运行任务以重新运行优化。

    The top plot shows four iterations with a best function value of 2401.77. The bottom plot shows the mesh size decreasing to 1e-9.

  21. 查看解和目标函数值。

    disp(solution)
        7.2083
       -1.3873
        4.9579
       -3.1393
       -3.1843
        4.7457
    disp(objectiveValue)
       2.4018e+03

目标函数值高于没有非线性约束的问题中的值。先前的解对于非线性约束来说是可行的。

图表显示的迭代次数比以前少很多,因为非线性约束算法改变了 patternsearch 算法,包含另一个外循环来解决修改后的问题。外循环减少了每次主要迭代时对问题的修改。在这种情况下,该算法仅进行四次外迭代。有关算法的详细信息,请参阅用于模式搜索的非线性约束求解算法

在命令行中使用 patternsearch 求解

要在命令行解决原始问题(仅线性约束),请执行以下代码。

x0 = [2 1 0 9 1 0]';
options = optimoptions('patternsearch',...
    'PollMethod','GSSPositiveBasis2N',...
    'PlotFcn',{'psplotbestf','psplotmeshsize'});
lb = [];
ub = [];
nonlcon = [];
[x,fval] = patternsearch(F,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
Optimization terminated: mesh size less than options.MeshTolerance.

x =

    8.5165
   -6.1094
    4.0989
    1.2877
   -4.2348
    2.1812


fval =

   1.9195e+03

patternsearch 生成优化实时编辑器任务示例中显示的第一对图。

要包含非线性约束,请将以下代码保存到 MATLAB 路径上名为 double_ineq.m 的文件中。

function [c, ceq] = double_ineq(x)
c = [-1.5 + x(1)*x(2) + x(1) - x(2);
    -x(1)*x(2) - 10];
ceq = [];
end

为了使求解器能够在非线性约束下完成运行,请增加允许的函数计算次数。

options.MaxFunctionEvaluations = 5e4;

解决包括非线性约束的问题。

nonlcon = @double_ineq;
[x,fval] = patternsearch(F,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
Optimization terminated: mesh size less than options.MeshTolerance
 and constraint violation is less than options.ConstraintTolerance.

x =

    7.2083
   -1.3873
    4.9579
   -3.1393
   -3.1843
    4.7457


fval =

   2.4018e+03

patternsearch 还生成了优化实时编辑器任务示例中所示的第二对图。

优化实时编辑器任务和命令行均允许您制定和解决问题,并且它们会给出相同的结果。命令行更加精简,但对于选择求解器、设置问题以及选择绘图函数等选项提供的帮助较少。您还可以使用优化启动问题,然后生成用于命令行的代码,如 使用优化实时编辑器任务或求解器的有约束非线性问题 所示。

另请参阅

主题