问题
找图中函数在区间[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