模擬退火算法(附代碼)

2021-01-16 老居搞機

上一篇我們講了旅行商問題及遺傳算法來解決此類問題:遺傳算法(附代碼)

今天介紹另外一種解決此類NP問題的方法是模擬退火算法(Simulated Annealing, SA)


模擬退火算法的思想借鑑於固體的退火原理,當固體的溫度很高的時候,內能比較大,固體的內部粒子處於快速無序運動,當溫度慢慢降低的過程中,固體的內能減小,粒子的慢慢趨於有序,最終,當固體處於常溫時,內能達到最小,此時,粒子最為穩定。模擬退火算法便是基於這樣的原理設計而成。


那麼為什麼在算法開始的時候要處於不穩定的狀態呢?我們先看來一下爬山法吧


爬山法的問題

爬山法是一種貪婪算法,在當前位置的附近尋找一個更大的值,不斷迭代這個過程直到處於穩定狀態

如圖中要尋找這個函數的最大值,採用爬山法的話,如果初始點選擇D點,那麼爬山法能夠找到最大值B點,但是如果初始值選擇C或者E點,那麼爬山法找到的最大值就是局部最優A點,而不是全局最優點B點


這就是爬山法的局限性,如果選擇的初始點不好,那麼算法很有可能會陷入局部最優解,而模擬退火引入的溫度,在溫度越高的時候越有機會跳到一個相對不那麼優的解,從而跳出局部最優。


模擬退火的過程

1.初始化一個溫度T, 如T=100

2.老的解損失為: old_cost, 生成一個新的解,損失為: new_cost

3.計算當前是否採納新的解概率: P = math.exp(-(new_cost-old_cost)/T)

4.如果損失new_cost<old_cost或者隨機一個(0,1)之間數值<P, 則接受這個新解,否則還是使用老的解

5.當前的溫度T下降一定的值(溫度降低)

6.一直迭代2~5步,直到穩定狀態


可以看到一開始溫度T很高的時候P也很大,那麼採納新的解(損失比老的解更大)的概率也更高,從而跳出了局部最優

隨著溫度T的下降P也越來越小,會越來越多的採用損失大小來評價是否採納新的解


代碼實現

import randomimport mathimport matplotlib.pyplot as plt

class SA: def __init__(self): self.T = 10000. self.cool = 0.95
def new_route(self, tour, data): c1 = random.randint(0, len(tour['tour']) - 1) c2 = random.randint(0, len(tour['tour']) - 1)
while c1 == c2: c2 = random.randint(0, len(tour['tour']) - 1)
new_tour = [] for i in range(len(tour['tour'])): if i == c1: new_tour.append(tour['tour'][c2]) elif i == c2: new_tour.append(tour['tour'][c1]) else: new_tour.append(tour['tour'][i])
return self.get_tour_detail(new_tour, data)
def get_distance(self, c1, c2): xd = abs(c1['x'] - c2['x']) yd = abs(c1['y'] - c2['y']) distance = math.sqrt(xd * xd + yd * yd)
return distance
def get_cost(self, distance): return distance
def get_tour(self, data): tour = [] for key, value in data.items(): tour.append(key)
random.shuffle(tour)
return self.get_tour_detail(tour, data)
def get_tour_detail(self, tour, data): tmp = None distance = 0 for item in tour: if tmp is not None: distance_tmp = self.get_distance(data[tmp], data[item]) distance += distance_tmp
tmp = item
return {'tour': tour, 'distance': distance, 'cost': self.get_cost(distance)}
def run(self, data): route = self.get_tour(data) print 'before route:' print route i = 0 while self.T > 0.1: new_route = self.new_route(route, data) old_cost, new_cost = route['cost'], new_route['cost']
if new_cost < old_cost or random.random() < math.exp(-(new_cost - old_cost) / self.T): route = new_route
self.T = self.T * self.cool i += 1
print 'total gen:', i print route return route

def init_data(num): data = {} def get_random_point(): return { 'x': random.randint(1, 99), 'y': random.randint(1, 99) }
for i in range(num): data[i + 1] = get_random_point()
return data

def show(citys, tour): plt.bar(left=0, height=100, width=100, color=(0, 0, 0, 0), edgecolor=(0, 0, 0, 0)) plt.title(u'tsp') plt.xlabel('total distance: %s m' % tour['distance'])
x = [] y = [] i = 0 for item in tour['tour']: city = citys[item] x.append(city['x']) y.append(city['y'])
i += 1 if i == 1: plt.plot(city['x'], city['y'], 'or') else: plt.plot(city['x'], city['y'], 'bo')
plt.plot(x, y, 'g') plt.xlim(0.0, 100) plt.ylim(0.0, 100) plt.show()

