英文名:Simulated annealing(刺激·退火)
一个没有“下坡”的爬山算法是不完全的,因为我们可以预见它会掐在半山腰(局部最大值)。一个完全随机的爬山算法,正相反,它是完全的但是极端低效。所以,我们的目标就是开发一种在某些方面采用随机性,但又保证完全和高效的算法。
模拟退火就是这样一种两者兼得的算法。退火(不是回火),作为一种金属处理工艺,就是说把金属或玻璃加热到高温后,逐渐降温,到达低能结晶态,用来加强硬度的方法。
具体来讲,我们在初始时给定一个温度函数,然后让这个温度函数随着时间(aka迭代数)慢慢降低。我们也从当前状态的子状态中随机抽取一个,如果这个子状态把我们引向更高处,则它取代当前状态,继续迭代;如果子状态是个下坡,有一定几率我们仍然用它取代当前状态。下坡越大,几率越小;温度越高,几率越大。
def Simulated-Annealing(problem, schedule) returns a solution state
current = Make-Node(problem.initial_state)
for t in range(1,+infinity):
T = schedule(t)
if T = 0: return current
next = random-successor(current)
delta = next.value - current.value
if delta > 0: current = next
else: current = next, with probability exp(delta/T)