最优化理论(一)Fibonacci法(python实现)

最优化理论之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(b1a1)/L

最优化理论(一)Fibonacci法(python实现)_第1张图片

例题如下:
最优化理论(一)Fibonacci法(python实现)_第2张图片

# @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语法和公式了哈哈。
附上了书上的算法步骤和例题供参考!
如需要电子版《最优化理论》用于学习交流可以点个大大的关注并私聊博主。

你可能感兴趣的:(Python,最优化理论,python,算法,开发语言)