白天与黑夜,
希望陪你共同走过。
整夜的美梦,
希望抱你一起回味。
即便我是铁石心肠,
那也抵不过你一声哥哥,
抵不过你钻进我的胸膛。
你就是我口中的一块糖,
只想对你说:
I LOVE YOU
——畅宝宝的傻逼哥哥
考虑不确定区间
Ik=[xL,k,xU,k]
并且假设两点xa,k,xb,k均位于Ik中,如图1所示,对于f(x)在点xa,k,xb,k处的值f(xa,k),f(xb,k),如果f(xa,k)<f(xb,k),那么我们选择左区间
ILk+1=[xL,k,xb,k]
如果f(xa,k)>f(xb,k),那么我们选择右区间
IRk+1=[xa,k,xU,k]
如果
f(xa,k)=f(xb,k)
那么可以选择IRk+1,ILk+1中的任何一个。如果右区间IRk+1被选中,那么它将包含最小值,另外还知道点xb,k处的函数值。如果我们知道点xb,k+1处的值,那么我们就有充分的信息来进一步减小不确定区域,然后不断重复此过程。这种方法每次迭代只需要估计一个函数值,计算量相对于二分搜索要小。
根据图1可知
Ik=ILk+1+IRk+2
为了方便,我们假设区间相等,那么
ILk+1=IRk+1=Ik+1ILk+2=IRk+2=Ik+2
由此可得
Ik=Ik+1+Ik+2
如果上面的过程重复多次,那么我们会得到如下的区间序列{I1,I2,…,In}:
I1I2In=I2+I3=I3+I4⋮=In+1+In+2
图1
上面的
n个等式中,有
n+2个变量,如果
I1是给定的初始区间,那么有
n+1个变量。所以给定的规则不同,就会生成不同的序列,我们这里讨论两个特殊的序列:斐波那契序列与黄金分割序列。本篇博文先介绍前者,下一篇介绍后者。
假设n+2次迭代后区间消失,即In+2=0,那么我们就得到斐波那契序列,如果我们令k=n,可以得到
In+1InIn−1In−2In−3In−4IkI1=In−In+2=In≡F0In=In+1+In+2=In≡F1In=In+In+1=2In≡F2In=In−1+In=3In≡F3In=In−2+In−1=5In≡F4In=In−3+In−2=8In≡F5In⋮=Ik+1+Ik+2=Fn−k+1In⋮=I2+I3=FnIn
所生成的序列
{1,1,2,3,5,8,13,…}={F0,F1,F2,F3,F4,F5,F6,…}
就是著名的斐波那契数列,它可以由递归关系
Fk=Fk−1+Fk2for k≥2
得出,其中F0=F1=1。将其应用到一维优化上就得到斐波那契搜索法,当n=6,I1=100时,该方法得出的结果如图2所示。
如果迭代的总数为n,那么斐波那契搜索将不确定区间缩小到
In=I1Fn
例如如果n=11,那么Fn=144,这样的话In将缩小到不足I1的1\%,其中会有11次迭代。因为每次迭代只需要一个函数估计值,所以一共需要11个函数估计值,如果二分搜索要达到同样的精度需要14个函数估计值,故斐波那契搜索比二分搜索效率更高。事实上,相对于其他几个搜索方法,从计算效率上看它是最高效的。
如果n是已知的,那么我们可以得到唯一的斐波那契区间序列。如果我们的目标是在给定的误差下找到x∗,那么可以求出所需的n。然而,如果我们的目标是最小化f(x),没有等式求出所需的n,唯一知道的信息是在解的邻域内,f(x)越平滑,n值越小,f(x)变化越快,n值越大。
我们可以用上面的原则来实现斐波那契搜索。我们假设最小值的初始边界为xL,1,xU,1,并且n值已经给定,f(x)的数学形式也是已知的,那么要实现的内容就是计算区间,估计f(x)并选择合适的区间。
图2
在
k次迭代后,
xL,k,xa,k,xb,k,xU,k,Ik+1,fa,k=f(xa,k),fb,k=f(xb,k)是已知的,我们需要求
xL,k+1,xa,k+1,xb,k+1,xU,k+1,Ik+2,fa,k+1,fb,k+1,区间
Ik+2通过下式获得
Ik+2=Fn−k−1Fn−kIk+1
然后依次进行。
如果fa,k>fb,k,那么x∗位于区间[xa,k,xU,k]中,所以x∗的新边界更新为
xL,k+1=xa,kxU,k+1=xU,k
同样的,新区间的两个内点xa,k+1,xb,k+1将会是xb,k,xL,k+1+Ik+2,因此我们令
xa,k+1=xb,kxb,k+1=xL,k+1+Ik+2
如图3所示,fb,k的值作为f(x)在点xa,k+1处的值,f(x)在点xb,k+1处计算如下:
fa,k+1=fb,kfb,k+1=f(xb,k+1)
图3
另一方面,如果
fa,k<fb,k,那么
x∗在区间
[xL,k,xb,k]中,这时候
xL,k+1xU,k+1xa,k+1xb,k+1fb,k+1=xL,k=xb,k=xU,k+1−Ik+2=xa,k=fa,k
并且计算
fa,k+1=f(xa,k+1)
如图4所示。对于fa,k=fb,k,上面两种情况均可以,因为x∗同时包含在[xL,k,xb,k],[xa,k,xU,k]。
图4
上面的过程重复执行,直到
k=n−2,此时
Ik+2=In
且
x∗=xa,k+1=xb,k+1
如图5所示。显然,可以确定最小值在容忍误差±1/Fn范围内。
如果n足够大,那噩梦xa,k,xb,k的差将会非常小,由于舍入误差,xa,k可能超过xb,k,如果这种情况发生的话,我们将会得到不可靠的结果。对于这样的应用,为了消除这个问题,我们需要加入一下检查措施,一种方法是终止算法,这是因为如果xa,k≈xb,k,那么我们已经达到了足够高的精度。
图5