深度學習經典算法 | 模擬退火算法詳解

2021-01-17 計算機視覺CV
模擬退火算法基本思想

現代的模擬退火算法形成於20世紀80年代初,其思想源於固體的退火過程,即將固體加熱至足夠高的溫度,再緩慢冷卻。升溫時,固體內部粒子隨溫度升高變為無序狀,內能增大,而緩慢冷卻時粒子又逐漸趨於有序,從理論上講,如果冷卻過程足夠緩慢,那麼冷卻中任一溫度時固體都能達到熱平衡,而冷卻到低溫時將達到這一低溫下的內能最小狀態。

在這一過程中, 任一恆定溫度都能達到熱平衡是個重要步驟, 這一點可以用MonteCarlo算法模擬,不過其需要大量採樣,工作量很大。但因為物理系統總是趨向於能量最低,而分子熱運動則趨向於破壞這種低能量的狀態,故而只需著重取貢獻比較大的狀態即可達到比較好的效果, 因而1953年Metropolis提出了這樣一個重要性採樣的方法, 即設從當前狀態i生成新狀態j.若新狀態的內能小於狀態i的內能(即Ej<Ei),則接受新狀態j作為新的當前狀態;否則,以概率

1953年, Kirkpatrick把模擬退火思想與組合最優化的相似點進行類比, 將模擬退火應用到了組合最優化問題中,在把模擬退火算法應用於最優化問題時,一般可以將溫度T當做控制參數,目標函數值f視為內能E,而固體在某溫度T時的一個狀態對應一個解

其他一些參數的說明

退火過程由一組初始參數, 即冷卻進度表(cooling schedule) 控制, 它的核心是儘量使系統達到準平衡,以使算法在有限的時間內逼近最優解。冷卻進度表包括:

②控制參數T的衰減函數:因計算機能夠處理的都是離散數據,因此需要把連續的降溫過程離散化成降溫過程中的一系列溫度點,衰減函數即計算這一系列溫度的表達式。④Markov鏈的長度L.:任一溫度T的迭代次數。算法基本步驟

①令T=T。,即開始退火的初始溫度,隨機生成一個初始解工,並計算相應的目標函數值E(x0)。

②令T等於冷卻進度表中的下一個值Ti。

③根據當前

④若△E<0,則新解

⑤在溫度

⑥判斷T是否已到達

算法實質分兩層循環,在任一溫度隨機擾動產生新解,並計算目標函數值的變化,決定是否被接受。由於算法初始溫度比較高,這樣,使E增大的新解在初始時也可能被接受.因而能跳出局部極小值,然後通過緩慢地降低溫度,算法就最終可能收斂到全局最優解。還有一點要說明的是,雖然在低溫時接受函數已經非常小了,但仍不排除有接受更差的解的可能,因此一般都會把退火過程中碰到的最好的可行解(歷史最優解)也記錄下來,與終止算法前最後一個被接受解一併輸出。

幾點說明

為了更好地實現模擬退火算法,還需要注意以下一些方面。

狀態表達

上文已經提到過,SA算法中優化問題的一個解模擬了(或說可以想像為)退火過程中固體內部的一種粒子分布情況。這裡狀態表達即指實際問題的解(即狀態)如何以一種合適的數學形式被表達出來,它應當適用於SA的求解、又能充分表達實際問題,這需要仔細地設計。可以參考遺傳算法和禁忌搜索中編碼的相關內容。常見的表達方式有:背包問題和指派問題的0-1編碼, TSP問題和調度問題的自然數編碼:還有用於連續函數優化的實數編碼等。

新解的產生

新解產生機制的基本要求是能夠儘量遍及解空間的各個區域,這樣、在某一恆定溫度不斷產生新解時,就可能跳出當前區域的極小以搜索其他區域,這是模擬退火算法能夠進行廣域搜索的一個重要條件。

收斂的一般性條件

收斂到全局最優的一般性條件是:

④降溫過程足夠緩慢。但上述條件在應用中很難同時滿足。參數的選擇(1)控制參數T的初值T。

