模擬退火演算法

2021-09-27 13:51:15 字數 3414 閱讀 3850

模擬退火演算法——脫胎於自然界物理過程,與優化問題相結合

模擬退火演算法

工程中許多實際優化問題都是非凸的,存在許多區域性最優解,特別是隨著優化規模的增大,區域性最優解的數目將會迅速增加。因此,有效地求一般的隨機優化問題的解至今仍是乙個難題。目前求解一全域性最優化問題的方法一般分為兩類,一類是確定性方法,另一類是隨機性方法。

模擬退火演算法是一種通用的概率演算法,用來在乙個很大的空間內尋找問題的最優解。由於其能有效解決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

print

(sol_best)

#最優解

print

(-e_best)

#最優總價值

模擬退火演算法

w 模擬退火演算法的基本思想 將乙個優化問題比擬成乙個金屬物體,將優化問題的目標函式比擬成物體的能量,問題的解比擬成物體的狀態,問題的最優解比擬成能量最低的狀態,然後模擬金屬物體的退火過程,從乙個足夠高的溫度開始,逐漸降低溫度,使物體分子從高能量狀態緩慢的過渡到低能量狀態,直至獲得能量最小的理想狀態...

模擬退火演算法

一些求解極值的問題不能通過函式特性直接求解,只能暴力列舉,但是單純的列舉效率不高,通過模擬退火演算法可以高效的找到答案。學習好博文 最小圓覆蓋 hdu 3007 buried memory 大意 給出一些點,求出能覆蓋他們的最小的圓。輸出圓心和半徑 include include include i...

模擬退火演算法

1.模擬退火演算法認識 爬山演算法也是乙個用來求解最優化問題的演算法,每次都向著當前上公升最快的方向往上爬,但是初始化不同可能 會得到不同的區域性最優值,模擬退火演算法就可能跳出這種區域性最優解的限制。模擬退火演算法是模擬熱力學系統 中的退火過程。在退火過程中是將目標函式作為能量函式。大致過程如下 ...