模擬退火演算法是一種通用概率演演算法,用於在乙個大的空間內尋找命題的最優解。
根據熱力學原理,在溫度為t時,出現能量差為de的降溫概率為p(de),標識為
p(de) = exp(de/(kt))
k為常數,exp為自然數,且de<0,公式指出:
溫度越高,出現一次能量差為de的降溫概率越大。
溫度越低,出現降溫的概率最小
由於de<0 --> de/kt<0,exp(de/(kt))的取值為(0,1),隨著溫度t的降低,p(de)會逐漸降低。我們將一次向較差解的移動看做一次溫度跳變過程,我們以概率p(de)來接受這樣的移動。
演變:
內能e模擬為目標函式值 f,溫度t演化成控制引數 t,即得到解組合優化問題的模擬退火演演算法
總結
若f( y(i+1) ) <= f( y(i) ) (即移動後得到更優解),則總是接受該移動。
若f( y(i+1) ) > f( y(i) ) (即移動後的解比當前解要差),則以一定的概率接受移動,而且這個概率隨著時間推移逐漸降低(逐漸降低才能趨向穩定
while(t>t_min):
de = f(y(i+1))-f(y(i)) #
if de>=0:
y(i+1)=y(i) # 接受狀態轉移
else:
if exp(de/t)>random(0,1):
y(i+1) = y(i) # 接受移動
t=r*t # 降溫退火,r越大,降溫越慢,r越小,降溫越快
i++
求函式最小值
import matplotlib.pyplot as plt
import mathi
mport random
t_init = 100 # 初始最大溫度
alpha = 0.95 # 降溫係數
t_min = 1e-3 # 最小溫度,即退出迴圈條件
def obj(x):
y = 10 * math.sin(5 * x) + 7 * math.cos(4 * x)
return -y
def sa(t_init, alpha, t_min):
t = t_init
x_new = random.random() * 10 # 初解
x_current = x_new
y_current = float('inf')
x_best = x_new
y_best = float('inf')
while t > t_min:
for i in range(100):
delta_x = random.random() - 0.5 # 自變數變化後仍要求在[0,10]之間
if 0 < (x_new + delta_x) < 10:
x_new = x_new + delta_x
else:
x_new = x_new - delta_x
y_new = obj(x_new)
if (y_new < y_current):
y_current = y_new
x_current = x_new
if (y_new < y_best):
y_best = y_new
x_best = x_new
else:
if random.random() < math.exp(-(y_new - y_current) / t):
y_current = y_new
x_current = x_new
else:
x_new = x_current
t *= alpha
print('最優解', x_best, obj(x_best))sa(t_init, alpha, t_min)
模擬退火法 matlab
模擬退火法 模擬退火法簡單解釋 為了找出地球上最高的山,一群兔子們開始想辦法。首先兔子們用酒將自己灌醉了,它們隨機地跳了很長的時間。在這期 間,它們可能走向高處,也可能踏入平地。但是,隨著時間的流逝,它們漸漸清醒了並朝著最高的方向跳去。最後就達到了珠穆朗瑪峰。所謂的退火是指將固體加熱到足夠高的溫度,...
優化方法 模擬退火法
模擬退火法是針對爬山法只能求出區域性最優解提出來的。模擬退火法其實也是一種貪心法,但是他搜尋最優解的過程中引入了隨機因素,允許在中間的計算過程中按照一定的概率來接受相對較差的中間結果,因此它有可能調出區域性最優解尋找到全域性的最優解。模擬退火法演算法描述 若j y i 1 j y i 即移動後得到更...
C 數值計算之模擬退火法簡介 一
摘要 本文簡介了模擬退火的基本思想,以於模擬時的主要引數的選擇根據,然後給出乙個求二維函式極值的具體問題和解法,並給出c 源 l 概述 在管理科學 電腦科學 分子物理學和生物學以及超大規模積體電路設計 設計 影象處理和電子工程等科技領域中,存在大量組合優化瓿。其中許多問題如貨郎擔問題 圖著色問題 裝...