1. 程式人生 > >優化演算法——模擬退火演算法

優化演算法——模擬退火演算法

模擬退火演算法原理

爬山法是一種貪婪的方法,對於一個優化問題,其大致影象(影象地址)如下圖所示:
圖片來自大白話解析模擬退火演算法
其目標是要找到函式的最大值,若初始化時,初始點的位置在C處,則會尋找到附近的區域性最大值A點處,由於A點出是一個區域性最大值點,故對於爬山法來講,該演算法無法跳出區域性最大值點。若初始點選擇在D處,根據爬山法,則會找到全部最大值點B。這一點也說明了這樣基於貪婪的爬山法是否能夠取得全域性最優解與初始值的選取由很大的關係。

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

模擬退火演算法從某一較高的溫度出發,這個溫度稱為初始溫度,伴隨著溫度引數的不斷下降,演算法中的解趨於穩定,但是,可能這樣的穩定解是一個區域性最優解,此時,模擬退火演算法中會以一定的概率跳出這樣的區域性最優解,以尋找目標函式的全域性最優解。如上圖中所示,若此時尋找到了A點處的解,模擬退火演算法會以一定的概率跳出這個解,如跳到了D點重新尋找,這樣在一定程度上增加了尋找到全域性最優解的可能性。

模擬退火演算法

模擬退火演算法過程

(1)隨機挑選一個單元k,並給它一個隨機的位移,求出系統因此而產生的能量變化ΔEk
(2)若ΔEk0,該位移可採納,而變化後的系統狀態可作為下次變化的起點;
Δ

Ek>0,位移後的狀態可採納的概率為

Pk=11+eΔEk/T
式中T為溫度,然後從(0,1)區間均勻分佈的隨機數中挑選一個數R,若R<Pk,則將變化後的狀態作為下次的起點;否則,將變化前的狀態作為下次的起點。
(3)轉第(1)步繼續執行,知道達到平衡狀態為止。

模擬退火演算法流程

這裡寫圖片描述

模擬退火演算法的Java實現

求解函式最小值問題:

F(x)=6x7+8x6+7x3+5x2xy
其中,0x100,輸入任意y值,求F(x)的最小值。

Java程式碼

package sa;

