如果你的问题的某些部分是不受约束的,GlobalSearch
和MultiStart
使用人工边界均匀地在每个组件中生成随机的起始点。然而,如果您的问题有遥远的极小值,您需要广泛分散的起始点来找到这些极小值。
使用以下方法获得广泛分布的起点:
在你的问题
结构。
使用随机起始点集
反对MultiStart
算法。设置一个较大的ArtificialBound
房地产随机起始点集
对象。
使用CustomStartPointSet
反对MultiStart
算法。使用广泛分散的起点。
每种方法都有优点和缺点。
方法 | 优势 | 缺点 |
---|---|---|
限定问题 |
自动点生成 | 制造出更复杂的黑森 |
可以与一起使用GlobalSearch |
不知道该设定多大的界限 | |
容易做 | 变化问题 |
|
边界可以是非对称的 | 只有一致点 | |
大的ArtificialBound 在里面随机起始点集 |
自动点生成 | 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的矩阵。
把矩阵代入aCustomStartPointSet
对象。例如:
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 kg的隐式上限(希望钻石低于10 g)。在这种情况下,将隐式上限作为上限。
确实没有上界。例如,以字节为单位的计算机文件大小没有有效的上限。现在最大的尺寸可以是十亿字节或兆兆字节,但10年后,谁知道呢?
对于真正的无界组件,可以使用以下采样方法。生成大约1/n每个区域的积分(经验值(n),exp(n+1)),使用下面的公式。如果u从0到1是随机均匀分布的吗r= 2u– 1在-1和1之间均匀分布。取
y是对称的和随机的。对于下界为的变量磅
,取
类似地,对于上界为的变量乌兰巴托
,取
例如,假设你有一个三维问题
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)
.
与中的极小值相比较使用更多的起点,这次运行找到了更好(更小)的最小值,并且有更高的成功运行百分比。