漫步最优化二十五——斐波那契搜索

来源:互联网 发布:php无限极分类 编辑:程序博客网 时间:2024/05/18 01:50






便




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+1InIn1In2In3In4IkI1=InIn+2=InF0In=In+1+In+2=InF1In=In+In+1=2InF2In=In1+In=3InF3In=In2+In1=5InF4In=In3+In2=8InF5In=Ik+1+Ik+2=Fnk+1In=I2+I3=FnIn

所生成的序列

{1,1,2,3,5,8,13,}={F0,F1,F2,F3,F4,F5,F6,}

就是著名的斐波那契数列,它可以由递归关系

Fk=Fk1+Fk2for k2

得出,其中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=Fnk1FnkIk+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+1Ik+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=n2,此时
Ik+2=In


x=xa,k+1=xb,k+1

如图5所示。显然,可以确定最小值在容忍误差±1/Fn范围内。

如果n足够大,那噩梦xa,k,xb,k的差将会非常小,由于舍入误差,xa,k可能超过xb,k,如果这种情况发生的话,我们将会得到不可靠的结果。对于这样的应用,为了消除这个问题,我们需要加入一下检查措施,一种方法是终止算法,这是因为如果xa,kxb,k,那么我们已经达到了足够高的精度。


这里写图片描述
图5