模拟退火

薛定谔了么
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.总结:尾声

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

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


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

396
0
0
0
关于作者
相关文章
  • 量子退火Python实战:护士调度问题(NSP : Nurse Scheduling Pro ...
    调度就是人和机器的调度和排序。由于许多人的日程安排相互交织,还要考虑机器的运行状态等因素, ...
    了解详情 
  • 背包问题全解指南:从0-1背包到完全背包,动态规划实现与优化 ...
    了解详情 
  • 模拟退火算法求解 0-1 背包问题
    背包问题的目标是在给定物品和约束条件下,选择一定的物品,使得它们的总价值最大,同时满足总重 ...
    了解详情 
在本版发帖返回顶部
快速回复 返回顶部 返回列表
玻色有奖小调研
填写问卷,将免费赠送您5个100bit真机配额
(单选) 您是从哪个渠道得知我们的?*
您是从哪个社交媒体得知我们的?*
您是通过哪个学校的校园宣讲得知我们的呢?
取消

提交成功

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