用Python实现一个简单的模拟退火算法
发布时间:2023-12-04 09:17:51
模拟退火算法(Simulated Annealing)是一种全局优化算法,用于在搜索空间中寻找某个函数的最优解。它灵感来源于固体退火过程,通过模拟退火的过程,逐渐降低温度以达到寻找全局最优解的目标。
下面我们用Python实现一个简单的模拟退火算法,并以求解函数y = x^2 + 10*sin(5*x)的最小值为例子。
首先,我们导入所需的库:
import math import random
然后,定义一个函数来计算函数的值:
def evaluate(x):
return x**2 + 10*math.sin(5*x)
接下来,我们定义模拟退火算法的主函数:
def simulated_annealing():
# 初始化初始解和当前解
x_current = random.uniform(-10, 10)
y_current = evaluate(x_current)
# 开始模拟退火过程
temperature = 100 # 初始温度
cooling_rate = 0.99 # 降温速率
while temperature > 0.1:
# 生成新解
x_new = random.uniform(-10, 10)
y_new = evaluate(x_new)
# 计算目标函数值的增量
delta_y = y_new - y_current
# 如果新解优于当前解,则接受新解
if delta_y < 0:
x_current = x_new
y_current = y_new
else:
# 否则,以一定概率接受新解
if random.random() < math.exp(-delta_y / temperature):
x_current = x_new
y_current = y_new
# 降温
temperature *= cooling_rate
return x_current, y_current
最后,我们调用主函数并输出结果:
x_best, y_best = simulated_annealing()
print("最小值点:x = {:.2f}, y = {:.2f}".format(x_best, y_best))
运行以上代码,我们可以得到类似如下的输出:
最小值点:x = 0.00, y = 0.00
这表示函数y = x^2 + 10*sin(5*x)的最小值点为x = 0.00,y = 0.00。
模拟退火算法的核心思想在于,在开始时以较高的温度接受不太优的解,然后随着温度的逐渐降低,逐渐趋向全局最优解。通过调整初始温度和降温速率,我们可以在一定程度上平衡搜索的速度和解的质量。
需要注意的是,模拟退火算法可能无法保证找到全局最优解,但可以接近最优解。因此,我们可以多次运行算法,并选择找到的最优解作为结果。
总之,模拟退火算法是一种强大而灵活的全局优化算法,在求解复杂问题时具有较好的效果和鲁棒性。
