本文主要是介绍0.618法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、简介
0.618法又称黄金分割法,是优选法的一种。是在优选时把尝试点放在黄金分割点上来寻找最优选择。0.618法是根据黄金分割原理设计的,所以又称之为黄金分割法。优选法是一种求最优化问题的方法。
二、实现
# -*- coding: utf-8 -*-
"""
Created on Tue May 23 13:10:17 20170.618法 @author: Administrator
"""import numpy as np
import matplotlib.pyplot as pltepsilon = 1e-3
alpha = 0.618
# -2 - 3
def f(x):return np.e**(-x) + x**2def solve(a,b):count = 0while b - a > 0:lam = a + (1 - alpha) * (b - a)mu = a + alpha * (b - a)print 'count: %d' % countprint 'a: %f' % aprint 'b: %f' % bprint 'b-a: %f' % (b-a)print 'lambda: %f' % lamprint 'mu: %f' % muprint '---------------------'if b - a < epsilon:return (a + b) / 2,f((a + b) / 2)elif f(lam) > f(mu):a = lamlam = mumu = a + alpha * (b - a)elif f(lam) <= f(mu):b = mumu = lamlam = 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法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!