模拟退火算法(Simulated Annealing)

模拟退火算法

说说什么是算法?有人理解是输入数据经过一些步骤的处理,最后输出。在我理解来看就是一种优化问题或者说是数值分析,无论机器学习中的算法还是深度学习的算法,寻找最优模型都是解最小损失的函数。最后计算得到的模型都是对常用的模型的套用,得到具体模型前,关键还是求解损失函数,具体化模型参数。模拟退火不是模型,是一种算法,用于求解最优值。

背景

摘自维基百科模拟退火: 模拟退火来自冶金学的专有名词退火。退火是将材料加热后再经特定速率冷却,目的是增大晶粒的体积,并且减少晶格中的缺陷。材料中的原子原来会停留在使内能有局部最小值的位置,加热使能量变大,原子会离开原来位置,而随机在其他位置中移动。退火冷却时速度较慢,使得原子有较多可能可以找到内能比原先更低的位置。 模拟退火的原理也和金属退火的原理近似:我们将热力学的理论套用到统计学上,将搜寻空间内每一点想像成空气内的分子;分子的能量,就是它本身的动能;而搜寻空间内的每一点,也像空气分子一样带有“能量”,以表示该点对命题的合适程度。算法先以搜寻空间内一个任意点作起始:每一步先选择一个“邻居”,然后再计算从现有位置到达“邻居”的概率。 可以证明,模拟退火算法所得解依概率收敛到全局最优解。
不知到你什么感受,反正我开始看这段内容,然后理解算法有十万八千里的感觉。一句话,没有毛用。

公式

先介绍这个式子, T T T表示温度, k k k玻尔兹曼常量, Δ E \Delta E ΔE表示变化前后的能量的差值
在这里插入图片描述
上面这个公式 T T T是温度,退火表示温度的变低的过程,所以温度应用随时间变化。于是, T T T从某一高温状态T向低温状态冷却时的降温函数
在这里插入图片描述
T T T0表示初始温度, t t t表示时间。言归正传,将上面的公式利用起来总结为以下概率公式, d E dE dE表示新值减旧值得到的状态差,假定温度 T T T短时间不变化(不重要)
在这里插入图片描述
摆脱掉温度的干扰,找最优解的公式中,上面公式理解为:若函数上的y值变化为新的y值后变小了,则以概率为1的可能性,朝这个方向走,反之,可以一种随机概率其他方向走,就好比周志华《机器学习》中摇臂机问题要以 ϵ \epsilon ϵ的概率探索一样向其他方向走。
特别说明:重要的是思想,公式并不重要,上面的概率函数完全可以改用其他函数,温度衰减过程也可以用其他方式代替。

代码流程

代码由于是采用的是2维函数,方向单一所以比较简单:

import numpy as np
import matplotlib.pyplot as plt
#1、假设一个多项式为误差函数,需要找最优点
def Y(x):
    return (x - 2) * (x - 4) *(x+7)* (x + 11) * (x - 9)
    
#2、[-12,10]选随机选一个点做起始点
X=np.random.uniform(-12,10)
#-------下面注释由于最后跟温度没有关系,只需要最终的点,所以不需要两个循环
T=1000#表示初始温度
#Tend=1#表示最后温度,温度越低降温速率越低
# while T>Tend:
#     for i in range(20):
#         print(X)
#         oldY=Y(X)
#         preX=X+np.random.uniform(-1,1)
#         if preX>-12 and preX<10:
#           if Y(preX)<oldY:
#                X=preX
#           else:
#                if np.random.rand()>np.exp(-(Y(preX)-oldY)/T):
#                   X=preX
    # t+=1
    # T=1000/t
#--------------------------------------------------------------------------------
for i in range(200):
    oldY=Y(X)#记录旧点
    preX=X+np.random.uniform(-1,1)#随机选择邻域
    if preX>-12 and preX<10:#验证可能的新点在区间
      if Y(preX)<oldY:#按Metropolis准则
           X=preX
      else:
           if np.random.rand()>np.exp(-(Y(preX)-oldY)/T):#这个过程表示以一定的概率选择其他方向
              X=preX
              T+=0.95*T#衰减不一定按上面的函数来
print(X)
print(Y(X))
#!!!完
#下面是绘图,看效果,明显可以看到最优值,不是每次都能选到最优值
x=np.linspace(-12,10,100)
y=[Y(x) for x in x]
#图的操作
plt.plot(x,y,color='b')
gc=plt.gca()
gc.spines['top'].set_color(None)
gc.spines['right'].set_color(None)
gc.spines['left'].set_position(('data',0))
gc.spines['bottom'].set_position(('data',0))
plt.plot(X,Y(X),'or')
plt.show()