/**
 * 實現模擬退火演算法
 * @author zzy
 *Email:
[email protected]
*/
public class SATest { public static final int T = 100;// 初始化溫度 public static final double Tmin = 1e-8;// 溫度的下界 public static final int k = 100;// 迭代的次數 public static final double delta = 0.98;// 溫度的下降率 public static double getX() { return Math.random() * 100; } /** * 求得函式的值 * * @param x目標函式中的一個引數 * @param y目標函式中的另一個引數 * @return函式值 */ public static double getFuncResult(double x, double y) { double result = 6 * Math.pow(x, 7) + 8 * Math.pow(x, 6) + 7 * Math.pow(x, 3) + 5 * Math.pow(x, 2) - x * y; return result; } /** * 模擬退火演算法的過程 * @param y目標函式中的一個引數 * @return最優解 */ public static double getSA(double y) { double result = Double.MAX_VALUE;// 初始化最終的結果 double t = T; double x[] = new double[k]; // 初始化初始解 for (int i = 0; i < k; i++) { x[i] = getX(); } // 迭代的過程 while (t > Tmin) { for (int i = 0; i < k; i++) { // 計算此時的函式結果 double funTmp = getFuncResult(x[i], y); // 在鄰域內產生新的解 double x_new = x[i] + (Math.random() * 2 - 1) * t; // 判斷新的x不能超出界 if (x_new >= 0 && x_new <= 100) { double funTmp_new = getFuncResult(x_new, y); if (funTmp_new - funTmp < 0) { // 替換 x[i] = x_new; } else { // 以概率替換 double p = 1 / (1 + Math .exp(-(funTmp_new - funTmp) / T)); if (Math.random() < p) { x[i] = x_new; } } } } t = t * delta; } for (int i = 0; i < k; i++) { result = Math.min(result, getFuncResult(x[i], y)); } return result; } public static void main(String args[]) { // 設定y的值 int y = 0; System.out.println("最優解為:" + getSA(y)); } }

最後的結果

最優解為:1.733360963664572E-16

相關推薦

【電腦科學】【2016.10】多目標優化模擬退火演算法研究

本文為英國埃克塞特大學(作者:Kevin Ian Smith)的電腦科學博士論文,共137頁。 許多應用領域的計算優化問題都歸結為多目標優化問題,從而達到最小化或最大化的目的。如果(通常情況下)這些目標都是相互競爭的目標,則優化的目的是找出一組合適的解決方

優化演算法——模擬退火演算法

模擬退火演算法原理 爬山法是一種貪婪的方法,對於一個優化問題,其大致影象(影象地址)如下圖所示: 其目標是要找到函式的最大值,若初始化時,初始點的位置在C處,則會尋找到附近的區域性最大值A點處,由於A點出是一個區域性最大值點,故對於爬山法來講,

優化演算法1:模擬退火演算法思想解析

1.演算法簡介 模擬退火演算法得益於材料的統計力學的研究成果。統計力學表明材料中粒子的不同結構對應於粒子的不同能量水平。在高溫條件下,粒子的能量較高,可以自由運動和重新排列。在低溫條件下,粒子能量較低。如果從高溫開始,非常緩慢地降溫(這個過程被稱為退火),粒子

集體智慧程式設計——優化搜尋演算法:爬山法,模擬退火演算法,遺傳演算法-Python實現

在優化問題中,有兩個關鍵點 代價函式:確定問題的形式和規模之後,根據不同的問題,選擇要優化的目標。如本文涉及的兩個問題中,一個優化目標是使得航班選擇最優,共計12個航班,要使得總的票價最少且每個人的等待時間之和最小。第二個問題是學生選擇宿舍的問題,每個學生可

現代優化演算法探究 模擬退火演算法

相較於完全貪心的單點爬山演算法,模擬退火用概率接受新解的方式,對貪心法容易陷入區域性最優解的缺陷進行了改進,是一種常用的在大的搜尋空間中逼近全域性最優解的元啟發式方法。這裡先大致描述演算法。然後先用一個簡單的求函式最小值例子,解釋我寫的c++模擬退火演算法模板的基本使用,之後

使用模擬退火演算法優化 Hash 函式

# 背景 現有個處理股票行情訊息的系統,其架構如下: 由於資料量巨大,系統中啟動了 15 個執行緒來消費行情訊息。訊息分配的策略較為簡單:對 symbol 的 hashCode 取模,將訊息分配給其中一個執行緒進行處理。 經過驗證,每個執行緒分配到的 symbol 數量較為均勻,於是系統愉快地上線

MATLAB模擬退火演算法模板

為了參加國賽,這幾天學了模擬退火演算法,整理下當做模板方便國賽的時候用。 模擬退火用於處理最優化問題,可以求出當目標函式取得最小值時的決策變數的值。 在編寫程式時需要根據具體問題設計演算法,演算法描述為: (1)解空間(初始解) (2)目標函式 (3)新解的產生 &nbs

模擬退火演算法案例

2018年的華為軟體精英挑戰賽題目簡介:給出華為雲虛擬機器過去的租借數量歷史資料,用以訓練模型並預測下一個時間段裡的虛擬機器租借數量,然後把這些預測得到的虛擬機器裝填進一定規格的物理機中,即分為預測和裝填兩個部分。   總結一下裝填部分使用的模擬退火演算法: 演算法原理 裝

HDU 3007 模擬退火演算法

Buried memory Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4067  

深度學習 --- 模擬退火演算法詳解(Simulated Annealing, SA)

上一節我們深入探討了,Hopfield神經網路的性質,介紹了吸引子和其他的一些性質,而且引出了偽吸引子,因為偽吸引子的存在導致Hopfield神經網路正確率下降,因此本節致力於解決偽吸引子的存在。在講解方法之前我們需要再次理解一些什麼是偽吸引子,他到底是如何產生的? 簡單來說說就是網路動態轉

模擬退火演算法理論+Python解決函式極值+C++實現解決TSP問題

簡述 演算法設計課這周的作業: 趕緊寫了先,不然搞不完了。 文章目錄 簡述 演算法理論部分 變數簡單分析 從狀態轉移概率到狀態概率 推導 理解當溫度收斂到接近0的時候,收斂到結果 理論

模擬退火演算法詳解

轉載自http://cighao.com/2015/12/03/introduction-of-SA/ 1. 簡介 模擬退火演算法 (Simulated Annealing,SA) 最早的思想是由 N. Metropolis 等人於1953年提出。1983年, S. Kirkpatr

模擬退火演算法

模擬退火演算法是一種求函式最小值點的隨機演算法,最近工作中要用到優化演算法,因此研究了一下這個比較簡單的演算法。模擬退火最基本的思想來源於金屬退火過程,在退火過程中,熱運動的原子逐漸凍結在勢能最低的位置,從而保證了整塊金屬晶格結構的一致性,達到最佳效能。模擬退火演算法的基本步驟如下: 1. 確定搜尋起始點x

啟發式優化演算法退火演算法

一. 爬山演算法 ( Hill Climbing ) 介紹模擬退火前,先介紹爬山演算法。爬山演算法是一種簡單的貪心搜尋演算法,該演算法每次從當前解的臨近解空間中選擇一個最優解作為當前解,直到達到一個區域性最優解。 爬山演算法實現很簡單,其主要缺點是會陷入區域性最優解,而不一定能搜尋到全域

2899 Strange fuction【爬山演算法 || 模擬退火

Time limit 1000 ms Memory limit 32768 kB Now, here is a fuction: $F(x) = 6 * x7+8*x6+7x3+5*x2-yx (0 <= x <=100) $ Can you fin

2069 Super Star【爬山演算法 || 模擬退火

Time limit 1000 ms Memory limit 65536 kB During a voyage of the starship Hakodate-maru (see Problem 1406), researchers found stra

模擬退火演算法2

