最优化理论之Fibonacci法(python实现)
纯纯干货
刚过完五一假期,又要回归到课程多还要兼顾每天考研复习的生活的日常了,这不,最优化理论课程又需要编写一些代码,鉴于网上基于python实现的系列算法很杂很散(基本没有)
正好还有这门课程,所以我会陆续分享一些此类算法的代码编写。
首先fibonacci法计算步骤如下:
1、给定初始区间*[a1,b1]和最终区间长度L*,求计算函数值的次数n,使
F
n
≥
(
b
1
−
a
1
)
/
L
F_n \ge (b_1-a_1)/L
Fn≥(b1−a1)/L
例题如下:
# @Time : 2023/5/4
# @title: 最优化理论斐波那契法
# 写传入的函数
def hanshu(x):
return 2*x**2-x-1
def fibonacci(n):
if n==0 or n==1:
result = 1
elif n>1:
result=fibonacci(n-1) + fibonacci(n-2)
else:
result=0
return result
# 求解n的值
def get_n(a,b,L):
minimum = (b-a)/L
n=0
f = fibonacci(n)
while f<minimum:
n+=1
f = fibonacci(n)
print("n=",n)
return n
'''
实现fibonacci法,
f:需要优化的函数
a:优化区间上界
b:优化区间下界
L:最终区间长度最大值
'''
def fibonacci_search(f,a,b,L):
n = get_n(a,b,L)
k=0
mu = a+(fibonacci(n-k)/fibonacci(n-k+1)*(b-a))
lamuda = a + (1-fibonacci(n-k)/fibonacci(n-k+1)) *(b-a)
result = 0
while k<=n:
if fibonacci(lamuda)<fibonacci(mu):
if b-lamuda <= L:
result =mu
break
else:
a = lamuda
lamuda = mu
mu = a+(fibonacci(n-k)/fibonacci(n-k+1)) *(b-a)
else:
if mu-a < L:
result = lamuda
break
else:
b=mu
mu = lamuda
lamuda = a+(1-fibonacci(n-k)/fibonacci(n-k+1)) * (b-a)
print(a,b)
k+=1
return result
if __name__ == "__main__":
x = fibonacci_search(fibonacci,-1,1,0.16)
print(x)
原谅时间有限,后面就懒得打Latex语法和公式了哈哈。
附上了书上的算法步骤和例题供参考!
如需要电子版《最优化理论》用于学习交流可以点个大大的关注并私聊博主。