if __name__ == '__main__': scale, num, max_gen, pc, elite = 50, 10, 1000, 0.8, 0.2 data = init_data(num) sa = SA() new_fittest = sa.run(data) show(data, new_fittest)

運行效果:


參考

[1].<<集體智慧編程>>

[2].https://www.cnblogs.com/heaad/archive/2010/12/20/1911614.html

[3].https://zhuanlan.zhihu.com/p/33184423


長按二維碼, 關注本公眾號

相關焦點

  • MATLAB優化算法實例——模擬退火算法
    ——工科男❞1 模擬退火算法基本理論上期文章介紹MATLAB算法——遺傳算法,本章介紹模擬退火法及實例應用。MATLAB優化算法實例——遺傳算法1.1 簡介模擬退火算法(Simulated Annealing Algorithm)是一種隨機類全局優化方法。它來源於熱力學中固體物質的退火冷卻過程。
  • 圖解退火算法(模擬退火算法內核講解)
    總之,啟發式算法可用於解決求解最優解代價比較大的問題,但是此類算法不保證得到最優解,求解結果不穩定且算法效果依賴於實際問題和設計者的經驗。那麼今天的主題將給大家介紹同樣常見的一種智能優化算法——模擬退火算法。
  • 模擬退火算法
    模擬退火算法作為一種通用的隨機搜索算法,現已廣泛用於VLSI設計、圖像識別和神經網計算機的研究。模擬退火算法的應用如下:1、模擬退火算法在VLSI設計中的應用利用模擬退火算法進行VLSI的最優設計,是目前模擬退火算法最成功的應用實例之一。用模擬退火算法幾乎可以很好地完成所有優化的VLSI設計工作。如全局布線、布板、布局和邏輯最小化等等。
  • 經典算法—模擬退火算法
  • 模擬退火算法詳解
    2.模擬退火算法機制模擬退火算法(Simulated Annealing,SA)最早的思想是由N. Metropolis等人於1953年提出。1983年,S. Kirkpatrick等成功地將退火思想引入到組合優化領域。
  • 模擬退火算法簡介
    模擬退火其實也是一種貪心算法,但是它的搜索過程引入了隨機因素。模擬退火算法以一定的概率來接受一個比當前解要差的解,因此有可能會跳出這個局部的最優解,達到全局的最優解。以上圖為例,模擬退火算法在搜索到局部最優解B後,會以一定的概率接受到C的移動。也許經過幾次這樣的不是局部最優的移動後會到達D點,於是就跳出了局部最大值A。
  • 大白話解析模擬退火算法
    模擬退火(SA,Simulated Annealing)思想爬山法是完完全全的貪心法,每次都鼠目寸光的選擇一個當前最優解,因此只能搜索到局部的最優值。模擬退火其實也是一種貪心算法,但是它的搜索過程引入了隨機因素。模擬退火算法以一定的概率來接受一個比當前解要差的解,因此有可能會跳出這個局部的最優解,達到全局的最優解。
  • 優化算法系列之模擬退火算法(1)
    模擬退火算法是所謂三大非經典算法之一,它脫胎於自然界的物理過程,與優化問題相結合。在百度百科上對於模擬退火算法的定義是:模擬退火算法來源於固體退火原理,是一種基於概率的算法,將固體加溫至充分高,再讓其徐徐冷卻,加溫時,固體內部粒子隨溫升變為無序狀,內能增大,而徐徐冷卻時粒子漸趨有序,在每個溫度都達到平衡態,最後在常溫時達到基態,內能減為最小。
  • 深度學習經典算法 | 模擬退火算法詳解
    模擬退火算法基本思想現代的模擬退火算法形成於20世紀80年代初,其思想源於固體的退火過程,即將固體加熱至足夠高的溫度,再緩慢冷卻。升溫時,固體內部粒子隨溫度升高變為無序狀,內能增大,而緩慢冷卻時粒子又逐漸趨於有序,從理論上講,如果冷卻過程足夠緩慢,那麼冷卻中任一溫度時固體都能達到熱平衡,而冷卻到低溫時將達到這一低溫下的內能最小狀態。
  • 模擬退火遺傳算法在多用戶檢測技術中的應用
    它模擬自然界中的生命進化機制,在人工系統中實現特定目標的優化。實踐證明,遺傳算法對於NP問題非常有效[8],但是它容易陷入局部最優,即全局搜索能力弱。1.2 模擬退火算法模擬退火算法(SA)是基於金屬退火的機理而建立起來的一種隨機算法。
  • 美賽常用六種算法第二期——模擬退火算法
    模擬退火算法包含兩個部分即Metropolis算法和退火過程。Metropolis算法就是如何在局部最優解的情況下讓其跳出來,是退火的基礎。1953年Metropolis提出重要性採樣方法,即以概率來接受新狀態,而不是使用完全確定的規則,稱為Metropolis準則,計算量較低。
  • 基於模擬退火算法的地面電視頻率指配方法研究
    美國聯邦通信委員會(FCC)於1996年著手研究全境的地面數位電視覆蓋網頻率規劃問題,通過使用"模擬退火"算法和開發相應的規劃軟體,完成了美國的模數過渡方案。該算法的應用降低了美國模擬向數字過渡期間的轉換成本,提高了頻率資源的使用效率,並帶來了巨大的商業效益。  我國地面電視業務可用的頻道數量共有48個,指配給了數量眾多的模擬發射機,承擔著公共服務和各地節目的播出任務。
  • 模擬退火(Simulated Annealing, SA)算法簡介與MATLAB實現
    模擬退火算法(Simulated Annealing,簡稱SA)的思想最早是由Metropolis等提出的。其出發點是基於物理中固體物質的退火過程與一般的組合優化問題之間的相似性。模擬退火法是一種通用的優化算法,其物理退火過程由以下三部分組成:加溫過程。其目的是增強粒子的熱運動,使其偏離平衡位置。
  • 基於模擬退火法的旅行商問題
    二、模擬退火算法簡介1、固體退火過程模擬退火算法來源於固體退火原理,將固體加溫至充分高,再讓其徐徐冷卻,加溫時,固體內部粒子隨著溫度升高變為無序狀態,內能增大,而慢慢冷卻時粒子漸趨有序,在每個溫度都達到平衡態,最後在常溫時達到基態,此時內能減為最小。
  • 自我代碼提升之啟發式算法(番外篇)
    本期給大家帶來一些啟發式算法的介紹和代碼實現。嚴格來說,啟發式算法並不屬於機器學習領域的方法,其解決的問題也並不是分類和回歸預測,因此本篇屬於該系列番外篇。啟發式算法簡介在數學建模的經典問題當中,有一種問題是最優化問題,即在給定條件下,給出能夠是的目標實現最優的答案的方法。
  • 手把手教你模擬退火算法
    程式語言我選擇的是MATLAB,代碼如下:%% 開始clcclearclose all%% 參數準備a=0.95; %溫度衰減速度times=1000; %循環次數k=[34 32 56 67 54
  • 基於模擬退火神經網絡的I型FIR數字濾波器設計
    摘要:提出一種基於模擬退火神經網絡設計FIR數字濾波器的方法,是對用神經網絡設計方法的一種改進。由於線性相位FIR數字濾波器的幅頻特性是有限項的傅立葉級數,因此構造了一個三層餘弦基神經網絡模型,並用模擬退火算法進行了優化,然後給出了高階濾波器優化設計的實例。仿真表明經優化設計後的濾波器具有更好的性能和更穩定的效果。
  • 淺析基於優化算法的能量管理控制策略(二)
    優化算法可分為全局優化和實時優化,受算法本身的限制以及採樣時間、模型精度、參數定義等因素的影響,目前這種區分尚不明顯。,NN)滑模控制(Sliding ModeControl,SMC)無導數優化算法——模擬退火(Simulated Annealing,SA)無導數優化算法——遺傳算法(Genetic Algorithm,GA)無導數優化算法——粒子群算法(Particle Swarm Optimization,PSO)無導數優化算法——DIRECT
  • 改進遺傳算法的支持向量機特徵選擇解決方案
    傳統的遺傳算法存在早熟收斂、非全局收斂以及後期收斂速度慢的缺點,為此本文提出了一種能夠在進化過程中自適應調節變異率,以及利用模擬退火防止早熟的改進遺傳算法,同時該算法利用敏感度信息可以有效地控制遺傳操作。
  • 機器學習特徵選擇常用算法
    雙向搜索(4) 增L去R選擇算法 ( LRS , Plus-L Minus-R Selection )該算法有兩種形式:1> 算法從空集開始,每輪先加入L個特徵,然後從中去除R個特徵,使得評價函數值最優。( L > R )2> 算法從全集開始,每輪先去除R個特徵,然後加入L個特徵,使得評價函數值最優。