一、启发式算法
还有一类重要的迭代法,它的迭代关系式不依赖问题的数学性能,而是受某种自然现象的启发而得到,称为启发式算法(Heuristic Algorithm),如爬山法、遗传算法、模拟退火算法、蚁群算法等。
启发式算法是一种根据经验,以近似随机的试探来搜索空间的方法,它可以在可接受的计算成本内得到最好解,但不保证能得到最优解。
爬山法
爬山法的思路很简单,它是从起点开始,对周边邻近点进行试探,如果有更好的解,则从该点开始进行新一轮的试探,直到没有更好的解为至。
爬山法好像人在黑夜里爬山,无法看到周边的情况,但可以通过棍子来试探周边上升的位置,然后到该位置再一次试探周边的位置。
爬山法可能跑到所谓的局部最优点,形象地说,就是可以爬到山峰,但不一定是最高的那座山峰。
下面介绍用爬山法来寻找上述方程的解。随机设置初始点,通过多轮迭代,程序能够搜索到接近方程的解的值,求解的精度和迭代的次数和初始点有关
大概迭代到500多次收敛
代码如下
import random # 搜索步长 delta = 0.001 # 通过代入0和1,可估计出解在0和1之间 BOUND = [0, 1] def f(x): return x**3 + (math.e**x)/2.0 + 5.0*x - 6 def hillClimbing(x, f): times = 0 print(str(times)+":"+str(x)) while abs( f(x+delta) ) < abs(f(x)) and x+delta <= BOUND[1] and x+delta >= BOUND[0]: x = x + delta times += 1 print(str(times)+":"+str(x)) while abs( f(x-delta) ) < abs(f(x)) and x-delta <= BOUND[1] and x-delta >= BOUND[0]: x = x - delta times += 1 print(str(times)+":"+str(x)) return x x = random.random() * ( BOUND[1]-BOUND[0] ) + BOUND[0] x_value = hillClimbing(x, f)
下面将迭代过程可视化
代码如下
import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 1, 100) y = f(x) plt.plot(x, y, color="red", linewidth=1) plt.show()
创作不易 觉得有帮助请点赞关注收藏~~~