abstract State
immutable StatePair
current::State
proposal::State
end
immutable ConcreteState <: State
value::Float64
end
由於模擬退火法敘述的是有不同狀態,這些狀態空間可勝部同參數的排列組合,所以這邊先把狀態抽象化。
這邊抽取出State
這個抽象型別,以後方便大家擴充。
另外設計了StatePair
他是為了方便在每次的計算可以不用兩個變數,直接一個變數包裝就可以打死,主要是可以避免太過冗長的程式碼,這邊我有在考慮到底是要還是不要,因為感覺有點多餘。ConcreteState
就是直接拿來擴充的範例。
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
。
這邊也是用到dispatch on value的方法,藉由指定:loss
或是:energy
去選擇要用的是哪個版本的acceptance
。
boltzmann_factor
是我去查了一些物理的統計力學名詞之後得出來的名字,當狀態轉成能量差後,把能量差除上溫度會是所謂的entropy,也就是熵,或是說亂度。
亂度放在指數的位置的話,會被轉成機率值,而這個機率值會呈現Boltzmann distribution,兩個機率值的比率就被定義為Boltzmann factor。
雖然我不知道Boltzmann factor的物理意義是什麼就是了.....