黄金分割法(又称 0.618 法)是求单峰函数极值的一种试探法,所谓单峰函数是指只有一个峰值(局部极小值也是全局极小值,或者说只有唯一的局部极小值)的函数,其严格定义为:
定义:设 f(x) 是定义在 [a,b] 上的函数,若:
- (1)存在 x⋆∈[a,b] 使 minx∈{a,b}f(x)=f(x⋆)
- (2)对任意的 a≤x1<x2≤b ,当 x2≤x⋆ 时, f(x1)>f(x2) ;当 x1≥x⋆ 时, f(x1)≤f(x2)
则称 f(x) 为 [a,b] 上的单峰函数。
搜索区间收缩原则
“去坏留好”原则
含义较为简单,不再赘述。
对称原则
x1−a=b−x2x2=a+b−x1等比原则
x2=a+w(b−a)x1=a+w2(b−a)又根据对称原则: x1−a=b−x2 ,最终可得,
w2=1−w
简单举例,
求 y=x2 (显然为单峰函数)在[-1, 1]上的最小值;
def golden_split(f, a, b):
x1 = a + 0.332*(b-a)
x2 = a + b - x1
while abs(x1 - x2) < 1e-5:
R, G = f(x1), f(x2)
if R > G:
b = x2
x2 = x1
x1 = a + b - x2
else:
a = x1
x1 = x2
x2 = a + b - x1
return (a + b)/2
print(golden_split(lambda x: x^2), -1, 1))