求解全局優化問題的隨機搜索算法一般都採用大範圍的粗略搜索與局部的精細搜索相結合的搜索策略。只有在初始的大範圍搜索階段找到全局最優解所在的區域,才能逐漸縮小搜索的範圍.最終求出全局最優解。模擬退火算法是通過控制參數T的初值T。和其衰減變化過程來實現大範圍的粗略搜索和局部精細搜索。

一般來說,只有足夠大的T。才能滿足算法要求(但對不同的問題「足夠大」的含義也不同,有的可能T。=100就可以,有的則要1010)。在問題規模較大時,過小的T。往往導致算法難以跳出局部陷阱而達不到全局最優。但為了減少計算量,T。不宜取得過大,而應與其他參數折中選取。

(2)控制參數T的衰減函數

衰減函數可以有多種形式,一個常用的衰減函數是

其中.a是一個常數,可以取為0.5~0.99,它的取值決定了降溫的過程。小的衰減量可能導致算法進程迭代次數的增加,從而使算法進程接受更多的變換,訪問更多的鄰域,搜索更大範圍的解空間,返回更好的最終解。同時由於在

(3) Markov鏈長度

Markov鏈長度的選取原則是:在控制參數T的衰減函數已選定的前提下, 

算法停止準則:對Metropolis準則中的接受函數

Python實現

函數:

import numpy as np
import matplotlib.pyplot as plt
import random

class SA(object):

def __init__(self, interval, tab='min', T_max=10000, T_min=1, iterMax=1000, rate=0.95):
self.interval = interval # 給定狀態空間 - 即待求解空間
self.T_max = T_max # 初始退火溫度 - 溫度上限
self.T_min = T_min # 截止退火溫度 - 溫度下限
self.iterMax = iterMax # 定溫內部迭代次數
self.rate = rate # 退火降溫速度
#############################################################
self.x_seed = random.uniform(interval[0], interval[1]) # 解空間內的種子
self.tab = tab.strip() # 求解最大值還是最小值的標籤: 'min' - 最小值;'max' - 最大值
#############################################################
self.solve() # 完成主體的求解過程
self.display() # 數據可視化展示

def solve(self):
temp = 'deal_' + self.tab # 採用反射方法提取對應的函數
if hasattr(self, temp):
deal = getattr(self, temp)
else:
exit('>>>tab標籤傳參有誤:"min"|"max"<<<')
x1 = self.x_seed
T = self.T_max
while T >= self.T_min:
for i in range(self.iterMax):
f1 = self.func(x1)
delta_x = random.random() * 2 - 1
if x1 + delta_x >= self.interval[0] and x1 + delta_x <= self.interval[1]: # 將隨機解束縛在給定狀態空間內
x2 = x1 + delta_x
else:
x2 = x1 - delta_x
f2 = self.func(x2)
delta_f = f2 - f1
x1 = deal(x1, x2, delta_f, T)
T *= self.rate
self.x_solu = x1 # 提取最終退火解

def func(self, x): # 狀態產生函數 - 即待求解函數
value = np.sin(x**2) * (x**2 - 5*x)
return value

def p_min(self, delta, T): # 計算最小值時,容忍解的狀態遷移概率
probability = np.exp(-delta/T)
return probability

def p_max(self, delta, T):
probability = np.exp(delta/T) # 計算最大值時,容忍解的狀態遷移概率
return probability

def deal_min(self, x1, x2, delta, T):
if delta < 0: # 更優解
return x2
else: # 容忍解
P = self.p_min(delta, T)
if P > random.random(): return x2
else: return x1

def deal_max(self, x1, x2, delta, T):
if delta > 0: # 更優解
return x2
else: # 容忍解
P = self.p_max(delta, T)
if P > random.random(): return x2
else: return x1

def display(self):
print('seed: {}\nsolution: {}'.format(self.x_seed, self.x_solu))
plt.figure(figsize=(6, 4))
x = np.linspace(self.interval[0], self.interval[1], 300)
y = self.func(x)
plt.plot(x, y, 'g-', label='function')
plt.plot(self.x_seed, self.func(self.x_seed), 'bo', label='seed')
plt.plot(self.x_solu, self.func(self.x_solu), 'r*', label='solution')
plt.title('solution = {}'.format(self.x_solu))
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.savefig('SA.png', dpi=500)
plt.show()
plt.close()


if __name__ == '__main__':
SA([-5, 5], 'max')