注意:不是每次都能选到最优值,所以需要取多次结果,取最小值,找最大值,把条件反过来写即可
在这里插入图片描述
[1]:https://www.cnblogs.com/ECJTUACM-873284962/p/8468831.html
[2]:https://blog.youkuaiyun.com/weixin_40562999/article/details/80853418
[3]:https://www.imooc.com/article/details/id/30160

<think>好的,用户想了解改进的模拟退火算法(SA)的实现方法。首先,我需要回忆一下标准SA的基本原理,然后思考有哪些常见的改进策略。根据之前的知识,SA通过接受较差解来避免局部最优,但改进版可能会在降温策略、邻域搜索、接受概率等方面进行优化。 接下来,我要参考用户提供的引用内容。引用[1]提到SA是一种贪心算法,引入随机因素,接受差解的概率帮助跳出局部最优。引用[3]详细说明了SA的基本步骤,包括初始化解、生成新解、计算代价、概率接受和降温。引用[4]提到Python和MATLAB的实现案例,可能涉及算法步骤的调整。 用户需要的是改进方法,所以应该列举不同的优化方向。比如,降温计划、自适应参数调整、混合算法、邻域搜索策略等。每个改进点需要简要说明原理,并给出具体的实现方式或公式,可能需要使用LaTeX格式。 还要考虑用户可能需要相关的问题,比如不同改进方法的比较,如何选择参数,应用案例等。需要生成相关问题,帮助用户进一步探索。 需要确保回答结构清晰,分点说明,每个改进方法有子点,例如调整降温策略下再分指数降温、对数降温等。同时,代码示例可能帮助理解,但用户的问题更偏向方法而非代码,所以可能不需要详细代码,但可以提实现要点,如引用中的例子。 检查是否有遗漏的重要改进方法,比如并行SA、记忆功能(如保留历史最优解),或者与其他算法结合,如遗传算法。引用[2]提到几何方法虽稳健但收敛慢,可能改进收敛速度的方法也是一个点。 最后,确保回答使用中文,数学公式正确用$...$和$$...$$,引用标识正确添加,如降温公式后的引用[3]。生成的相关问题要围绕改进SA的不同方面,帮助用户深入思考。</think>### 改进的模拟退火算法实现优化方法 改进的模拟退火算法主要在**降温策略、邻域搜索、接受准则**三个核心环节进行优化,以下是具体方法及实现要点: --- #### 一、动态调整降温策略 1. **指数降温改进** 标准降温公式为 $T_k = T_0 \cdot \alpha^k$,改进后引入自适应系数: $$ T_k = \frac{T_0}{\ln(1+k)} \cdot \beta $$ 其中 $\beta$ 根据当前解的接受率动态调整[^3]。 2. **分段降温法** 将降温过程分为**探索阶段**(高温区,接受差解概率高)和**开发阶段**(低温区,专注局部优化),例如: $$ T_k = \begin{cases} T_0/(1+k) & k < N/2 \\ T_0/(1+k^2) & k \geq N/2 \end{cases} $$ --- #### 二、邻域搜索优化 1. **变步长搜索** 高温时采用大范围随机扰动(如 $x' = x + \Delta \cdot U(-1,1)$),低温时缩小扰动幅度 $\Delta = \Delta_0 \cdot T_k$[^4]。 2. **方向性搜索** 结合梯度信息生成新解(适用于连续优化问题): $$ x' = x - \eta \nabla f(x) + \sqrt{T_k} \cdot \xi $$ 其中 $\xi \sim N(0,1)$,实现梯度下降与随机扰动的平衡[^2]。 --- #### 三、接受准则改进 1. **自适应Metropolis准则** 将接受概率公式改进为: $$ P = \min\left(1, \exp\left(-\frac{\Delta f}{T_k + \delta}\right)\right) $$ 其中 $\delta$ 为当前解的方差,避免低温区过早陷入局部最优[^1]。 2. **精英保留策略** 始终保留历史最优解,即使当前迭代解质量下降。 --- #### 四、混合算法设计 1. **SA与遗传算法融合** 在SA迭代中嵌入交叉、变异操作,种群更新公式: $$ x_{\text{new}} = \text{Mutation}(\text{Crossover}(x_{\text{best}}, x_{\text{current}})) $$ 2. **SA与禁忌搜索结合** 使用禁忌列表记录近期访问的解,避免重复搜索。 --- #### 五、实现示例(Python关键代码) ```python def adaptive_SA(): T = T0 best_solution = current_solution = initialize() while T > T_min: # 变步长邻域搜索 step = max_step * T / T0 new_solution = current_solution + np.random.uniform(-step, step) # 自适应接受概率 delta_E = energy(new) - energy(current) accept_prob = math.exp(-delta_E / (T + delta_E**2)) if accept_prob > random.random(): current_solution = new_solution if energy(new) < energy(best): best_solution = new_solution # 分段降温 if iteration < total_iter//2: T = T0 * 0.95**iteration else: T = T0 / (1 + iteration) ``` ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值