-
搜索算法原理
斐波那契搜索是一种有限区间中单峰函数的搜索技术。设此区间为L1,记为斐波那契数:,,当k≥2时,满足。
第一次估值点为:
和
其中,应等于或小于搜索的预期精度。
若f(x1)>f(x2),则删去(x2,1],反之删去[0,x1)。以L1记删去的区间,再对留下的区间L2取:
和
对L2重复上述步骤。如此反复直到:
-
搜索步骤
1.确定Z轴行程length;
2.给定n值,创建斐波那契数列F[0],...,F[n-1],将Z轴行程按平均分为F[n-1]段,顺序从下而上,则搜索精度为step =length/F[n-1]。初始化pos = F[0]*step,最低点low = F[0]*step,用于确定绝对位置;
3.若n≥3,则执行第4步,否则,执行第8步;
4.取估值点index1和index2,分别计算index1和index2处所采图像的梯度Gradient(index1)和Gradient(index2)并比较。若Gradient(index1)> Gradient(index2),则执行第4步,否则执行第5步;
5.舍弃上部F[n-3]*step长度,更新pos = index1;执行第6步;
6.舍弃下部F[n-3]*step长度,更新pos = index2,更新low = index1 + step;
7.n自减1,即下一次只需从F[n -2]段搜索,执行第3步;
8.返回结果pos。
-
代码实现
int Fibonacci_Search(int n)
{
int pos(0);
//create a array
int F[n];
F[0] = 1;
F[1] = 1;
for (int i = 2; i < n; i++)
{
F[i] = F[i-1] + F[i-2];
}
//search
int low(0);
int index1, index2;
double gIndex1, gIndex2;
while(n >= 3)
{
index1 = low + F[n - 3] - 1;
index2 = low + F[n - 2];
n--;
gIndex1 = GetGradientValue(index1);//此处用图像梯度,也可以是其他判断标准
gIndex2 = GetGradientValue(index2);
if( gIndex1 > gIndex2 )
{
pos = index1;
}
else
{
low = index1 + 1;
pos = index2;
}
}
return pos;
}