Fibonacci方法
1.Fibonacci数列
F0 = F1 = 1;
Fk = Fk-1 + Fk-2,k=2,3,4…
2.Fibonacci迭代原理
通过容许误差选取Fn+1:Fn+1> (b-a)/ε
初始点:在区间[a,b]选取,λ1 = a+Fn-1*(b-a)/Fn+1;λ2 = a+Fn*(b-a)/Fn+1;
开始迭代:比较 f(λ1) 和 f(λ2) 的大小,若 f(λ1) > f(λ2),λ* = [λ1,b],保留点λ2,计算新的区间长度,与ε比较,判断是否应该中止迭代;若 f(λ1) ≤ f(λ2),λ* = [a,λ2],保留点λ1,计算新的区间长度,与ε比较,判断是否应该中止迭代。
3.C++代码
//数学规划
//一维搜索
#include <iostream>
#include <math.h>
#define f(x) (x*x-6*x+2)
using namespace std;
//生成Fibonacci数列
float fibonacci_num(int n)
{
if(n<=2) return 1;
else return (fibonacci_num(n-1)+fibonacci_num(n-2));
}
//Fibonacci搜索,其中a,b为区间上下限
float fibonacci_search(float a, float b, float delta)
{
int n = 1;
float Fn = fibonacci_num(n);
float Fn1 = fibonacci_num(n+1);
while((b-a)/delta>Fn1)
{
n++;
Fn = fibonacci_num(n);
Fn1 = fibonacci_num(n+1);
}
float lambda2 = a + Fn*(b-a)/Fn1;
float lambda1 = a + b - lambda2;
float best = f(lambda1)<f(lambda2)?lambda1:lambda2;
while((b-a)>delta)
{
if(f(lambda1)>f(lambda2))
{
best = lambda2;
a = lambda1;
lambda1 = lambda2;
lambda2 = a + b - lambda2;
}
else if(f(lambda1)<f(lambda2))
{
best = lambda1;
b = lambda2;
lambda2 = lambda1;
lambda1 = a + b - lambda2;
}
cout<<lambda1<<"::"<<f(lambda1)<<endl;
cout<<lambda2<<"::"<<f(lambda2)<<endl;
cout<<"---------------"<<endl;
}
return best;
}
int main()
{
float best = fibonacci_search(0,10,0.3);
cout<<"最优解:"<<best<<endl;
cout<<"最优值"<<f(best)<<endl;
return 0;
}