完善开始点
关于细化起点
如果你的问题的某些部分是不受约束的,GlobalSearch
而且MultiStart
使用人工边界在每个组件中统一生成随机起点。然而,如果您的问题有广泛的极小值,您需要广泛分散的起点来寻找这些极小值。
使用这些方法可以获得分散广泛的起始点:
在你的
问题
结构。使用一个
RandomStartPointSet
对象的MultiStart
算法。设置较大的值ArtificialBound
财产的RandomStartPointSet
对象。使用一个
CustomStartPointSet
对象的MultiStart
算法。使用广泛分散的起点。
每种方法各有优缺点。
方法 | 优势 | 缺点 |
---|---|---|
给界限问题 |
自动点生成 | 使一个更复杂的黑森 |
可以使用GlobalSearch |
不清楚该把界限设多大 | |
容易做到 | 变化问题 |
|
边界可以是非对称的 | 只有均匀分 | |
大ArtificialBound 在RandomStartPointSet |
自动点生成 | MultiStart 只有 |
不会改变问题 |
只有对称,均匀的点 | |
容易做到 | 不清楚要设置多大ArtificialBound |
|
CustomStartPointSet |
可定制的 | MultiStart 只有 |
不会改变问题 |
需要编程生成点 |
生成起始点的方法
均匀的网格
要生成一个统一的起点网格:
生成多维数组
ndgrid
.给出每个组件的下界、间距和上界。例如,生成一组三维阵列用
第一个分量从-2到0,间距为0.5
第二个分量从0到2,间距为0.25
第三个分量从-10到5,间距为1
[X, Y, Z] = ndgrid (2: .5:0, 0: .25:2 10:5);
将数组放入一个矩阵中,每一行表示一个起点。例如:
W = [X (:), Y(,)、Z (:));
在这个例子中,
W
是720 × 3矩阵。把矩阵代入a
CustomStartPointSet
对象。例如:custpts = CustomStartPointSet (W);
调用运行
与CustomStartPointSet
对象作为第三个输入。例如,
%假设问题结构和ms MultiStart对象存在[x,fval,flag,outpt,manymins] = run(ms,problem,custpts);
摄动网格
整数起始点产生的解的鲁棒性比稍有扰动的起始点要差。
获取起始点的摄动集:
调用运行
与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对称和随机的。对于一个下界为磅
,取
类似地,对于一个上界为乌兰巴托
,取
例如,假设你有一个三维的问题
x
(1) > 0x
(2) < 100x
(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。要使用边界的不同值,生成一个RandomStartPointSet
与ArtificialBound
属性设置为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)
.
和最小值相比使用更多的起点,该运行发现了更好(更小)的最小值,并且有更高的成功运行百分比。