主要内容

完善开始点

关于细化起点

如果你的问题的某些部分是不受约束的,GlobalSearch而且MultiStart使用人工边界在每个组件中统一生成随机起点。然而,如果您的问题有广泛的极小值,您需要广泛分散的起点来寻找这些极小值。

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

  • 在你的问题结构。

  • 使用一个RandomStartPointSet对象的MultiStart算法。设置较大的值ArtificialBound财产的RandomStartPointSet对象。

  • 使用一个CustomStartPointSet对象的MultiStart算法。使用广泛分散的起点。

每种方法各有优缺点。

方法 优势 缺点
给界限问题 自动点生成 使一个更复杂的黑森
可以使用GlobalSearch 不清楚该把界限设多大
容易做到 变化问题
边界可以是非对称的 只有均匀分
ArtificialBoundRandomStartPointSet 自动点生成 MultiStart只有
不会改变问题 只有对称,均匀的点
容易做到 不清楚要设置多大ArtificialBound
CustomStartPointSet 可定制的 MultiStart只有
不会改变问题 需要编程生成点

生成起始点的方法

均匀的网格

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

  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. 把矩阵代入aCustomStartPointSet对象。例如:

    custpts = CustomStartPointSet (W);

调用运行CustomStartPointSet对象作为第三个输入。例如,

%假设问题结构和ms MultiStart对象存在[x,fval,flag,outpt,manymins] = run(ms,problem,custpts);

摄动网格

整数起始点产生的解的鲁棒性比稍有扰动的起始点要差。

获取起始点的摄动集:

  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(size(W));
  3. 把矩阵代入aCustomStartPointSet对象。例如:

    custpts = CustomStartPointSet (W);

调用运行CustomStartPointSet对象作为第三个输入。例如,

%假设问题结构和ms MultiStart对象存在[x,fval,flag,outpt,manymins] = run(ms,problem,custpts);

无约束分量的广分散点

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

  • 尽管没有显式的边界存在,但是组件不能达到的级别是有的。例如,如果一个成分代表一颗钻石的重量,则隐含的上限为1公斤(希望钻石小于10克)。在这种情况下,给出隐含的上限。

  • 真的没有上限。例如,以字节为单位的计算机文件的大小没有有效的上限。目前最大的数据可以是gb或tb,但10年后,谁知道呢?

对于真正无界的组件,可以使用以下采样方法。得到大约1/n每个区域中的点(exp(n)、经验(n+1)),使用下面的公式。如果u从0到1是随机均匀分布的,那么r= 2u- 1均匀分布在-1和1之间。取

y 胡志明市 r 经验值 1 / | r | e

y对称和随机的。对于一个下界为,取

y + 经验值 1 / u e

类似地,对于一个上界为乌兰巴托,取

y 乌兰巴托 经验值 1 / u 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);R2 = -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中无法找到全局最小值查找全局或多个局部极小值.有两种简单的方法可以找到更好的解决方案:

  • 使用更多的起点

  • 对搜索空间给予更严格的限制

建立问题结构和MultiStart对象:

问题= createOptimProblem(“fminunc”,…“客观”,@ (x) sawtoothxy (x(1),(2)),…x0,(100、-50),“选项”,…optimoptions (@fminunc、“算法”、“拟牛顿”));女士= MultiStart;

使用更多的起点

运行MultiStart关于200个起始点而不是50个的问题:

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

这一次MultiStart找到了全局最小值,找到了51个局部最小值。

要查看本地解决方案的范围,请输入直方图([manymins.Fval], 10)

起点限制收紧

假设您相信有趣的局部解的所有分量的绝对值都小于100。缺省情况下,起始点的边界值为1000。要使用边界的不同值,生成一个RandomStartPointSetArtificialBound属性设置为One hundred.

startpts = RandomStartPointSet(“ArtificialBound”,100年,…“NumStartPoints”,50);[x,fval,exitflag,output,manymins] = run(ms,problem, starts) MultiStart从起始点开始完成一些运行。50次本地求解器运行中有29次收敛于正向本地求解器退出标志。x = 1.0e-08 * 0.9725 -0.6198 fval = 1.4955e-15 exitflag = 2 output = struct with fields: funcCount: 7431 localSolverTotal: 50 localSolverSuccess: 29 localSolverIncomplete: 21 localSolverNoSolution: 0 message: 'MultiStart从起始点完成了一些运行。在50个本地解算器运行中,有29个收敛为正向本地解算器退出标志。属性:X Fval Exitflag输出X0

MultiStart找到了全局最小值,找到了22个不同的局部解。要查看本地解决方案的范围,请输入直方图([manymins.Fval], 10)

和最小值相比使用更多的起点,该运行发现了更好(更小)的最小值,并且有更高的成功运行百分比。

相关的话题

Baidu
map