模擬退火演算法

2021-07-27 17:58:50 字數 1991 閱讀 5639

1. 模擬退火演算法認識

爬山演算法也是乙個用來求解最優化問題的演算法,每次都向著當前上公升最快的方向往上爬,但是初始化不同可能

會得到不同的區域性最優值,模擬退火演算法就可能跳出這種區域性最優解的限制。模擬退火演算法是模擬熱力學系統

中的退火過程。在退火過程中是將目標函式作為能量函式。大致過程如下

初始高溫=>溫度緩慢下降=>終止在低溫 (這時能量函式達到最小,目標函式最小)

在熱力學中的退火過程大致是變溫物體緩慢降溫而達到分子之間能量最低的狀態。設熱力學系統s中有有限個且

離散的n個狀態,狀態

模擬退火演算法也是貪心演算法,但是在其過程中引入了隨機因素,以一定的概率接受乙個比當前解要差的解,並且

這個概率隨著時間的推移而逐漸降低。

2. 模擬退火演算法描述若若

逐漸降低。這個概率表示為

由於是退火過程,所以de < 0,這個公式說明了溫度越高出現一次能量差為de的降溫概率就越大,溫度越低,

出現降溫的概率就越小,由於de總是小於0,所以p(de)取值在01之間。偽碼如下

3. 工程應用

工程應用的乙個例子:我們把物資編號成圖1種那樣,求物資解除安裝的時間,就可以用模擬退火演算法,具體可以見程式的。

圖1

#模擬退火演算法

def anneal():

annealpe = # 生成乙個個體

annealpetemp =

for i in range(rnum):

random.shuffle(annealpetemp)# 生成乙個隨機的個體

t = 1000

tmin = 0.1

while t > tmin:

de = decodpe(annealpe) - decodpe(annealpetemp)

if(de >= 0):

for i in range(rnum):

annealpe[i] = annealpetemp[i]

else:

a = math.e**(de/t)

if(math.e**(de/t)) > random.random():

for i in range(rnum):

annealpe[i] = annealpetemp[i]

t = 0.9999 * t

selectnum0 = 0

selectnum1 = 0

selectnum0 = random.randint(0, rnum - 1)

selectnum1 = random.randint(0, rnum - 1)

# 交換兩個變異的

amongnum = annealpetemp[selectnum0]

annealpetemp[selectnum0] = annealpetemp[selectnum1]

annealpetemp[selectnum1] = amongnum

return (decodpe(annealpe))

模擬退火演算法

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

模擬退火演算法

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

模擬退火演算法

題目大意 給出平面上n個點,求到所有點距離和最短的點,輸出該距離和。include include include include include struct posp 101 int n 計算點x到各點距離之和 double dis pos x 模擬退火 double sa return mi ...