0.618法

来源:互联网 发布:上古卷轴5捏脸数据ece 编辑:程序博客网 时间:2024/06/07 10:40

一、简介

0.618法又称黄金分割法,是优选法的一种。是在优选时把尝试点放在黄金分割点上来寻找最优选择。0.618法是根据黄金分割原理设计的,所以又称之为黄金分割法。优选法是一种求最优化问题的方法。

二、实现

# -*- coding: utf-8 -*-"""Created on Tue May 23 13:10:17 2017    0.618法    @author: Administrator"""import numpy as npimport matplotlib.pyplot as pltepsilon = 1e-3alpha = 0.618# -2 - 3def f(x):    return np.e**(-x) + x**2def solve(a,b):    count = 0    while b - a > 0:        lam = a + (1 - alpha) * (b - a)        mu = a + alpha * (b - a)        print 'count: %d' % count        print 'a: %f' % a        print 'b: %f' % b        print 'b-a: %f' % (b-a)        print 'lambda: %f' % lam        print 'mu: %f' % mu        print '---------------------'        if b - a < epsilon:            return (a + b) / 2,f((a + b) / 2)        elif f(lam) > f(mu):            a = lam            lam = mu            mu = a + alpha * (b - a)        elif f(lam) <= f(mu):            b = mu            mu = lam            lam = a + (1 - alpha) * (b - a)        count += 1def draw(ans):    x = np.linspace(-2,3,1000)    y = f(x)    fig = plt.figure(figsize=(8,4))    ax = fig.add_subplot(111)    ax.set_xlabel('x')    ax.set_ylabel('y')    ax.plot(x,y,color='r',linestyle='-.',label='f(x)')    ax.scatter(ans[0],ans[1])    ax.legend(loc='upper right')    fig.show()    fig.savefig('a.png')def main():    ans = solve(-2.0,3.0)    draw(ans)    print ansif __name__ == '__main__':    main()

0.618法

原创粉丝点击