模拟退火

薛定谔了么
2025-01-23 11:33:58
运筹优化
算法解析


1.前言:启发式算法


模拟退火算法是一个经典的启发式算法,也被称为智能算法。他们不是数学,而是含有更贴合人类解决实际问题思想的方法。因此某类启发式算法,也只能针对解决特定的问题。而想要从数学的角度去解决普适的数学问题,那只能依靠精确求解算法了。


但相比与在解空间中各种操作的精确求解算法,启发式算法更加简单易懂,适合初学者理解数值计算方法。


经典的启发式算法包括:模拟退火、遗传算法,粒子群算法,蚁群算法,禁忌搜索。今天介绍模拟退火算法的原理及python应用


2.退火:锻造的智慧


退火是一种金属热处理工艺,指的是将金属缓慢加热到一定温度,保持足够时间,然后以适宜速度冷却。广义上说,退火是一种对材料的热处理工艺。(From:百度百科)


而退火的目的是为了让金属材料拥有更好的韧性,为后续加工做准备。



在固体升温时,内能增大,分子运动加剧,在高温时,金属原子有更大的“活力”运动到更“优势”的位置,随着温度的降低,这种“活力”将下降,不过温度依旧较高,原子仍然有可能会向其他位置尝试运动,哪怕这个位置的“优势”不比之前,随着温度越来越低,这种“活力”也会下降,最终原子会在他们认为最优的地方停留。相比于锻造之前,金属内部原子的位置进行了优化。


在数学问题中,退火的思想可以避免我们陷入局部最优,从而有一定概率迈向全局最优。







3.模拟退火的效果与目的



















结合以上对金属退火的描以及他与数学的联系,我们可以举例简单说明模拟退火在解决数学问题中的效果。假设某最大化问题,我们给出一个初始解x0,其对应值y0



在基本的对领域搜索的思想上,期望得到值更大的解。


具体操作如下:


(1)在向左或向右的邻域中移动初始解x0,得到x1


(2)计算x1对应函数值y1,比较y1与y0的值


(3)若y1>y0,则更新x1为当前解,否则不更新


重复以上步骤,在若干次迭代后,可以获得较优的解,但是很明显,在基本的邻域搜索思想下,我们很容易会在某个较优的地方停留,而无法达到全局最优。



此时,模拟退火就可以发挥作用:正如金属原子在高温“活力”较大时愿意向其他未必“优势”的位置尝试移动一样,我们也希望数学问题中解在局部最优时仍然会在邻域中搜索其他解。从而有一定概率,找到更优的解,而跳出局部最优。



此时,模拟退火就可以发挥作用:正如金属原子在高温“活力”较大时愿意向其他未必“优势”的位置尝试移动一样,我们也希望数学问题中解在局部最优时仍然会在邻域中搜索其他解。从而有一定概率,找到更优的解(如x7),而跳出局部最优。


