什么是模拟退火算法
**模拟退火算法(Simulated Annealing, SA)**是一种基于概率的全局优化算法,灵感来源于固体退火过程:将金属加热至高温后缓慢冷却,使其原子从无序状态逐渐趋于有序的低能态。算法通过模拟这一过程,在搜索解空间时允许以一定概率接受“较差解”(避免陷入局部最优),随着“温度”参数逐渐降低,接受差解的概率减小,最终收敛到全局最优解附近
想象你在山区寻找最低点(最优解):
高温阶段:开始时像“醉汉”一样随机大步走动,可能爬坡(接受更差的解),避免困在小山谷(局部最优)。
降温阶段:逐渐清醒,步伐变小,更倾向于下坡(只接受更好的解)。
低温阶段:冷静搜索,精细调整位置直至找到最低点。
模拟退火的核心思想源于固体退火过程:
高温阶段:粒子剧烈运动(算法广泛探索解空间,接受劣解概率高);
缓慢降温:粒子渐趋有序(算法逐步收敛,接受劣解概率降低);
低温稳态:形成晶体(找到全局最优解)。
初学者理解关键:想象一只醉酒的兔子下山:
醉酒时(高温)胡乱蹦跳,可能跳向更高处(接受劣解);
酒醒时(降温)逐步向低处走(收敛到最优解)
工作原理
模拟退火算法的工作过程可以分为以下几个步骤:
-
初始化
- 选择一个初始解(通常是随机生成的)。
- 设置一个较高的初始温度(T),表示探索的随机性程度。
-
迭代过程
- 在当前解的邻域内随机选择一个新解。
- 计算新解的目标函数值(例如,对于最小化问题,计算成本或误差)。
-
接受准则
- 如果新解比当前解更好(例如,目标函数值更小),则无条件接受新解。
- 如果新解比当前解差,则以一定的概率接受新解。这个概率通常由以下公式计算:
P(接受)=e−ΔET P(\text{接受}) = e^{-\frac{\Delta E}{T}} P(接受)=e−TΔE
其中,ΔE\Delta EΔE是新解与当前解的目标函数值之差,(T) 是当前温度。 - 这种机制允许算法在早期(高温时)接受较差解,从而有机会跳出局部最优解。
-
降温
- 按照一定的降温策略降低温度,例如几何降温:T=αTT = \alpha TT=αT(其中 0<α<10 < \alpha < 10<α<1)。
- 降温过程使算法逐渐从广泛探索转向收敛到最优解。
-
停止条件
- 当温度降到很低、达到最大迭代次数,或连续多次迭代未改善解时,算法停止。
- 返回搜索到的最优解。
特点
- 全局搜索能力:通过接受较差解,模拟退火算法能够避免陷入局部最优解,增加找到全局最优解的机会。
- 灵活性:适用于多种优化问题,尤其是搜索空间大、结构复杂的问题。
- 参数敏感:算法性能依赖于初始温度、降温速率和邻域结构等参数的设置,需根据具体问题调整。
应用领域
模拟退火算法在许多领域有广泛应用,包括:
- 组合优化问题:如旅行商问题(TSP)、背包问题、图着色问题等。
- 图像处理:如图像分割、图像配准等。
- 机器学习:如神经网络训练、聚类分析等。
- 工程设计:如电路设计、结构优化等。
一个例子讲解模拟退火算法
模拟退火(Simulated Annealing, SA)算法是一种受物理退火过程启发的优化方法,适用于解决复杂的全局优化问题。为了帮助理解,我们通过一个经典的例子——旅行商问题(Traveling Salesman Problem, TSP)——来讲解其工作原理。
1. 问题定义
旅行商问题的目标是找到访问一组城市并返回起点的最短路径。假设有4个城市:A、B、C、D,它们之间的距离如下(单位:公里):
- A 到 B: 20
- A 到 C: 42
- A 到 D: 35
- B 到 C: 30
- B 到 D: 34
- C 到 D: 12
我们要找出一条路径,访问每个城市恰好一次并回到起点A,使得总距离最短。
2. 模拟退火算法的核心思想
模拟退火算法模仿金属退火过程,通过高温下接受较差解来跳出局部最优,随着温度降低逐渐收敛到全局最优。其关键步骤包括:
- 初始解:随机生成一个初始路径。
- 邻域解生成:通过小幅修改当前路径生成新路径。
- 接受准则:如果新路径更优,则接受;如果更差,则以一定概率接受。
- 降温策略:逐渐降低温度,减少接受较差解的概率。
- 停止条件:温度足够低或解不再改进时停止。
3. 示例演算
我们用TSP来演示模拟退火算法的运行过程。假设初始温度 (T = 1000),降温系数 (\alpha = 0.99)。
步骤1:初始解
随机生成初始路径:A → B → C → D → A
总距离 = 20 (A→B) + 30 (B→C) + 12 (C→D) + 35 (D→A) = 97公里
步骤2:第一次迭代
- 生成邻域解:交换B和C,得到新路径 A → C → B → D → A
- 新路径总距离 = 42 (A→C) + 30 (C→B) + 34 (B→D) + 35 (D→A) = 141公里
- 接受准则:
- 距离变化 (\Delta E = 141 - 97 = 44)(新路径更长)
- 接受概率 (P = e^{-\frac{\Delta E}{T}} = e^{-\frac{44}{1000}} \approx 0.957)
- 假设随机数为0.8(小于0.957),则接受新路径。
- 结果:当前路径更新为 A → C → B → D → A(141公里)
- 降温:(T = 1000 \times 0.99 = 990)
步骤3:第二次迭代
- 生成邻域解:从A → C → B → D → A,交换C和D,得到 A → D → B → C → A
- 新路径总距离 = 35 (A→D) + 34 (D→B) + 30 (B→C) + 42 (C→A) = 141公里
- 接受准则:
- (\Delta E = 141 - 141 = 0)
- 由于距离没有变差,接受新路径。
- 结果:当前路径更新为 A → D → B → C → A(141公里)
- 降温:(T = 990 \times 0.99 = 980.1)
步骤4:第三次迭代
- 生成邻域解:从A → D → B → C → A,交换D和B,得到 A → B → D → C → A
- 新路径总距离 = 20 (A→B) + 34 (B→D) + 12 (D→C) + 42 (C→A) = 108公里
- 接受准则:
- (\Delta E = 108 - 141 = -33)(新路径更短)
- 由于新路径更优,无条件接受。
- 结果:当前路径更新为 A → B → D → C → A(108公里)
- 降温:(T = 980.1 \times 0.99 = 970.3)
后续迭代
算法继续迭代,生成新路径并根据接受准则决定是否接受。随着温度降低,接受较差解的概率逐渐减小。例如,经过多次迭代,算法可能找到更优路径,如 A → D → C → B → A(总距离 = 35 + 12 + 30 + 20 = 97公里),这是本例中的最优解之一。
4. 算法停止
当温度降到很低(例如 (T < 1))或连续多次迭代未改善解时,算法停止,返回当前最优路径。
5. 代码
import numpy as np
def tsp_distance(path, dist_matrix):
return sum(dist_matrix[path[i], path[(i+1) % len(path)]] for i in range(len(path)))
def sa_tsp(dist_matrix, max_iter=5000, T0=1000, alpha=0.99):
n = dist_matrix.shape[0]
current_path = np.random.permutation(n)
best_path = current_path.copy()
T = T0
for i in range(max_iter):
# 生成新解:随机交换两个城市
new_path = current_path.copy()
i1, i2 = np.random.choice(n, 2, replace=False)
new_path[i1], new_path[i2] = new_path[i2], new_path[i1]
delta_E = tsp_distance(new_path, dist_matrix) - tsp_distance(current_path, dist_matrix)
if delta_E < 0 or np.exp(-delta_E / T) > np.random.rand():
current_path = new_path
if tsp_distance(new_path, dist_matrix) < tsp_distance(best_path, dist_matrix):
best_path = new_path
T *= alpha
return best_path
# 示例:4个城市的距离矩阵
dist_matrix = np.array([
[0, 10, 15, 20],
[10, 0, 35, 25],
[15, 35, 0, 30],
[20, 25, 30, 0]
])
best_path = sa_tsp(dist_matrix)
print(f"最短路径: {best_path}, 距离: {tsp_distance(best_path, dist_matrix)}")
``
通过这个例子,我们可以看到模拟退火算法的几个特点:
- 探索与利用的平衡:在高温时,算法接受较差解(如从97公里到141公里),避免陷入局部最优;在低温时,倾向于保留更优解,逐步收敛。
- 随机性:通过随机生成邻域解和概率接受机制,算法能够广泛搜索解空间。
- 收敛性:随着温度降低,算法逐渐稳定到全局最优或接近最优的解。
在这个TSP例子中,模拟退火从随机路径开始,通过不断调整并根据温度控制接受策略,最终找到了一条较短的路径。这种方法特别适合复杂的优化问题,展示了模拟退火算法的强大之处。
模拟退火算法(Simulated Annealing, SA)的核心公式主要基于其物理退火过程的数学抽象,可分为以下四部分:
模拟退火的核心公式
⚙️ 1. Metropolis准则(状态接受概率公式)
该公式决定是否接受新解(包括更差的解),是算法跳出局部最优的关键:
P(ΔE)={1if ΔE<0exp(−ΔET)if ΔE≥0 P(\Delta E) = \begin{cases}
1 & \text{if } \Delta E < 0 \\
\exp\left(-\frac{\Delta E}{T}\right) & \text{if } \Delta E \geq 0
\end{cases} P(ΔE)={1exp(−TΔE)if ΔE<0if ΔE≥0
- 参数说明:
- ΔE\Delta EΔE:新解与当前解的目标函数值之差(ΔE=Enew−Ecurrent\Delta E = E_{\text{new}} - E_{\text{current}}ΔE=Enew−Ecurrent)。
- 若 ΔE<0\Delta E < 0ΔE<0(新解更优),则直接接受新解(P=1P=1P=1);
- 若 ΔE≥0\Delta E \geq 0ΔE≥0(新解更差),则以概率 PPP 接受新解。
- TTT:当前温度参数,初始值 T0T_0T0 较高,后期逐渐降低。
- exp\expexp:指数函数,保证 P∈(0,1)P \in (0,1)P∈(0,1)。
- ΔE\Delta EΔE:新解与当前解的目标函数值之差(ΔE=Enew−Ecurrent\Delta E = E_{\text{new}} - E_{\text{current}}ΔE=Enew−Ecurrent)。
物理意义:高温时(TTT 大),P≈1P \approx 1P≈1,算法广泛接受劣解以探索全局;低温时(TTT 小),P≈0P \approx 0P≈0,仅接受更优解以收敛。
📉 2. 温度更新公式(降温策略)
控制温度随迭代次数下降的规律,常见策略为:
(1)指数降温(最常用)
Tk+1=α⋅Tk,0<α<1 T_{k+1} = \alpha \cdot T_k, \quad 0 < \alpha < 1 Tk+1=α⋅Tk,0<α<1
- α\alphaα:降温速率(通常取 0.8∼0.990.8 \sim 0.990.8∼0.99)。
- α\alphaα 越小 → 降温越快 → 收敛快但易陷入局部最优;
- α\alphaα 越大 → 降温越慢 → 搜索充分但耗时长。
(2)线性降温
Tk+1=Tk−ΔT T_{k+1} = T_k - \Delta T Tk+1=Tk−ΔT
- ΔT\Delta TΔT:固定降温步长,需人工设定。
🔋 3. 能量差计算(目标函数变化量)
用于量化解的优劣:
ΔE=f(xnew)−f(xcurrent) \Delta E = f(x_{\text{new}}) - f(x_{\text{current}}) ΔE=f(xnew)−f(xcurrent)
- 说明:
- f(x)f(x)f(x):目标函数(能量函数)。
- 最小化问题:ΔE<0\Delta E < 0ΔE<0 表示新解更优;
- 最大化问题:需调整为 KaTeX parse error: Expected 'EOF', got '}' at position 52: …(x_{\text{new}}}̲) 或取负值。
🔄 4. 邻域解生成公式(扰动机制)
从当前解生成新解的方式:
xnew=xcurrent+δ x_{\text{new}} = x_{\text{current}} + \delta xnew=xcurrent+δ
- δ\deltaδ:随机扰动向量,其分布和幅度影响搜索范围。
- 连续问题:δ∼N(0,σ)\delta \sim \mathcal{N}(0, \sigma)δ∼N(0,σ)(高斯分布),步长 σ\sigmaσ 随温度降低而减小。
- 离散问题(如TSP):通过交换、反转或插入操作扰动路径。
🌡️ 公式协同作用与温度影响
温度 TTT 阶段 | ΔE≥0\Delta E \geq 0ΔE≥0 的 PPP 值 | 算法行为 | 目标 |
---|---|---|---|
高温(T≈1000T \approx 1000T≈1000) | P≈1P \approx 1P≈1 | 大范围跳跃,频繁接受劣解 | 全局探索 |
中温(T≈100T \approx 100T≈100) | P≈0.5P \approx 0.5P≈0.5 | 局部试探,平衡探索与开发 | 过渡阶段 |
低温(T≈0.1T \approx 0.1T≈0.1) | P≈0P \approx 0P≈0 | 微调当前解,极少接受劣解 | 局部收敛 |
💡 实际应用示例(TSP问题)
- ΔE\Delta EΔE 计算:新路径长度 LnewL_{\text{new}}Lnew 与当前路径 LcurrentL_{\text{current}}Lcurrent 的差值(ΔE=Lnew−Lcurrent\Delta E = L_{\text{new}} - L_{\text{current}}ΔE=Lnew−Lcurrent)。
- 扰动操作:随机交换路径中两个城市的顺序。
- 接受概率:若 ΔE=5\Delta E = 5ΔE=5(新路径更长),T=100T=100T=100 时 P=e−0.05≈0.95P = e^{-0.05} \approx 0.95P=e−0.05≈0.95,大概率接受劣解以跳出局部最优。
💎 核心价值:通过温度 TTT 动态控制随机性,实现“探索(高温)→ 平衡(中温)→ 收敛(低温)”的优化过程,有效避免局部最优陷阱。
以下是结合旅行商问题(TSP)对模拟退火算法核心公式的解析,通过具体场景说明公式的作用机制:
1. Metropolis准则(接受劣解概率)
公式:
P(ΔE)={1if ΔE<0exp(−ΔET)if ΔE≥0 P(\Delta E) = \begin{cases}
1 & \text{if } \Delta E < 0 \\
\exp\left(-\frac{\Delta E}{T}\right) & \text{if } \Delta E \geq 0
\end{cases} P(ΔE)={1exp(−TΔE)if ΔE<0if ΔE≥0
在TSP中的应用:
- ΔE\Delta EΔE:新路径长度与当前路径长度的差值(ΔE=Lnew−Lcurrent\Delta E = L_{\text{new}} - L_{\text{current}}ΔE=Lnew−Lcurrent)。
- 若 ΔE<0\Delta E < 0ΔE<0(新路径更短),直接接受新路径。
- 若 ΔE≥0\Delta E \geq 0ΔE≥0(新路径更长),以概率 P=exp(−ΔE/T)P = \exp(-\Delta E / T)P=exp(−ΔE/T) 接受劣解。
- 温度 TTT 的影响:
- 高温阶段(T≈1000T \approx 1000T≈1000):P≈1P \approx 1P≈1,算法广泛接受劣解,探索全局路径。
例:当前路径长 100100100 km,新路径长 105105105 km(ΔE=5\Delta E=5ΔE=5),T=1000T=1000T=1000 时 P=e−0.005≈0.995P=e^{-0.005} \approx 0.995P=e−0.005≈0.995,几乎必然接受。 - 低温阶段(T≈0.1T \approx 0.1T≈0.1):P≈0P \approx 0P≈0,算法仅接受更优解,收敛到局部最优。
- 高温阶段(T≈1000T \approx 1000T≈1000):P≈1P \approx 1P≈1,算法广泛接受劣解,探索全局路径。
2. 温度更新公式(降温策略)
公式:
Tk+1=α⋅Tk(0<α<1) T_{k+1} = \alpha \cdot T_k \quad (0 < \alpha < 1) Tk+1=α⋅Tk(0<α<1)
在TSP中的应用:
- α\alphaα(降温速率):
- α\alphaα 接近 111(如 0.990.990.99):降温慢,搜索充分但耗时长。
- α\alphaα 较小(如 0.900.900.90):降温快,可能漏掉全局最优。
- 参数设置:
- 初始温度 T0T_0T0 需足够高(如路径长度范围的 101010 倍),确保初期充分探索。
- 终止温度 TendT_{\text{end}}Tend(如 0.10.10.1)控制算法停止时机。
3. 能量差计算(目标函数差值)
公式:
ΔE=f(xnew)−f(xcurrent) \Delta E = f(x_{\text{new}}) - f(x_{\text{current}}) ΔE=f(xnew)−f(xcurrent)
在TSP中的定义:
- f(x)f(x)f(x) 为路径总长度。
- 最小化目标:ΔE<0\Delta E < 0ΔE<0 表示新路径更优。
4. 邻域解生成公式(扰动机制)
公式:
xnew=swap(xcurrent) x_{\text{new}} = \text{swap}(x_{\text{current}}) xnew=swap(xcurrent)
在TSP中的操作:
- 随机交换两个城市位置:
def get_neighbor_route(old_route): new_route = old_route.copy() i, j = random.sample(range(len(old_route)), 2) # 随机选两个索引 new_route[i], new_route[j] = new_route[j], new_route[i] # 交换位置 return new_route
- 物理意义:小幅扰动当前路径,生成候选解,避免路径陷入僵化。
**5. 算法流程示例(TSP求解步骤)
步骤 | 操作 | 参数示例 |
---|---|---|
1. 初始化 | 随机生成初始路径,设置 T0=1000T_0=1000T0=1000, α=0.95\alpha=0.95α=0.95, Tend=0.1T_{\text{end}}=0.1Tend=0.1 | 初始路径:[A, B, C, D, A] |
2. 生成新解 | 交换路径中随机两个城市(如 B 和 D) | 新路径:[A, D, C, B, A] |
3. 计算 ΔE\Delta EΔE | L新=120L_{\text{新}} = 120L新=120 km, L当前=100L_{\text{当前}} = 100L当前=100 km, ΔE=20\Delta E = 20ΔE=20 | |
4. Metropolis判断 | 若 T=500T=500T=500,P=e−20/500≈0.96P = e^{-20/500} \approx 0.96P=e−20/500≈0.96,若随机数 <0.96< 0.96<0.96 则接受劣解 | |
5. 降温 | T←0.95×TT \leftarrow 0.95 \times TT←0.95×T | 新温度 T=475T = 475T=475 |
6. 终止 | 重复步骤 2-5 直至 T<0.1T < 0.1T<0.1,输出最短路径 |
🌡️ 温度对搜索行为的影响
温度 TTT 接受劣解概率 算法行为 T=1000T=1000T=1000(高温) P≈1P \approx 1P≈1 大范围跳跃,探索新区域 T=100T=100T=100(中温) P≈0.6P \approx 0.6P≈0.6 局部调整,平衡探索与收敛 T=0.1T=0.1T=0.1(低温) P≈0P \approx 0P≈0 微调路径,拒绝劣解
💡 关键点总结
- Metropolis准则 是跳出局部最优的核心,通过概率性接受劣解扩大搜索范围。
- 温度衰减 需平衡速度与精度:α\alphaα 越大,全局搜索能力越强。
- 扰动设计 需匹配问题特性:TSP 采用交换操作,连续问题可用高斯扰动。
附:TSP求解效果示例(中国31个城市)
- 初始随机路径:长度 15,00015,00015,000 km
- 模拟退火优化后:长度 10,00010,00010,000 km(缩短 33%33\%33%)