主要内容

精炼起点

关于精炼起点

如果您的问题的某些组成部分是不受约束的,Globalsearch.多层的在每个组件中使用人工界定以均匀地生成随机起始点。但是,如果您的问题具有远挥动的最小值,则需要广泛分散的开始点以查找这些最小值。

使用这些方法获得广泛分散的起点:

  • 在您的情况下给予广泛分开的界限问题结构体。

  • 使用一个RandomStartPointSet对象的多层的算法。设置一个较大的值alitebound.财产的RandomStartPointSet目的。

  • 使用一个customstartpointset.对象的多层的算法。使用广泛分散的起点。

每种方法都有优点和缺点。

方法 优势 缺点
给界限问题 自动点生成 做一个更复杂的粗歌
可以使用Globalsearch. 不清楚如何设置界限
容易做到 变化问题
边界可以是不对称的 只有均匀分
alitebound.RandomStartPointSet 自动点生成 多层的只有
没有改变问题 只有对称,均匀的点
容易做到 目前还不清楚该设置多大的规模alitebound.
customstartpointset. 可定制 多层的只有
没有改变问题 需要编程来生成点

生成起点的方法

均匀网格

要生成起始点的统一网格:

  1. 生成多维阵列ndgrid.。给出每个组件的下界、间距和上界。

    例如,要生成一组三维数组

    • 第一个组件从-2到0,间隔0.5

    • 第二个组件从0到2,间隔0.25

    • 来自-10到5的第三个组件,间距1

    [x,y,z] = ndgrid(-2:.5:0,0:.25:2,-10:5);
  2. 将数组放入单个矩阵中,每一行表示一个起点。例如:

    w = [x(:),y(:),z(:)];

    在这个例子中,W.是一个720×3矩阵。

  3. 将矩阵放入一个customstartpointset.目的。例如:

    顾客= customstartpointset(w);

呼叫customstartpointset.对象作为第三个输入。例如,

%假设问题结构和MS MultiStart对象存在[x,fval,标志,突出,manymins] =运行(ms,问题,顾问);

扰动网格

整数开始点可以产生比略微扰动的起点的稳健解决方案更少于鲁棒的解决方案。万博 尤文图斯

获取扰动的开始点集:

  1. 的步骤1-2生成起点矩阵均匀网格

  2. 通过添加0个平均值和相对较小的方差的随机普通矩阵来扰乱起点。

    对于这个例子均匀网格,经过制造W.矩阵,添加一个扰动:

    [x,y,z] = ndgrid(-2:.5:0,0:.25:2,-10:5);w = [x(:),y(:),z(:)];w = w + 0.01 * randn(尺寸(w));
  3. 将矩阵放入一个customstartpointset.目的。例如:

    顾客= customstartpointset(w);

呼叫customstartpointset.对象作为第三个输入。例如,

%假设问题结构和MS MultiStart对象存在[x,fval,标志,突出,manymins] =运行(ms,问题,顾问);

广泛分散的点无约束的组件

问题的某些部分可能缺乏上界或下界。例如:

  • 虽然不存在显式的界限,但也有组件无法达到的级别。例如,如果一个分量代表一颗钻石的重量,有一个隐含的上限为1kg(希望钻石小于10g),在这种情况下,将隐含的上限作为一个上限。

  • 真的没有上限。例如,以字节为单位的计算机文件的大小没有有效的上限。最大的尺寸可以在今天的千兆字节或Tberabytes中,但在10年内,谁知道?

对于真正的无界组件,可以使用以下的抽样方法。得到大约1/N每个地区的点(exp(N)、经验(N+1)),使用以下公式。如果随机且均匀地分布在0到1,然后R.= 2- 1均匀分布在-1和1之间。取

y = SGN. R. exp. 1 / | R. | - E.

y是对称和随机的。对于下面的变量,拿走

y = + exp. 1 / - E.

类似地,对于上面有界限的变量UB.,拿走

y = UB. - exp. 1 / - E.

例如,假设您有一个三维问题

  • X(1) > 0

  • X(2)<100

  • X(3)无约束

让150个起始点满足这些限制条件:

u =兰德(150 3);r1 = 1. / u (: 1);r1 = exp(r1) - exp(1);r2 = 1. / u (:, 2);-exp(r2) + exp(1) + 100;r3 = 1. / (2 * u (:, 3) 1);r3 = sign(r3).*(exp(abs(r3)) - exp(1))custpts = CustomStartPointSet ((r1, r2, r3));

下面是该算法的一个变体。用下界法生成一个在0和无穷之间的数。用这个数字作为一个点的半径。通过对每个分量取随机数并乘以半径来生成点的其他分量。你可以把随机数标准化,然后再乘以半径,所以它们的范数是1。有关此方法的工作示例,请参见多起点无边界,起点广泛分散

示例:搜索更好的解决方案

多层的未能找到全局最小值通过MultiStart实现多个局部极小值。有两种简单的方法可以搜索更好的解决方案:

  • 使用更多的起点

  • 对搜索空间进行更严格的限制

设置问题结构和多层的对象:

问题= createOptimprobrom('fminunc',...'目标',@(x)sawtoothxy(x(1),x(2)),...'x0',[100,-50],'选项',... Optimoptions(@ Fminunc,'算法','Quasi-Newton'));ms = multiStart;

使用更多的起点

多层的从50个起点改为200个起点:

rng(14,'twister') % for再现性[x,fval,eflag,output,manymins] = run(ms,problem,200) MultiStart从起点完成了一些运行。在200个本地求解程序中有53个运行收敛于正的本地求解程序退出标志。x = 1.0e-06 * -0.2284 -0.5567 fval = 2.1382e-12 eflag = 2 output = struct with fields: funcCount: 32670 localSolverTotal: 200 localSolverSuccess: 53 localSolverIncomplete: 147 localSolverNoSolution: 0消息:'MultiStart完成了一些从开始点的运行。↵↵在200个本地求解器中有53个运行收敛于正的本地求解器退出标志。' manymins = 1x53 GlobalOptimSolution属性:X Fval Exitflag输出X0

这次多层的找到了全局最小值,找到了51个局部最小值。

要查看本地解决方案的范围,请输入万博 尤文图斯直方图([Manymins.fval],10)

开始点上的更紧

假设你相信有趣的局部解所有分量的绝对值都小于100。万博 尤文图斯起始点绑定的默认值是1000。要使用边界的不同值,请生成一个RandomStartPointSetalitebound.物业设为One hundred.

startpls = randalstartpointset('alightbound',100,...'numstartpoints',50);[x,fval,eflag,输出,manymins] =运行(ms,问题,startpls)multiStart完成了从起点中的一些运行。在50个本地解算器中,29个包含正本地求解器出口标志的运行。x = 1.0e-08 * 0.9725-0.6198 FVAL = 1.4955E-15 EFLAG = 2输出=带有字段的结构:FUNCCOUNT:7431 LOCALALVERTOTAL:50 LOCANSOLVERSUCCERTES:29 LOCALALVERNCOMPLETE:21 LOCANSOLVERNOSOURNATE:0消息:'MultiStart完成了一些运行从50个本地求解器运行中的起点,其中包含一个正本地求解器退出标志。manymins = 1x25 globaloptimsolution属性:x fval exitflag输出x0

多层的找到全局最小值,并找到22个不同的局部解。万博 尤文图斯要查看本地解决方案的范围,请输入万博 尤文图斯直方图([Manymins.fval],10)

与最小值相比使用更多的起点,这次运行发现更好(更小)最小,并且成功运行的比例更高。

相关的话题