模擬退火演算法例子

2021-07-09 16:18:26 字數 1457 閱讀 7652

求解某乙個方程fun(x)的極小值,很常見的以一種情況是當前的x不管增大還是減小,函式值fun(x)均是增大,這時x就是極值。這是一種完完全全的貪心演算法。這樣求出的極小值,並不一定整段函式的全域性極小值,而極可能是區域性極小值。

例如下圖

可以看出,有三個點,均是極小值點,在這是三個點處,不管增大變數,或是減小變數,目標函式的值都會增大。而只有最左邊的那個點,才是全域性最優解。

從數學模型上來看,是一種全域性極小值求解問題,擴充套件到物理意義上,舉幾個例子:

我們什麼pid引數,才是最優秀的呢?我們什麼pid引數,才能讓控制達到快準狠?自己乙個乙個的去套嗎,累死。當然也可以用計算機乙個乙個去套,但是這樣仍然非常花時間。利用模擬退火演算法,就可以很好的求出最優pid引數。

再比如我們的聚類演算法,什麼樣的碼本設計,才能使得向量量化的誤差減為最小,這仍然是乙個全域性最優搜尋問題。

求解全域性最優解,有很多方法,模擬退火法只是我們其中乙個,

除此之外,還有遺傳演算法、禁忌搜尋演算法、蟻群演算法、粒子群演算法等等。各有優缺點。

模擬退火演算法,顯著的缺點是 相較其他演算法,其穩定速度較慢,優點是在引數合適的情況下基本上可以100%得到全域性最優解。

求解乙個一維輸入一維輸出函式的全域性最小解。這個思想也可以擴充套件到求解任意函式,輸出point時,的輸入應該為多少。

例如:已知函式f(x),我們想求輸出3時的輸入x為多少。我們可以將目標函式變換為

m(x) = (f(x)-3).^2 (平方或是求絕對值)

這樣就轉換為求解m(x)全域性最小值0的問題。即當x滿足f(x)=3 時,m(x)才能滿足全域性最小值。

我的vc**裡面是求解sin(x)+cos(0.3*x)這函式,x範圍[-10 ,10]的全域性極小值。

關於模擬退火,有乙個有趣的比喻,幫助大家學習和理解:

一般區域性極小值演算法:兔子朝著比現在高的地方跳去。它找到了不遠處的最高山峰。但是這座山不一定是珠穆朗瑪峰。這就是爬山演算法,它不能保證區域性最優值就是全域性最優值。

模擬退火:兔子喝醉了。它隨機地跳了很長時間。這期間,它可能走向高處,也可能踏入平地。但是,它漸漸清醒了並朝最高方向跳去。這就是模擬退火。

模擬退火演算法是用來求解最優化問題的演算法。比如著名的tsp問題函式最大值最小值問題等等。接下來將以如下幾個方面來詳細介紹模擬退火演算法。

1. 模擬退火演算法認識

2. 模擬退火演算法描述

3. 費馬點問題求解

4. 最小包含球問題求解

5. 函式最值問題求解

6. tsp問題求解

Dinic演算法例子

寫法 1 用鄰接矩陣儲存各個流的起點終點 2 用bfs把圖分出層次 記錄到各個點需要流幾次 3 用dfs對圖找出增廣路進行流量擴充 注意反向流要記錄成容量為0的路徑,更新正向流時也要更新反向流 教材361頁 includeusing namespace std struct edge edge ed...

分治演算法 例子

分治策略 將問題分解成若干個小的子問題,每個子問題與大問題同型 所以裡面可以用遞迴 但規模更小 遞迴解決這些子問題 將子問題的解答合併,獲得大問題的解答 最大欄位和問題 include include include using namespace std int a 100 int maxsum ...

排序演算法例子

氣泡排序 include using namespace std 氣泡排序,時間複雜度o n 2 穩定,比較次數最少n 1,最多n n 1 2 void bubble sort int list,int num int main bubble sort2 arraylist,len for int ...