1. 程式人生 > >模擬退火演算法理論+Python解決函式極值+C++實現解決TSP問題

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

簡述

演算法設計課這周的作業:
趕緊寫了先,不然搞不完了。

文章目錄

演算法理論部分

  • 用粒子的排列或相應的能量表示物體所處的狀態,在溫度T下,物體(系統)所處的狀態具有一定的隨機性。主流趨勢是系統向能量較低的狀態發展,但粒子的不規則熱運動妨礙系統準確落入低能狀態。

簡單來說就是,在溫度T下,

有兩種可能

  • f ( x
    i ) f ( x j )
    f(x_i) \ge f(x_j)
    , 那沒得說有更好的肯定選更好的。
  • f ( x i ) < f ( x j ) f(x_i) < f(x_j) ,這個時候我們也有一定的概率選這個。

概率為

P ( X i j ) = e f ( x i ) f ( x j ) K T P(X_{i\rightarrow j}) = e^{\frac{f(x_i) - f(x_j)}{KT}}

其中K為玻爾茲曼常數(在這個演算法上,我們經常使用數值1代替這個)

  • K > 0 K>0 ,一般設定為 K = 1 K=1
  • T > 0 T > 0 ,我們在遞減的過程中,終止的T,一般認為是 T = 1 T = 1

變數簡單分析

不難看出,隨著T下降,這個狀態轉移的概率是下降的。

  • 原因: f ( x i ) f ( x j ) < 0 f(x_i) - f(x_j) < 0

物理上解釋:

  • 因為之前的這個轉移概率,認為是,在高溫情況下,分子可能會產生較為不穩定的隨機運動。且溫度越高,這個分子不規則運動的可能是更大的。這是在模擬這個過程。

  • 所以,我們稱這個演算法為,模擬退火演算法

從狀態轉移概率到狀態概率

這個分析過程,其實是類似於推理馬爾可夫鏈的過程。

  • 之前給給出的 P ( X i j ) P(X_{i\rightarrow j}) 其實是條件概率。

我們假設第n個狀態為 X i X_i ,那麼現在就是考慮下一個狀態的概率。

P ( s n + 1 = X j s n = X i ) = P ( X i j ) = e f ( x i ) f ( x j ) K T P(s_{n+1} = X_j| s_n =X_i) = P(X_{i\rightarrow j})= e^{\frac{f(x_i) - f(x_j)}{KT}}

我們用 s n s_n ,表示第n個狀態。

用條件概率公式得到

P ( s n + 1 = X j s n = X i ) = P ( s n + 1 = X j , s n = X i ) P ( s n = X i ) P(s_{n+1} = X_j| s_n =X_i) = \frac{P(s_{n+1} = X_j, s_n =X_i)}{P(s_n =X_i)}

P ( s n + 1 = X j , s n = X i ) = P ( s n = X i ) P ( s n + 1 = X j s n = X i ) P(s_{n+1} = X_j, s_n =X_i) = P(s_n =X_i)* P(s_{n+1} = X_j| s_n =X_i)
P ( s n + 1 = X j ) = i P ( s n = X i ) P ( s n + 1 = X j s n = X i ) P(s_{n+1} = X_j) = \sum_{i}{P(s_n =X_i)* P(s_{n+1} = X_j| s_n =X_i)}