blueqat.comにログインすると簡単にJulia環境が使えるので、早速使ってSAを書いてみます。今回は簡単なイジングモデルのハミルトニアンをSA+メトロポリス法で解いてみたいと思います。
今回は適当にコスト関数を設定して解いてみたいと思います。シミュレーテッドアニーリングで、ランダムからスタートし、エネルギーを評価して少しずつ温度を下げていき、T=0.02になったら終了としてみます。
#適当なコスト関数を設定。今回は8変数使いました。
function energy(a)
return a[1]*a[2]-2*a[2]*a[3]+3*a[1]-4*a[4]-5*a[5]+6*a[6]*a[5]+5*a[6]-a[7]+a[8]+a[7]*a[2]
end
#変数の数
N = 8
#初期温度
T = 100
#減衰
r = 0.99
#終了温度
Tf = 0.02
#温度あたりのイテレーションの数
ite = 10
#全て1で初期化
q = ones(N)
println("qinit = ",q)
#エネルギーを表示
println("Einit = ",energy(q))
#温度が終了温度以上の場合、
while T > Tf
for i=1:ite
x = rand(1:N)
qq = copy(q)
qq[x] *= -1
#エネルギー差を計算
dx = energy(qq) - energy(q)
#評価
if exp(dx/T) < rand()
q = copy(qq)
end
end
#温度を下げる
T *= r
end
#最終温度、もとまった変数の値、エネルギーの値を表示
println()
println("Tfinal = ",T)
println("q = ",q)
println("E = ",energy(q))
これを実行することで、
qinit = [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]
Einit = 5.0
Tfinal = 0.01989046877970967
q = [-1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, -1.0]
E = -27.0
このような形で、初期全て1だった変数の値が、最後最小エネルギー-27に落ち着きました。
多分実行もはやかった気がします。
感想
簡単な例題を選んでしまったので、あまりpythonとの違いは感じませんでした。意外と慣れてなくても簡単にかけたので安心しました。次回はもう少し難しい例題をやってみたいと思います。