主要内容

使用约束最小化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;

线性约束是

一个 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. 插入一个优化实时编辑器任务。单击插入TAB,然后在代码部分中,选择任务>优化

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

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

  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轮询方法的效率的更多信息,请参见比较投票选项的效率

  12. 设置显示选项

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

    你的设置是这样的:

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

  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(1)*x(2) - 10];Ceq = [];结束
  17. 非线性约束部分,选择double_ineq

  18. 非线性约束算法导致patternsearch做很多函数的求值。在指定求解器选项部分中,单击当前选项右侧的加号以显示其他选项。然后将最大函数求值极限增加到5e4。

    最大函数值= 5e4

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

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

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

    disp(解决方案)
    7.2083 -1.3873 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”});Lb = [];Ub = [];Nonlcon = [];[x,fval] = patternsearch(F,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
优化终止:网格尺寸小于options.MeshTolerance。X = 8.5165 -6.1094 4.0989 1.2877 -4.2348 2.1812 fval = 1.9195e+03

patternsearch控件中显示的第一对图优化Live Editor任务示例。

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

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

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

选项。maxfunctionassessments = 5e4;

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

Nonlcon = @double_ineq;[x,fval] = patternsearch(F,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
优化终止:网格尺寸小于选项。MeshTolerance和约束违反小于options. constraintolerance。X = 7.2083 -1.3873 4.9579 -3.1393 -3.1843 4.7457 fval = 2.4018e+03

patternsearch方法中所示的第二对图优化Live Editor任务示例。

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

另请参阅

相关的话题