1. 模拟退火算法认识
爬山算法也是一个用来求解最优化问题的算法,每次都向着当前上升最快的方向往上爬,但是初始化不同可能会得到不同的局部最优值,模拟退火算法就可能跳出这种局部最优解的限制。模拟退火算法是模拟热力学系统中的退火过程。在退火过程中是将目标函数作为能量函数。大致过程如下
初始高温 => 温度缓慢下降=> 终止在低温 (这时能量函数达到最小,目标函数最小)
在热力学中的退火过程大致是变温物体缓慢降温而达到分子之间能量最低的状态。设热力学系统S中有有限个且离散的n个状态,状态的能量为,在温度下,经过一段时间达到热平衡,这时处于状态的概率为
模拟退火算法也是贪心算法,但是在其过程中引入了随机因素,以一定的概率接受一个比当前解要差的解,并且这个概率随着时间的推移而逐渐降低。
2. 模拟退火算法描述
若,即移动后得到更优的解,那么总是接受改移动。
若,即移动后得到更差的解,则以一定的概率接受该移动,并且这个概率随时间推移逐渐降低。这个概率表示为
由于是退火过程,所以dE < 0,这个公式说明了温度越高出现一次能量差为dE的降温概率就越大,温度越低,出现降温的概率就越小,由于dE总是小于0,所以P(dE)取值在0到1之间。伪码如下
3. 工程应用
工程应用的一个例子:我们把物资编号成图1种那样,求物资卸载的时间,就可以用模拟退火算法,具体可以见程序的。
#模拟退火算法
def Anneal():
AnnealPe = [] # 生成一个个体
AnnealPeTemp = []
for i in range(rNum):
AnnealPe.append(i)
AnnealPeTemp.append(i)
random.shuffle(AnnealPeTemp)# 生成一个随机的个体
T = 1000
TMin = 0.1
while T > TMin:
dE = decodPe(AnnealPe) - decodPe(AnnealPeTemp)
if(dE >= 0):
for i in range(rNum):
AnnealPe[i] = AnnealPeTemp[i]
else:
a = math.e**(dE/T)
if(math.e**(dE/T)) > random.random():
for i in range(rNum):
AnnealPe[i] = AnnealPeTemp[i]
T = 0.9999 * T
selectNum0 = 0
selectNum1 = 0
selectNum0 = random.randint(0, rNum - 1)
selectNum1 = random.randint(0, rNum - 1)
# 交换两个变异的
amongNum = AnnealPeTemp[selectNum0]
AnnealPeTemp[selectNum0] = AnnealPeTemp[selectNum1]
AnnealPeTemp[selectNum1] = amongNum
return (decodPe(AnnealPe))