欢迎访问宙启技术站
智能推送

用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。

模拟退火算法的核心思想在于,在开始时以较高的温度接受不太优的解,然后随着温度的逐渐降低,逐渐趋向全局最优解。通过调整初始温度和降温速率,我们可以在一定程度上平衡搜索的速度和解的质量。

需要注意的是,模拟退火算法可能无法保证找到全局最优解,但可以接近最优解。因此,我们可以多次运行算法,并选择找到的最优解作为结果。

总之,模拟退火算法是一种强大而灵活的全局优化算法,在求解复杂问题时具有较好的效果和鲁棒性。