此示例显示了某些选项进行模式搜索的效果。该选项包括绘图,停止标准和其他算法控制,用于加速解决方案。
最小化的问题是六个变量对线性平等和不等式约束的二次函数。目标函数,LinconteSt7.
,包含在全局优化工具箱中。
类型LinconteSt7.
函数y = lincontest7(x);%Lincontest7目标函数。%y = lincontest7(x)评估输入x的y。确保x是列%向量,而客观函数得到行向量。2003-2004%版权所有2003-2004 MathWorks,Inc。x = x';%在H和F(来自Web未知源)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 ]'; y = 0.5*x'*H*x + f'*x;
指定功能句柄@ lincontest7.
作为目标函数。
ObjectiveFCN = @ Lincontest7;
目标函数接受长度六的行向量。指定优化的初始点。
x0 = [2 1 0 9 1 0];
创建表示约束的线性约束矩阵Aineq * x <= bineq
和aeq * x = beq
。有关详细信息,请参阅线性约束。
Aineq = [-8 7 3 -4 9 0];bineq = [7];AEQ = [7 1 8 3 3 3;5 0 5 1 5 8;2 6 7 1 1 8;1 0 0 0 0 0];beq = [84 62 65 1];
跑过PatternSearch.
求解器,并注意到达解决方案所需的迭代和函数评估的数量。
[X1,FVAL,EXITFLAG,输出] = PATCHERSEARCH(ObjectiveFCN,X0,Aineq,Bineq,AEQ,BEQ);
优化终止:网格尺寸小于options.meshtolerance。
fprintf(“迭代的数量是:%d \ n',输出。
迭代的数量是:132
fprintf('函数评估的数量是:%d \ n',产出.Funccount);
函数评估的数量是:1531
fprintf('找到的最佳功能值是:%g \ n',fval);
找到的最佳功能值为:2189.03
通过指定选择两个绘图函数的选项来监视优化过程。绘图功能psplotbestf.
在每次迭代中绘制最佳的客观函数值,并绘制函数psplotfuncount.
绘制客观函数在每次迭代时评估目标函数的次数。在单元格数组中设置这两个绘图函数。
opts = Optimoptions(@patternsearch,'plotfcn',{@ psplotbestf,@ psplotfuncound});
跑过PatternSearch.
求解器,包括选择
争论。因为问题没有上限或下限约束,而且没有非线性约束,则传递空数组([]
)第七,第八和第九个论点。
[x1,fval,出口,输出] = patternsearch(ObjectFCN,X0,Aineq,Bineq,......AEQ,Beq,[],[],[],选择);
优化终止:网格尺寸小于options.meshtolerance。
模式搜索涉及在网格中的点处评估目标函数。网格的大小可以影响解决方案的速度。您可以使用选项控制网格的大小。
初始网格尺寸
每个迭代的网格是一组搜索方向的跨度,其被添加到当前点,由当前网格尺寸缩放。求解器从初始网格大小开始1
默认。启动初始网格尺寸10.
,设置initialmeshsize.
选项。
选项= Optimoptions(OPTS,'initialmeshsize',10);
网格缩放
您可以扩展网格以提高最小化缩放的优化问题的最小化。缩放在某种程度上旋转模式并沿着搜索方向缩放。这Scalemesh.
选项已开启(真的
)默认情况下,如果问题缩放良好,则可以关闭它。一般情况下,如果问题缩放不佳,将此选项设置为真的
可以减少函数评估的数量。对于这个问题,设置Scalemesh.
至错误的
, 因为LinconteSt7.
是一个良好的目标函数。
选择= Optimoptions(选择,'scalemesh',错误的);
网格加速器
与基于衍生的优化方法相比,直接搜索方法需要许多功能评估。模式搜索算法可以快速找到最佳点的邻域,但在检测到最小本身时可以慢。这PatternSearch.
求解器可以使用加速器减少功能评估的数量。当加速器打开时(opts.acceleratemesh = true
),求解器在达到最小网格尺寸后快速收缩网状尺寸。此选项仅适用于平滑问题;在其他类型的问题中,您可以减掉一些准确性。这加速
选项已关闭(错误的
) 默认。对于这个问题,设置加速
至真的
因为目标函数是平滑的。
选择= Optimoptions(选择,'Acceleratemesh',真的);
跑过PatternSearch.
求解器。
[x2,fval,出口,输出] = patternsearch(ObjectFCN,X0,Aineq,Bineq,......AEQ,Beq,[],[],[],选择);
优化终止:网格尺寸小于options.meshtolerance。
fprintf(“迭代的数量是:%d \ n',输出。
迭代的数量是:86
fprintf('函数评估的数量是:%d \ n',产出.Funccount);
功能评估的数量是:893
fprintf('找到的最佳功能值是:%g \ n',fval);
找到的最佳功能值为:2189.03
网格选项设置减少了迭代次数和函数评估的数量,并且没有明显的准确性损失。
meshtolerance.
是对网格尺寸的宽容。如果网格尺寸小于meshtolerance.
,求解器停止。StepTolerance.
是对当前点变化到下一个点的最小容差。functiontolerance.
是对当前点到下一个点的函数值的变化的最小容差。
设定meshtolerance.
到1E-7,比默认值小十倍。此设置可以增加功能评估和迭代的数量,并导致更准确的解决方案。
opts.meshtolerance = 1e-7;
模式搜索算法可以根据每个迭代使用额外的搜索方法,基于searchfcn.
选项。指定搜索方法时使用searchfcn.
那PatternSearch.
在网格搜索之前首先执行指定的搜索。如果搜索方法成功,PatternSearch.
跳过Mesh搜索,通常称为轮询函数,用于迭代。如果搜索方法在改进当前点时不成功,PatternSearch.
执行网格搜索。
您可以指定不同的搜索方法searchfcn.
, 包括searkga.
和searchneldermead.
,这是优化算法。仅使用这两个搜索方法仅用于第一次迭代,这是默认设置。在每次迭代时使用这些方法中的任何一个可能不会改善结果,并且可以计算得昂贵。但是,你可以使用searchlhs.
在每次迭代或可能每10个迭代时生成拉丁超立方点的方法。
搜索方法的其他选择包括轮询方法,例如正基N + 1或正面为2N。推荐的策略是使用正面基础N + 1(需要大多数n + 1点来创建模式)作为搜索方法和正面基础2n(需要2n点以创建模式)作为轮询方法。
更新要使用的选项结构呈阳性白细胞腺素
作为搜索方法。因为积极的基础2N是默认的pollfcn.
选项,请勿设置该选项。
opts.searchfcn = @ positionbasisnp1;
跑过PatternSearch.
求解器。
[x5,fval,出口,输出] = patternsearch(ObjectiveFCN,X0,Aineq,Bineq,AEQ,BEQ,......[],[],[],选择);
优化终止:网格尺寸小于options.meshtolerance。
fprintf(“迭代的数量是:%d \ n',输出。
迭代的数量是:66
fprintf('函数评估的数量是:%d \ n',产出.Funccount);
函数评估的数量是:838
fprintf('找到的最佳功能值是:%g \ n',fval);
找到的最佳功能值为:2189.03
即使网格公差小于其先前值,迭代和函数评估的总数降低,并且是停止求解器的停止标准。