主要内容

约束极小化使用patternsearch优化住编辑任务

这个例子展示了如何使用优化Live Editor任务,它提供了一种可视化的方法,以及命令行。

问题描述

这个问题涉及到使用线性和非线性约束来最小化非线性函数patternsearch.目标函数为

F x 1 2 x T H x + f T x

在哪里

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;

这个目标函数也包含在文件中的软件中lincontest7.m

线性约束为

一个 x b 一个 e x b e

在哪里

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. 单击。创建一个新的活动脚本新的生活的脚本按钮文件上节首页选项卡。

    新增实时脚本按钮

  2. 插入一个优化住编辑任务。单击插入然后,在代码部分中,选择任务>优化

    插入优化实时编辑器任务。

    优化实时编辑器任务初始屏幕

  3. 指定的问题类型

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

  4. 单击>线性不等式线性平等按钮。

  5. 选择Solver > patternsearch -模式搜索

  6. 选择问题数据

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

  7. 设置不等式约束为一个b.设置相等约束为Aeq说真的

  8. 要设置初始点,首先需要在任务上面创建一个新的部分。要这样做,请单击节休息按钮插入选项卡。在任务上面的新部分中,为初始点输入以下代码。

    X0 = [2 1 0 9 1 0]';
  9. 运行该部分的位置x0进入工作区。要运行该节,将光标放在该节中并按下按Ctrl + Enter或者单击行号左侧的蓝色条纹条。

  10. 选择问题数据部分的任务,设定x0作为起始点。

  11. 指定解决方案

    因为这个问题是线性约束的,指定一个额外的解算器选项。扩大指定解决方案部分,然后单击添加按钮。设置问卷调查设置>问卷调查方式GSSPositiveBasis2N.有关线性约束问题的GSS轮询方法的效率的更多信息,请参见比较Poll选项的效率

  12. 设置显示选项

    显示进度部分,选择最好的价值筛孔尺寸图功能。

    你的设置看起来像这样:

    模式搜索求解器,函数句柄F,初始点x0,线性约束A, b, Aeq, beq,轮询算法gspositivebasis2n,绘制最佳值和网格大小

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

    要运行求解器,请单击选项按钮在任务窗口的右上方,然后选择运行部分

    运行解决者;而键盘则是按Ctrl+Enter。

    绘图显示在单独的图形窗口和任务输出区域中。

    从图中可以看出,目标函数值随着迭代次数的增加逐渐减小到1919年,网格尺寸最终减小到1e-6以下。

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

    最优化返回“solution”和“objectiveValue”变量

    优化活动编辑器任务返回名为的变量中的解决方案解决方案并将目标函数值返回到名为objectiveValue.在任务下面的部分中输入以下代码,然后运行该部分,或者在MATLAB中输入代码,查看这些值®命令行。

    disp(解决方案)
    8.5165 -6.1094 4.0989 1.2877 -4.2348 2.1812
    disp (objectiveValue)
    1.9195 e + 03
  15. 包括非线性约束

    将下列非线性约束添加到问题中。

    1.5 + x 1 x 2 + x 1 x 2 0 x 1 x 2 10 0.

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

    包括非线性约束。

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

    函数测查[c] = double_ineq c (x) = (-1.5 + x (1) * (2) + x (1) - (2);x - x (1) * (2) - 10);测查= [];结束
  17. 非线性限制部分,选择double_ineq

  18. 非线性约束算法导致patternsearch进行许多函数计算。在指定解决方案节中,单击当前选项右侧的加号以显示其他选项。然后将最大函数求值极限增加到5e4。

    最大函数值= 5e4

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

    上图显示了四次迭代,最佳函数值为2401.77。底部的图显示网格尺寸减小到1e-9。

  20. 查看解决方案和目标函数值。

    disp(解决方案)
    4.9579 -3.1393 -3.1843 4.7457
    disp (objectiveValue)
    2.4018 e + 03

目标函数值高于无非线性约束时的目标函数值。前面的解对于非线性约束是不可行的。

由于非线性约束算法的改变,图的迭代次数比以前少了很多patternsearch算法,包括另一个外部循环,以解决修改的问题。外部循环减少了在每次主要迭代时对问题的修改。在这种情况下,算法只进行四次外部迭代。具体算法请参见非线性约束求解算法

解决使用patternsearch在命令行

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

X0 = [2 1 0 9 1 0]';选择= optimoptions (“patternsearch”...“PollMethod”“GSSPositiveBasis2N”...“PlotFcn”, {“psplotbestf”“psplotmeshsize”});磅= [];乌兰巴托= [];nonlcon = [];[x, fval] = patternsearch (F, x0, A、b Aeq,说真的,磅,乌兰巴托,nonlcon,选项)
优化终止:网格尺寸小于选项。网格公差。X = 8.5165 -6.1094 4.0989 1.2877 -4.2348 2.1812 fval = 1.9195e+03

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

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

函数测查[c] = double_ineq c (x) = (-1.5 + x (1) * (2) + x (1) - (2);x - x (1) * (2) - 10);测查= [];结束

为了允许求解器在非线性约束条件下运行完成,请增加允许的函数求值次数。

选项。MaxFunctionEvaluations = 5 e4;

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

nonlcon = @double_ineq;[x, fval] = patternsearch (F, x0, A、b Aeq,说真的,磅,乌兰巴托,nonlcon,选项)
优化终止:网格尺寸小于选项。MeshTolerance和constraint violation小于options. constraintolerance。X = 7.2083 -1.3873 4.9579 -3.1393 -3.1843 4.7457 fval = 2.4018e+03

patternsearch也生成第二对图,如图所示优化实时编辑器任务示例。

这两个优化Live Editor任务和命令行允许您制定和解决问题,它们给出相同的结果。命令行更加精简,但在选择求解器、设置问题和选择绘图函数等选项方面提供的帮助较少。你也可以开始使用一个问题优化,然后生成命令行使用的代码,如求解一个约束非线性问题,基于求解器

另请参阅

相关的话题