     著名的模擬退火演算法,它是一種基於蒙特卡洛思想設計的近似求解最優化問題的方法。 一點歷史——如果你不感興趣,可以跳過 美國物理學家 N.Metropolis 和同仁在1953年發表研究複雜系統、計算其中能量分佈的文章,他們使用蒙特卡羅模擬法計算多分子系統

模擬退火演算法與C語言實現(TSP問題)

1簡介: 模擬退火來自冶金學的專有名詞退火。退火是將材料加熱後再經特定速率冷卻,目的是增大晶粒的體積,並且減少晶格中的缺陷。材料中的原子原來會停留在使內能有區域性最小值的位置,加熱使能量變大,原子會離開原來位置,而隨機在其他位置中移動。退火冷卻時速度較慢,使得原子有較多可能

人工智慧實驗——隨機重啟爬山法,模擬退火演算法,遺傳演算法求解N皇后問題

一、爬山法 爬山法就是完全的貪心演算法,每一步都選最優位置,可能只能得到區域性最優解。本實驗對普通爬山法進行了簡單的優化,採用了傳統爬山法的變種——隨機重啟爬山法,當爬山步數超過一定值時,會重新打亂棋盤,重新“爬山”。 適應度函式:衝突皇后的總對數 “爬山”:每一步就是

[work] 演算法學習筆記 (爬山法,模擬退火演算法,遺傳演算法

在優化問題中,有兩個關鍵點 代價函式 確定問題的形式和規模之後,根據不同的問題,選擇要優化的目標。如本文涉及的兩個問題中,一個優化目標是使得航班選擇最優,共計12個航班,要使得總的票價最少且每個人的等待時間之和最小。第二個問題是學生選擇宿舍的問題,每個學生可以實現填報