当然,这种“活力”也不能一直保持,否则有可能解达到最优后仍然会在邻域中搜索,从而错过最优。(如x10


这是一场赌博。而数学模型可以满足这种需求


 


4.模拟退火的数学原理


在用数学描述模拟退火之前,我们先简单梳理一下基本需求:


(1)如果当前解较上次迭代解解更优,则更新解为当前解


(2)在高温时,如果当前解的质量没有上次迭代解更优,也有很大概率会更新解为当前解


(3)在高温时,如果当前解的质量没有上次迭代解更优,则更新概率极低


为了实现以上需求,得到了如下模型,以实现模拟退火。



这里p为更新解的概率,以最大化问题为例,毫无疑问,当当前解的质量更优时,会更新解为当前解。符合需求1。


结合e**x的图像我们可以发现,当温度T较高时,即使f(n+1)<f(n),既当前解质量不如上次迭代解时,仍然有很大概率会更新解为当前解。符合需求2。但是当温度T较低时,这一概率将会趋近于0,而避免错过最优,符合需求3。



5.应用


旅行商问题(Traveling Salesman Problem, TSP)是一个经典的组合优化问题,目标是找到一条访问所有城市并返回起点的最短路径。由于TSP是一个NP-hard问题,通常使用启发式算法或近似算法来解决。



我们给定城市坐标,随机城市访问顺序序列得到初始解,通过交替序列中n个元素实现对初始解邻域的搜索,结合模拟退火的思想进行迭代。具体算法流程如下。



设置最大迭代次数N=100,最低温度T=0.1,初始温度T=1000000,迭代57次得到最优解。




算法核心代码部分如下。


#模拟退火循环
now_iteration=1#初始化迭代次数
max_iteration=100#最大迭代次数
temperature=1000000#初始温度
min_temperature=0.1#最小温度
path_list=[path]
distance_list=[distance]

while now_iteration<=max_iteration and temperature>min_temperature:
    path_update = copy.deepcopy(path)
    # 进行路径解的邻域搜索 每次替换三个解元素
    path_update = Get_test_path(path_update, 3)
    # 计算邻域搜索后的值
    distance_update = path_distance(path_update, distance_matrix)
    # 模拟退火判断是否接受
    change_update=0#初始化概率
    if distance_update<distance:
change_update=1
    else:change_update=math.e**((distance-distance_update)/(1*temperature))#模拟退火核心函数
    #随机生成一个0-1之间的数代表接受的可能性
    update_value = random.random()
    if update_value<=change_update:
        path=path_update
        distance=distance_update
    else:
        path=path
        distance=distance
    #记录结果
    path_list.append(path)
    distance_list.append(distance)
    #更新温度与迭代次数
    print("迭代次数:{}".format(now_iteration))
    print("当前温度:{}".format(temperature))
    print("当前最优路径:{}".format(path))
    print("当前最优值:{}".format(distance))
    now_iteration=now_iteration+1
    temperature=0.75*temperature
    #播报结果






6.总结:尾声














模拟退火是一场概率的游戏,运行前期温度高,接受其他解的概率大,更有机会跳出局部最优解,而在温度降低的过程中接近最优解。


正如人生一样,年轻时不要陷入自己的舒适区,要在尚有活力的年华勇敢闯一闯,多学习多拼搏,运行前期温度高,接受其他解的概率大,更有机会跳出局部最优解,而在温度降低的过程中接近最优解。









本文转载自微信公众号:平潮的奇妙星球 















654
0
0
0
关于作者
相关文章
  • 页岩孔隙“显微镜”升级:生成对抗网络让油气储层观测精度提升8 ...
    中国石油大学(华东)团队在《石油勘探与开发》2025年5期发表《 基于生成对抗网络的页岩孔隙结构 ...
    了解详情 
  • 稀疏去噪模型salad:高效灵活的超长链蛋白质结构生成新方法 ...
    2025年发表于《Nature Machine Intelligence》的研究,提出稀疏去噪模型salad(sparse all-atom ...
    了解详情 
  • LSTM+KNN的金融时间序列预测
     今天的案例是:STM-KNN融合模型在金融时间序列预测中的应用。当你在预测股票价格的变化。 ...
    了解详情 
  • 量子计算,离我们普通人还有多远?
    量子计算,正经历一场攸关存亡的“实用主义”转向。全球知名前沿科技咨询机构ICV在《2 ...
    了解详情 
  • 突破长短期记忆网络——LSTM与ARIMA结合的时间序列预测原理 ...
    时间序列数据具有时间依赖性与趋势性,因此需要结合不同的建模方法来捕捉其特性。传统的时间序列 ...
    了解详情 
联系我们
二维码
在本版发帖返回顶部
快速回复 返回顶部 返回列表
玻色有奖小调研
填写问卷,将免费赠送您5个100bit真机配额
(单选) 您是从哪个渠道得知我们的?*
您是从哪个社交媒体得知我们的?*
您是通过哪个学校的校园宣讲得知我们的呢?
取消

提交成功

真机配额已发放到您的账户,可前往【云平台】查看

量子AI开发者认证

考核目标

开发者能够成功搭建Kaiwu-PyTorch-Plugin项目基础环境,并成功运行QBM-VAE示例代码,根据系统提供的随机seed值,求出正确的FID值。

通过奖励

10个一年效期的550量子比特真机配额

专属「量子AI开发者」社区认证标识

开发者权益

每月固定权益:5个550量子比特真机配额
前往考核

第一步

按照README提示成功安装Kaiwu-PyTorch-Plugin库环境依赖
前往GitHub

第二步

替换seed值

您的seed值为

第三步

输入您计算的FID值

*

提交答案

开发者权益

每月固定权益:5个550量子比特的真机配额

恭喜您完成考核

您将获得量子AI开发者认证标识及考核奖励

550bit*10

配额