英文名:Simulated annealing(刺激·退火)
一個(gè)沒有“下坡”的爬山算法是不完全的,因?yàn)槲覀兛梢灶A(yù)見它會(huì)掐在半山腰(局部最大值)。一個(gè)完全隨機(jī)的爬山算法,正相反,它是完全的但是極端低效。所以,我們的目標(biāo)就是開發(fā)一種在某些方面采用隨機(jī)性,但又保證完全和高效的算法。
模擬退火就是這樣一種兩者兼得的算法。退火(不是回火),作為一種金屬處理工藝,就是說(shuō)把金屬或玻璃加熱到高溫后,逐漸降溫,到達(dá)低能結(jié)晶態(tài),用來(lái)加強(qiáng)硬度的方法。
具體來(lái)講,我們?cè)诔跏紩r(shí)給定一個(gè)溫度函數(shù),然后讓這個(gè)溫度函數(shù)隨著時(shí)間(aka迭代數(shù))慢慢降低。我們也從當(dāng)前狀態(tài)的子狀態(tài)中隨機(jī)抽取一個(gè),如果這個(gè)子狀態(tài)把我們引向更高處,則它取代當(dāng)前狀態(tài),繼續(xù)迭代;如果子狀態(tài)是個(gè)下坡,有一定幾率我們?nèi)匀挥盟〈?dāng)前狀態(tài)。下坡越大,幾率越??;溫度越高,幾率越大。
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)