问题
找图中函数在区间[5,8]的最大值
重点思路
爬山算法会收敛到局部最优,解决办法是初始值在定义域上随机取乱数100次,总不可能100次都那么倒霉。
实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
import numpy as np
import matplotlib.pyplot as plt
import math
# 搜索步长
delta = 0.01
# 定义域x从5到8闭区间
bound = [ 5 , 8 ]
# 随机取乱数100次
generation = 100
def f(x):
return math.sin(x * x) + 2.0 * math.cos( 2.0 * x)
def hillclimbing(x):
while f(x + delta)>f(x) and x + delta< = bound[ 1 ] and x + delta> = bound[ 0 ]:
x = x + delta
while f(x - delta)>f(x) and x - delta< = bound[ 1 ] and x - delta> = bound[ 0 ]:
x = x - delta
return x,f(x)
def findmax():
highest = [ 0 , - 1000 ]
for i in range (generation):
x = np.random.rand() * (bound[ 1 ] - bound[ 0 ]) + bound[ 0 ]
currentvalue = hillclimbing(x)
print ( 'current value is :' ,currentvalue)
if currentvalue[ 1 ] > highest[ 1 ]:
highest[:] = currentvalue
return highest
[x,y] = findmax()
print ( 'highest point is x :{},y:{}' . format (x,y))
|
运行结果:
总结
以上所述是小编给大家介绍的python实现爬山算法的思路详解,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
原文链接:https://www.jianshu.com/p/70b4c878917e