iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 27
0
自我挑戰組

Julia語言—從入門到專案系列 第 27

[Day 27] Simulated annealing -- 重新實作(ii)

狀態

abstract State

immutable StatePair
    current::State
    proposal::State
end

immutable ConcreteState <: State
    value::Float64
end

由於模擬退火法敘述的是有不同狀態,這些狀態空間可勝部同參數的排列組合,所以這邊先把狀態抽象化。
這邊抽取出State這個抽象型別,以後方便大家擴充。
另外設計了StatePair他是為了方便在每次的計算可以不用兩個變數,直接一個變數包裝就可以打死,主要是可以避免太過冗長的程式碼,這邊我有在考慮到底是要還是不要,因為感覺有點多餘。
ConcreteState就是直接拿來擴充的範例。

Acceptance, energy function and loss function

function boltzmann_factor(g::Function, temperature::Float64)
    if temperature == 0.0
        return 0.0
    end
    ΔE = g()
    if ΔE < 0.0
        return 1.0
    end
    return exp(-ΔE / temperature)
end

function acceptance(sym::Type{Val{:energy}}, f::Function, states::StatePair, temperature::Float64)
    g = () -> f(states.proposal) - f(states.current)
    return boltzmann_factor(g, temperature)
end

function acceptance(sym::Type{Val{:loss}}, f::Function, states::StatePair, temperature::Float64)
    g = () -> f(states.proposal, states.current)
    return boltzmann_factor(g, temperature)
end

acceptance(sym::Symbol, f::Function, states::StatePair, temperature::Float64) = acceptance(Val{sym}, f, states, temperature)

這邊為了大家方便所以寫了兩種acceptance

  1. 一種版本是考慮到大家有可能一個狀態可以單獨算出一個energy的值,這是比較一般的case,所以使用者需要給的是energy function
  2. 另一種是你的狀態無法精準算出energy,但是可以算出相對距離,也就是給不俱備絕對測量值的case用的,那他可以藉由定義好loss function,然後由這邊的套件幫你執行計算

這邊也是用到dispatch on value的方法,藉由指定:loss或是:energy去選擇要用的是哪個版本的acceptance

boltzmann_factor是我去查了一些物理的統計力學名詞之後得出來的名字,當狀態轉成能量差後,把能量差除上溫度會是所謂的entropy,也就是熵,或是說亂度。
亂度放在指數的位置的話,會被轉成機率值,而這個機率值會呈現Boltzmann distribution,兩個機率值的比率就被定義為Boltzmann factor。
雖然我不知道Boltzmann factor的物理意義是什麼就是了.....


上一篇
[Day 20] 整理Reactive programming
下一篇
[Day 28] Simulated annealing -- 包成套件並測試
系列文
Julia語言—從入門到專案31

尚未有邦友留言

立即登入留言