結果展示參考文獻

《matlab在數學建模中的應用》

相關焦點

  • 經典算法—模擬退火算法
  • 模擬退火算法詳解
    2.模擬退火算法機制模擬退火算法(Simulated Annealing,SA)最早的思想是由N. Metropolis等人於1953年提出。1983年,S. Kirkpatrick等成功地將退火思想引入到組合優化領域。
  • 模擬退火算法
    模擬退火算法作為一種通用的隨機搜索算法,現已廣泛用於VLSI設計、圖像識別和神經網計算機的研究。模擬退火算法的應用如下:1、模擬退火算法在VLSI設計中的應用利用模擬退火算法進行VLSI的最優設計,是目前模擬退火算法最成功的應用實例之一。用模擬退火算法幾乎可以很好地完成所有優化的VLSI設計工作。如全局布線、布板、布局和邏輯最小化等等。
  • 圖解退火算法(模擬退火算法內核講解)
    回顧上兩期,我們已經了解了遺傳算法和粒子群算法,這都是常用的智能優化算法,所謂智能優化算法又稱現代啟發式算法,是一種具有全局優化性能
  • MATLAB優化算法實例——模擬退火算法
    ——工科男❞1 模擬退火算法基本理論上期文章介紹MATLAB算法——遺傳算法,本章介紹模擬退火法及實例應用。MATLAB優化算法實例——遺傳算法1.1 簡介模擬退火算法(Simulated Annealing Algorithm)是一種隨機類全局優化方法。它來源於熱力學中固體物質的退火冷卻過程。
  • 優化算法系列之模擬退火算法(1)
    模擬退火算法是所謂三大非經典算法之一,它脫胎於自然界的物理過程,與優化問題相結合。在百度百科上對於模擬退火算法的定義是:模擬退火算法來源於固體退火原理,是一種基於概率的算法,將固體加溫至充分高,再讓其徐徐冷卻,加溫時,固體內部粒子隨溫升變為無序狀,內能增大,而徐徐冷卻時粒子漸趨有序,在每個溫度都達到平衡態,最後在常溫時達到基態,內能減為最小。
  • 模擬退火算法簡介
    模擬退火其實也是一種貪心算法,但是它的搜索過程引入了隨機因素。模擬退火算法以一定的概率來接受一個比當前解要差的解,因此有可能會跳出這個局部的最優解,達到全局的最優解。以上圖為例,模擬退火算法在搜索到局部最優解B後,會以一定的概率接受到C的移動。也許經過幾次這樣的不是局部最優的移動後會到達D點,於是就跳出了局部最大值A。
  • 大白話解析模擬退火算法
    模擬退火(SA,Simulated Annealing)思想爬山法是完完全全的貪心法,每次都鼠目寸光的選擇一個當前最優解,因此只能搜索到局部的最優值。模擬退火其實也是一種貪心算法,但是它的搜索過程引入了隨機因素。模擬退火算法以一定的概率來接受一個比當前解要差的解,因此有可能會跳出這個局部的最優解,達到全局的最優解。
  • 模擬退火算法(附代碼)
    上一篇我們講了旅行商問題及遺傳算法來解決此類問題:遺傳算法(附代碼)今天介紹另外一種解決此類NP問題的方法是模擬退火算法(
  • 美賽常用六種算法第二期——模擬退火算法
    模擬退火算法包含兩個部分即Metropolis算法和退火過程。Metropolis算法就是如何在局部最優解的情況下讓其跳出來,是退火的基礎。1953年Metropolis提出重要性採樣方法,即以概率來接受新狀態,而不是使用完全確定的規則,稱為Metropolis準則,計算量較低。
  • 模擬退火遺傳算法在多用戶檢測技術中的應用
    它模擬自然界中的生命進化機制,在人工系統中實現特定目標的優化。實踐證明,遺傳算法對於NP問題非常有效[8],但是它容易陷入局部最優,即全局搜索能力弱。1.2 模擬退火算法模擬退火算法(SA)是基於金屬退火的機理而建立起來的一種隨機算法。
  • 基於模擬退火算法的地面電視頻率指配方法研究
    美國聯邦通信委員會(FCC)於1996年著手研究全境的地面數位電視覆蓋網頻率規劃問題,通過使用"模擬退火"算法和開發相應的規劃軟體,完成了美國的模數過渡方案。該算法的應用降低了美國模擬向數字過渡期間的轉換成本,提高了頻率資源的使用效率,並帶來了巨大的商業效益。  我國地面電視業務可用的頻道數量共有48個,指配給了數量眾多的模擬發射機,承擔著公共服務和各地節目的播出任務。
  • 模擬退火(Simulated Annealing, SA)算法簡介與MATLAB實現
    模擬退火算法(Simulated Annealing,簡稱SA)的思想最早是由Metropolis等提出的。其出發點是基於物理中固體物質的退火過程與一般的組合優化問題之間的相似性。模擬退火法是一種通用的優化算法,其物理退火過程由以下三部分組成:加溫過程。其目的是增強粒子的熱運動,使其偏離平衡位置。
  • 基於模擬退火法的旅行商問題
    二、模擬退火算法簡介1、固體退火過程模擬退火算法來源於固體退火原理,將固體加溫至充分高,再讓其徐徐冷卻,加溫時,固體內部粒子隨著溫度升高變為無序狀態,內能增大,而慢慢冷卻時粒子漸趨有序,在每個溫度都達到平衡態,最後在常溫時達到基態,此時內能減為最小。
  • 自我代碼提升之啟發式算法(番外篇)
    在這種背景下,啟發式算法應運而生,其目標在於,在有限的時間和資源下(可接受的範圍內),尋找出能夠解決問題的可行解,可行解和通常不是全局最優解,但可能是一個較為優秀的局部最優解。啟發式算法主要是基於直觀和經驗來構造,目前主要的幾種方法,如遺傳算法、模擬退火、蟻群算法等,都是基於仿生學而發明的。本期所要介紹的兩種啟發式算法,分別是遺傳算法(GA)和模擬退火算法(SA)。
  • 曼孚科技:AI算法領域常用的39個術語(上)
    遺傳算法(Genetic Algorithm | GA)遺傳算法(Genetic Algorithm)是模擬達爾文生物進化論的自然選擇和遺傳學機理的生物進化過程的計算模型,是一種通過模擬自然進化過程搜索最優解的方法。
  • 改進遺傳算法的支持向量機特徵選擇解決方案
    支持向量機是一種在統計學習理論的基礎上發展而來的機器學習方法[1],通過學習類別之間分界面附近的精確信息,可以自動尋找那些對分類有較好區分能力的支持向量,由此構造出的分類器可以使類與類之間的間隔最大化,因而有較好的泛化性能和較高的分類準確率。由於支持向量機具有小樣本、非線性、高維數、避免局部最小點以及過學習現象等優點,所以被廣泛運用於故障診斷、圖像識別、回歸預測等領域。
  • 數學建模競賽前必須熟練掌握的十個算法
    蒙特卡羅方法(Monte Carlo method),又稱隨機抽樣或統計模擬方法,是一種以概率統計理論為指導的一類非常重要的數值計算方法。此方法使用隨機數(或更常見的偽隨機數)來解決很多計算問題的方法。由於傳統的經驗方法由於不能逼近真實的物理過程,很難得到滿意的結果,而蒙特卡羅方法由於能夠真實地模擬實際物理過程,故解決問題與實際非常符合,可以得到很圓滿的結果。
  • 機器學習特徵選擇常用算法
    雙向搜索(4) 增L去R選擇算法 ( LRS , Plus-L Minus-R Selection )該算法有兩種形式:1> 算法從空集開始,每輪先加入L個特徵,然後從中去除R個特徵,使得評價函數值最優。( L > R )2> 算法從全集開始,每輪先去除R個特徵,然後加入L個特徵,使得評價函數值最優。
  • 基於模擬退火神經網絡的I型FIR數字濾波器設計
    摘要:提出一種基於模擬退火神經網絡設計FIR數字濾波器的方法,是對用神經網絡設計方法的一種改進。由於線性相位FIR數字濾波器的幅頻特性是有限項的傅立葉級數,因此構造了一個三層餘弦基神經網絡模型,並用模擬退火算法進行了優化,然後給出了高階濾波器優化設計的實例。仿真表明經優化設計後的濾波器具有更好的性能和更穩定的效果。