模擬退火演算法——脫胎於自然界物理過程,與優化問題相結合
模擬退火演算法
工程中許多實際優化問題都是非凸的,存在許多區域性最優解,特別是隨著優化規模的增大,區域性最優解的數目將會迅速增加。因此,有效地求一般的隨機優化問題的解至今仍是乙個難題。目前求解一全域性最優化問題的方法一般分為兩類,一類是確定性方法,另一類是隨機性方法。
模擬退火演算法是一種通用的概率演算法,用來在乙個很大的空間內尋找問題的最優解。由於其能有效解決np問題、避免陷入區域性最優、初值依賴性較弱等特點,已在控制工程、生產排程、機器學習、影象處理等領域獲得了廣泛的應用。
演算法基本思想
現代的模擬退火演算法思想源於固體退火過程,即將固體熱至足夠高的溫度,再緩慢冷卻;公升溫的過程中,固體內部的粒子隨溫度公升高變為無序狀,內能增大,而緩慢冷卻時粒子又逐漸趨於有序。理論上,如果冷卻的速度足夠慢,那麼冷卻中任一溫度時固體都能達到熱平衡,而冷卻到低溫時,將達到這一低溫狀態的內能最小狀態。
在這一過程中,任一恆定溫度都能達到熱平衡是個很關鍵的步驟,這一點可以用monte carlo演算法模擬。但因為物理系統總是趨向於能量最低,而分子熱運動則趨向於破壞這種低能量的狀態,故而只需要著重取貢獻比較大的狀態即可達到比較好的效果。
設當前狀態i生成新狀態j,若新狀態的內能小於狀態i的內能(即ej後來,人們把模擬退火演算法思想與組合優化的相似點進行模擬,將模擬退火演算法應用到了組合優化領域。在模擬退火演算法應用的時候,一般可以將溫度t當做控制引數,目標函式值f視為內能e,而固體在某溫度t時的乙個狀態對應乙個解xi。然後演算法試圖隨著控制引數的降低是目標函式值也逐漸降低,直至區域全域性最小值。
冷卻進度表
控制引數的初值t0:冷卻開始的溫度
控制引數t的衰減函式:由於計算機只能處理離散的資料,因此需要把連續的降溫過程離散化為一系列溫度點,衰減函式即計算一系列溫度的表示式
控制引數t的終值tf :冷卻結束的溫度
markov鏈的長度lk:任一溫度t的迭代次數
演算法基本步驟
1、令t=t0,隨機生成乙個初始解x0,並計算其的目標函式的值e(x0)
2、令t等於冷卻進度表中的下乙個值ti
3、根據當前解xi進行擾動,產生乙個新的解xj,計算相應的目標函式值e(xj),得到δe=e(xj)-e(xi)
4、若δe<0,則接受新解xj作為當前解;若δe>0,則新解xj按概率exp(-δ/ti)接受,ti為當前溫度
5、在溫度ti下,重複lk次的擾動和接受過程,即執行步驟(3)和步驟(4)
6、判斷t是否達到tf,若達到,則終止演算法;若未達到,轉到步驟2繼續執行
演算法的實質是兩重迴圈,在任一溫度下隨機擾動產生新解,並計算目標函式值的變化,決定是否被接受。由於演算法的初始溫度比較高,這樣,使e增大的新解在初始時也能被接受,因而能跳出區域性最小值,然後通過緩慢地降低溫度,演算法就最終可能收斂到全域性的最優解。因為低溫時雖然接收函式很小,但也有可能碰到更差的解,因此一般會把歷史最優解記錄下來,與終止演算法前最後乙個接受解一起輸出
模擬退火演算法的python實現(解決揹包問題)
)#定義正無窮
a=0.95
#衰減函式的引數
k=np.array([5
,10,13
,4,3
,11,13
,10,8
,16,7
,4])
#物品的價值
k=-k #模擬退火演算法求的是最小值,故取負數
d=np.array([2
,5,18
,3,2
,5,10
,4,11
,7,14
,6])
#物品的質量
restriction=
46#揹包的最大容量
num=d.shape[0]
#物品的數量
""" e_new是新解的目標函式值
e_current是當前解對應的目標函式值
e_best是最優解
初始溫度t0為97
終止溫度tf為3
控制溫度為t
"""sol_new=np.ones((1
,num)
) e_current ,e_best = inf ,inf
sol_current ,sol_best = sol_new ,sol_new
t0 ,tf =97,
3t = t0
p =true
while t>=tf:
for i in
range(0
,100):
#產生隨機擾動
tmp =
round
( np.random.rand(
)*num -1)
sol_new[
0,tmp]=1
-sol_new[
0,tmp]
#檢查是否滿足約束
while
true
: q = np.
sum(sol_new*d)
<= restriction
ifnot q:
p =not p
tmp = np.where(sol_new ==1)
if p : sol_new[sol_new ==1]
=0else
: sol_new[
0,tmp[-1
][-1
]]=0
else
:break
#計算揹包中的物體價值
e_new = np.
sum(sol_new*k)
if e_new < e_current :
e_current = e_new
sol_current = sol_new
if e_new < e_best:
e_best = e_new
else
:if np.random.rand(
)< exp(
-(e_new - e_current)
/t )
: e_current = e_new
sol_current = sol_new
else
: sol_new = sol_current
t = t*a
(sol_best)
#最優解
(-e_best)
#最優總價值
模擬退火演算法
w 模擬退火演算法的基本思想 將乙個優化問題比擬成乙個金屬物體,將優化問題的目標函式比擬成物體的能量,問題的解比擬成物體的狀態,問題的最優解比擬成能量最低的狀態,然後模擬金屬物體的退火過程,從乙個足夠高的溫度開始,逐漸降低溫度,使物體分子從高能量狀態緩慢的過渡到低能量狀態,直至獲得能量最小的理想狀態...
模擬退火演算法
一些求解極值的問題不能通過函式特性直接求解,只能暴力列舉,但是單純的列舉效率不高,通過模擬退火演算法可以高效的找到答案。學習好博文 最小圓覆蓋 hdu 3007 buried memory 大意 給出一些點,求出能覆蓋他們的最小的圓。輸出圓心和半徑 include include include i...
模擬退火演算法
1.模擬退火演算法認識 爬山演算法也是乙個用來求解最優化問題的演算法,每次都向著當前上公升最快的方向往上爬,但是初始化不同可能 會得到不同的區域性最優值,模擬退火演算法就可能跳出這種區域性最優解的限制。模擬退火演算法是模擬熱力學系統 中的退火過程。在退火過程中是將目標函式作為能量函式。大致過程如下 ...