一、启发式算法
还有一类重要的迭代法,它的迭代关系式不依赖问题的数学性能,而是受某种自然现象的启发而得到,称为启发式算法(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 - 6def hillClimbing(x, f):times = 0print(str(times)+":"+str(x))while abs( f(x+delta) ) < abs(f(x)) and x+delta <= BOUND[1] and x+delta >= BOUND[0]:x = x + deltatimes += 1print(str(times)+":"+str(x))while abs( f(x-delta) ) < abs(f(x)) and x-delta <= BOUND[1] and x-delta >= BOUND[0]:x = x - deltatimes += 1print(str(times)+":"+str(x))return xx = 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()
创作不易 觉得有帮助请点赞关注收藏~~~

















