超简单易懂的模拟退火算法原理(含Python代码)

在介绍模拟退火算法之前,我们先认识一下爬山算法
在爬山法寻找最优值的过程中,先随机生成一个点,计算其适应度值f(x),然后再其左领域和右领域中依照步长各选取一个点计算其适应度值f(xleft),f(xright),比较其三者,将适应度最大值点作为下一次迭代的初始点,直至寻找到最大值点。

爬山算法是一种典型的贪婪算法是一种狭隘的没有顾及全局的算法,如图所示在使用爬山算法寻找最大值时容易陷入局部最优。
在这里插入图片描述
模拟退火算法原理
本文力求通俗易懂,故不在讲述物理层次的原理,我们回到爬山算法,爬山算法有一个非常重大的缺陷是容易陷入局部最优,并且陷入局部最优之后不能跳出。造成这样一种现象的原因是在每一次迭代中,我们采用贪婪的思想,只采用了最大值。
在这里插入图片描述
如图所示:按照爬山法的原理f(x)>f(xleft),所以将f(x)作为下一次迭代初值,而舍弃了可能更靠近全局最优值的f(xleft)。
所以引申出了一个议题:当左领域或者右领域的适应度值小于本身的适应度值,我们是否应该尝试去以一定的概率接受它来做下一次迭代的初值。

那么这个一定概率(p)到底是怎么计算的呢,按照咱们一般人的思维,当然是差距越小,咱们越容易去接受它。差距在函数寻找最优值的时候便体现在了距离上,即 | f(x)-f(xleft) | 也就是说这个概率是与这个距离成反比的,距离越大,接受的概率就越小。用数学的语言表达:
在这里插入图片描述
问题又来了,这个p既然是一个概率,那他也应该有个取值范围 [0,1] 这说明刚刚上式不能完全作为p的计算公式,那么在我们印象中有哪些函数的值域刚好是在[0,1]内,很多人可能想到sigmod。也有人想到arctan值域是在[-pi/2,pi/2],由于距离加了绝对值所以取值是在[0,pi/2],最后除以pi/2即可完成归一化。这些想法都是不错的,但是有一条更简单的曲线,它就是e^(-x);图像如图:
在这里插入图片描述
那么结合距离和该函数图像就能合理的假设出
在这里插入图片描述
在这里,为什么不是倒数了是我们要保证距离和概率p要成负相关。

概率函数设计完毕工作到此似乎完成了,但是科学是严谨的。我们考虑一下现实,模拟退火算法模拟的是一种退温过程,我那稀薄的物理知识告诉我,分子在高温的情况下运动是非常剧烈的,在温度逐渐下降的过程中运动逐渐减缓并趋于稳定。

视角转移到算法这里,运动剧烈意味着我们更容易跳到其他地方搜索最优解,也就是在温度高的时候我们更容易接受其他解,可以合理的得到推论:概率p和温度成正相关,不妨设函数C(t)。此处记 | f(x)-f(xleft) | =△f。概率p公式可表现为:
在这里插入图片描述
其中C(t)是随着温度递减的函数。

到了这里终究还是逃不过物理范畴。因为的C(t)的选择是在太多了,哪一个才是合适的。在1995年Metropolis提出了一个重要的采样性方法,即设当前状态i生成新状态j,若新状态的内能小于状态i的内能即(Ej<Ei),则接受新状态j作为新的当前状态,否则以概率e^-[(Ej-Ei)/kT]接受状态j,其中k为玻尔兹曼(Boltzmann)常数模拟退火算法正是借用了这种思想将内能改变成为函数的适应度值即△E换成△f,得到了我们现在看到的概率p公式:
在这里插入图片描述
对这个准则有兴趣的话可以去查阅相关文献资料进行了解。博主微薄的物理知识实在是理解不了怎么得出的公式。

概率计算到此告一段落。既然是模拟退火算法,那温度变化必然是不可少的,且温度的变化应是随着时间而且减小的。下面介绍三种常用降温方式:
(1)T(k+1) =αT(k) 简易模拟退火算法

(2)T(k) = t0 /lg(1+k) 经典模拟退火算法

(3)T(k)= t0/(1+k) 快速模拟退火算法

算法流程
在这里插入图片描述

import math
from random import random
import matplotlib.pyplot as plt

def func(x, y):            
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值