最优化第二讲——一维搜索法(斐波那契法和java实现)

news/2024/7/6 3:14:45

先看一下斐波那契数列

这个很容易理解,就是当前的值等于前两个值的和

斐波那契法的递归结构如下


步骤一:我们首先要知道需要精确到的区间长度,例如要在[1, 10]之间搜索极小值点,希望精确到0.5之间,那么也就是我最后要求得的Ln的长度要小于等于0.5。所以这个时候就能知道经过几轮计算可以达到这个精度,斐波那契数列指的是:Fn=F(n-1)+F(n-2)。上图可知Ln与Fn是有关系的,所以可以求得满足Ln小于等于0.5的Fn,也就知道了可以迭代几轮。

步骤二:求出L2,L2=L1*F(n-1)/F(n),这个式子可以由上图得到,就是要确定最开始的t1、t2点,然后比较t1、t2点对应的函数值得大小,缩小区间,缩小区间的方法跟通用方法一致,如果t1的函数值f1大于t2的函数值f2,那么区间缩小为[t1, 10],否则区间缩小为[1, t2]

步骤三:如果区间缩小为[t1, 10],这个时候t1=t2,而t2的值等于t1在这个区间内的对称值。其实我们可以看到只有第一步需要计算两个点的函数值,其他步都只要计算一个点的函数值就行,因为另外一个点的函数值由上一步遗留下来

代码实现如下

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. private static void fibonacci(float start, float end, float eps) {  
  2.           
  3.         float Fn_1, Fn;  
  4.         int n;  
  5.         float L1 = end - start;  
  6.         float Ln = eps;  
  7.         n = 2;  
  8.         Fn = F(n);  
  9.         //求要经过几轮区间长度才可以小于eps  
  10.         while(Fn <= L1 / Ln) {  
  11.             n ++;  
  12.             Fn = F(n);  
  13.         }  
  14.         Fn_1 = F(n - 1);  
  15.           
  16.         float t1, t2, f1, f2;  
  17.         float a = Math.min(start, end);  
  18.         float b = Math.max(start, end);  
  19.           
  20.         t1 = b - (b - a) * Fn_1 / Fn;  
  21.         t2 = a + b - t1;  
  22.         f1 = fun(t1);  
  23.         f2 = fun(t2);  
  24.           
  25.         while(b - a >= Ln) {  
  26.             if(f2 < f1) {  
  27.                 a = t1;  
  28.                 t1 = t2;  
  29.                 t2 = a + b - t1;  
  30.                 f1 = f2;  
  31.                 f2 = fun(t2);  
  32.             } else {  
  33.                 b = t2;  
  34.                 t2 = t1;  
  35.                 t1 = a + b - t2;  
  36.                 f2 = f1;  
  37.                 f1 = fun(t1);  
  38.             }  
  39.         }  
  40.           
  41.         System.out.println((b + a) / 2);  
  42.     }  
  43.       
  44.     private static float F(int n) {  
  45.           
  46.         if(n == 0 || n == 1return 1;  
  47.         return F(n - 1) + F(n - 2);  
  48.     }  
  49.       
  50.     private static float fun(float x) {  
  51.         return (float) Math.sin(x);  
  52.     }  


http://www.niftyadmin.cn/n/1798623.html

相关文章

最优化第二讲——一维搜索法(黄金分割法和java实现)

新区间的长度L(n)&#xff0c;旧区间的长度L(n-1)。L(n)/L(n-1) 0.618 所以查找速度&#xff1a;0.618^n。 公式为&#xff1a; 这个比较容易理解&#xff0c;看代码就可以看清楚了&#xff0c;主要是区间的更新问题&#xff0c;每次更新长度都变化为原来的0.618 代码如下 [j…

敏捷个人新体系:定位

转载于:https://blog.51cto.com/zhoujg/1538467

POJ1258 最小生成树prim算法

典型的prim算法 这类题目可以稍作变形&#xff0c;比如POJ2421 #include <iostream>#include <map>#define MAXN 102typedef long elem_t;using namespace std;elem_t prim(int n,elem_t mat[MAXN][MAXN]){elem_t closeEdge[MAXN],sum0,min;int i,j,k;for(i 0; i…

istringstream

编写程序&#xff0c;将来自一个文件中的行保存在一个vector<string>中&#xff0c;然后使用一个istringstream从vector读取数据成员&#xff0c;每次读取一个单词 #include <iostream> #include <sstream> #include<fstream> #include<vector> …

最优化第二讲——一维搜索法(牛顿法)

牛顿法可以用来解决两种问题&#xff0c;其实本质上也是一种问题&#xff0c;就是方程求根&#xff0c;只不过一个是求f(x)0的根&#xff0c;一个是求f(x)的导数0的根 1. 无约束函数f(x) 0的根 有两种方式可以解释一下牛顿法 切线法 这种方式就是不断的求点的切线&#xff0c;…

有人知道智能ai绘画图片是如何生成的吗

今天的文章&#xff0c;我荣幸地向你介绍一项令人激动的技术&#xff1a;ai绘画。这是一种基于人工智能的创新技术&#xff0c;为你带来了无限的艺术创作可能性。它通过深度学习算法和大量的训练数据&#xff0c;模拟了众多有名艺术家的风格和创作技巧。使用ai绘画技术&#xf…

C++11新特性:自动类型推断和类型获取

声明&#xff1a;本文是在Alex Allain的文章http://www.cprogramming.com/c11/c11-auto-decltype-return-value-after-function.html的基础上写成的。 加入了很多个人的理解&#xff0c;不是翻译。 转载请注明出处 http://blog.csdn.net/srzhz/article/details/7934483 自动类型…

hadoop下实现kmeans算法——一个mapreduce的实现方法

写mapreduce程序实现kmeans算法&#xff0c;我们的思路可能是这样的 1. 用一个全局变量存放上一次迭代后的质心 2. map里&#xff0c;计算每个质心与样本之间的距离&#xff0c;得到与样本距离最短的质心&#xff0c;以这个质心作为key&#xff0c;样本作为value&#xff0c;…