主要内容

完善开始点

关于提炼起点

如果你的问题的某些部分是不受约束的,GlobalSearchMultiStart使用人工边界均匀地在每个组件中生成随机的起始点。然而,如果您的问题有遥远的极小值,您需要广泛分散的起始点来找到这些极小值。

使用以下方法获得广泛分布的起点:

  • 在你的问题结构。

  • 使用随机起始点集反对MultiStart算法。设置一个较大的ArtificialBound房地产随机起始点集对象。

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

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

方法 优势 缺点
限定问题 自动点生成 制造出更复杂的黑森
可以与一起使用GlobalSearch 不知道该设定多大的界限
容易做 变化问题
边界可以是非对称的 只有一致点
大的ArtificialBound在里面随机起始点集 自动点生成 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 kg的隐式上限(希望钻石低于10 g)。在这种情况下,将隐式上限作为上限。

  • 确实没有上界。例如,以字节为单位的计算机文件大小没有有效的上限。现在最大的尺寸可以是十亿字节或兆兆字节,但10年后,谁知道呢?

对于真正的无界组件,可以使用以下采样方法。生成大约1/n每个区域的积分(经验值(n),exp(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=rand(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=符号(r3)。*(exp(abs(r3))-exp(1));客户=客户起点集([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')%用于再现性[x,fval,eflag,输出,manymins]=运行(ms,问题,200)MultiStart从起点完成了一些运行。200次局部解算器运行中有53次收敛到正局部解算器退出标志。x=1.0e-06*-0.2284-0.5567 fval=2.1382e-12 eflag=2 output=struct,带字段:funcount:32670 localSolverTotal:200 localSolverSuccess:53 localSolverIncomplete:147 localSolverNoSolution:0消息:“MultiStart已从起点完成部分运行。↵↵200次局部解算器运行中有53次收敛于正的局部解算器退出标志。'manymins=1x53全局解算器特性:X Fval Exitflag输出X0

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

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

更紧的起点绑定

假设您相信有趣的局部解的所有分量的绝对值都小于100。起点边界的默认值为1000。要使用绑定的金宝搏官方网站不同值,请生成随机起始点集ArtificialBound属性设置为100

startpts = RandomStartPointSet(“ArtificialBound”,100年,…“NumStartPoints”,50);MultiStart从起始点完成一些运行。在50个本地求解器中,有29个以正的本地求解器退出标志汇合。x = 1.0e-08 * 0.9725 -0.6198 fval = 1.4955e-15 eflag = 2 output = struct with fields: funcCount: 7431 localSolverTotal: 50 localSolverSuccess: 29 localSolverIncomplete: 21 localSolverNoSolution: 0 message: 'MultiStart completed some of the runs from the start points。↵↵50个本地求解器中有29个在本地求解器退出标志为正的情况下运行。' manymins = 1x25 GlobalOptimSolution属性:X Fval Exitflag输出X0

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

与中的极小值相比较使用更多的起点,这次运行找到了更好(更小)的最小值,并且有更高的成功运行百分比。

相关话题