模拟退火(Simulated Annealing)

文章介绍了模拟退火算法的基本原理,如何受物理学退火过程启发,通过随机搜索和接受较差解策略找到全局最优解。并以最小化二元函数为例,展示了算法的计算流程和在实际问题中的应用,包括参数设置和可视化结果。
摘要由CSDN通过智能技术生成

注意:本文引用自专业人工智能社区Venus AI

更多AI知识请参考原站 ([www.aideeplearning.cn])

算法引言

模拟退火算法是一种启发式搜索算法,它受到物理学中固体物质退火过程的启发。在物理学中,退火是一种将材料加热至高温,然后缓慢冷却以减少材料内部应力的过程。在这个过程中,材料的微观结构会因为温度的变化而重组,从而达到更稳定的状态。

类似地,在模拟退火算法中,”退火”过程被用于寻找问题的全局最优解。算法开始时设置一个较高的”温度”,允许算法在解空间中较为随意地搜索。随着温度的降低,算法逐渐减少搜索范围,从而集中在更有希望的区域。这种方法可以有效避免算法过早地陷入局部最优解。

模拟退火算法的关键特点是它在每一步都有一定的概率接受比当前解更差的解。这一特性使得算法能够跳出局部最优解,增加找到全局最优解的可能性。当然,随着温度的降低,接受更差解的概率也会降低,使算法逐渐聚焦于当前解附近的搜索。

算法应用

模拟退火算法的应用十分广泛,特别是在解决那些对精确解求解困难的优化问题时。例如,在旅行商问题(TSP)、排班问题、组合优化问题等领域,模拟退火算法都展现了它的强大能力。由于它的随机性和灵活性,模拟退火算法可以有效地在大规模的搜索空间中寻找全局最优解,而不易陷入局部最优解。

此外,模拟退火算法由于其简单和易于实现的特性,被广泛应用于工业工程、计算化学、物理学等多个领域的问题解决中。它提供了一种相对高效的方式来处理那些传统算法难以应对的复杂问题。

算法计算流程

让我们用模拟退火算法解决一个简单的优化问题:最小化二元函数f(x,y)=x^2+y^2。这是一个凸函数,其最小值在点 (0,0) 处。我们将使用模拟退火算法来找到这个最小值。
1. 初始化:
– 初始解:假设初始解为 (x_0,y_0)=(2,2) ,即起始点在坐标 (2,2) 处。
– 初始温度 T : 设为 1000 。
– 冷却率 α : 设为 0.95 。
– 终止温度: 设为 1 。
2. 迭代过程:
假设每个温度下迭代 100 次。
对于每次迭代:
– 生成新解: 在当前解的小范围内随机扰动,例如让 x 和 y 均在 [−1,1] 范围内随机变化。
– 计算能量变化\Delta E:\Delta E=f\left(x_{\mathrm{new}},y_{\mathrm{new}}\right.)-f\left(x_{\mathrm{old}},y_{\mathrm{old}}\right.)  。
– 判断是否接受新解:
– 如果 ΔE<0 ,接受新解。
– 如果 ΔE≥0 ,以概率e^{-\Delta E/T}接受新解。
– 更新温度: T:=\alpha\cdot T 。

3. 终止条件:
当温度降至1以下时停止迭代。
4. 例子演示:
假设在某次迭代中,当前解为 (1,1) (即 f(1,1)=2 ),当前温度为 500 。
– 生成新解:假设新解为 (0.8,1.2) 。
– 计算 \Delta E:\Delta E=f(0.8,1.2)-f(1,1)=0.8^2+1.2^2-2=-0.36 。
– 因为 ΔE<0 ,我们接受新解 (0.8,1.2) 。
假设在另一次迭代中,当前解为 (0.5,0.5) ,当前温度为 300 。
– 生成新解: 假设新解为 (0.7,0.6) 。
– 计算 \Delta E:\Delta E=f(0.7,0.6)-f(0.5,0.5)=0.85 。
– ΔE≥0, 计算接受概率:e^{-0.85/300}\approx0.997
– 以这个概率接受新解。假设随机数在这个概率内,我们接受新解 (0.7,0.6) 。
5. 结果:
随着温度的下降和迭代的进行,解将越来越接近全局最优解 (0,0) 。

通过这个简单的例子,可以看出模拟退火算法是如何在初期通过接受差的解来避免陷入局部最优,而在后期逐渐收敛到全局最优解的。在实际应用中,根据问题的复杂性和特性,可能需要调整初始温度、冷却率、迭代次数等参数以获得更好的结果。

代码实现

最小化二元函数f(x,y)=x^2+y^2的代码实现如下:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 定义二元函数和它的梯度
def f(x, y):
    return x**2 + y**2

def df(x, y):
    return 2*x, 2*y

# 模拟退火算法
def simulated_annealing(f, df, start, T_start, T_end, cooling_rate, max_iter):
    x, y = start
    f_current = f(x, y)
    path = [(x, y)]
    
    T = T_start
    for _ in range(max_iter):
        dx, dy = df(x, y)
        x_new = x - T * dx + np.random.uniform(-T, T)
        y_new = y - T * dy + np.random.uniform(-T, T)
        f_new = f(x_new, y_new)
        
        if f_new < f_current or np.random.rand() < np.exp((f_current - f_new) / T):
            x, y = x_new, y_new
            f_current = f_new
            path.append((x, y))
        
        T *= cooling_rate

        if T < T_end:
            break
    
    return x, y, path

# 参数设置
start = (5, 5)        # 初始点
T_start = 1           # 初始温度
T_end = 0.001         # 结束温度
cooling_rate = 0.9    # 冷却速率
max_iter = 1000       # 最大迭代次数

# 执行模拟退火算法
x_opt, y_opt, path = simulated_annealing(f, df, start, T_start, T_end, cooling_rate, max_iter)

# 结果可视化
x = np.linspace(-6, 6, 400)
y = np.linspace(-6, 6, 400)
x, y = np.meshgrid(x, y)
z = f(x, y)

fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(x, y, z, rstride=1, cstride=1, cmap='viridis', alpha=0.8)
ax.plot([p[0] for p in path], [p[1] for p in path], [f(*p) for p in path], color='r', marker='o', markersize=5)
ax.set_title('Simulated Annealing Optimization')
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
ax.set_zlabel('f(x, y)')
plt.show()

# 最优解
x_opt, y_opt

模拟退火对上述例子求解过程的可视化如下:

图片[1]-模拟退火(Simulated Annealing)-VenusAI

通过模拟退火算法,我们找到了函数 (f(x, y)=x^2+y^2) 的一个近似最小值点。从可视化的结果中,我们可以看到,算法的路径从初始点 ((5,5)) 开始,经过一系列的探索和调整,逐渐接近了原点 ((0,0)) ,这是该函数的全局最小值点。

最终,算法找到的最小值点约为 ((0.015,-0.069)) 。虽然这个结果并不是完全精确的 ((0), (0)) ,但考虑到模拟退火算法的随机性和启发式特点,这已经是一个非常接近的近似解了。这个例子展示了模拟退火算法在解决优化问题上的有效性,尤其是在复杂或高维的搜索空间中寻找全局最优解的能力。

  • 17
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值