结合以上对金属退火的描以及他与数学的联系,我们可以举例简单说明模拟退火在解决数学问题中的效果。假设某最大化问题,我们给出一个初始解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
#播报结果
模拟退火是一场概率的游戏,运行前期温度高,接受其他解的概率大,更有机会跳出局部最优解,而在温度降低的过程中接近最优解。
正如人生一样,年轻时不要陷入自己的舒适区,要在尚有活力的年华勇敢闯一闯,多学习多拼搏,运行前期温度高,接受其他解的概率大,更有机会跳出局部最优解,而在温度降低的过程中接近最优解。