26
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

焼きなまし法での評価関数の打ち切り

Posted at

よくある焼きなまし法の擬似コードってこんな感じだと思います。評価値は小さい方が良いとします。

for t in 1, ..., n:
    遷移先の評価値 ← 評価関数(遷移先)
    if exp((現在の評価値 - 遷移先の評価値) / 温度) ≧ random(0, 1):
        現在の状態 ← 遷移先の状態
        現在の評価値 ← 遷移先の評価値

ifの中身の式を変形します。log(random(0, 1))は負の値になることに注意してください。

for t in 1, ..., n:
    遷移先の評価値 ← 評価関数(遷移先)
    if  遷移先の評価値 ≦ 現在の評価値 - 温度 * log(random(0, 1)):
        現在の状態 ← 遷移先の状態
        現在の評価値 ← 遷移先の評価値

右辺は遷移先に依存しないので先に計算しておきます。

for t in 1, ..., n:
    閾値 ← 現在の評価値 - 温度 * log(random(0, 1))
    遷移先の評価値 ← 評価関数(遷移先)
    if 遷移先の評価値 ≦ 閾値:
        現在の状態 ← 遷移先の状態
        現在の評価値 ← 遷移先の評価値

この形に書き直すと評価関数より前に閾値を決められるので、評価値が閾値を超えることが分かったタイミングで評価関数を打ち切ることができます。
例:https://atcoder.jp/contests/future-contest-2019-qual/submissions/3600324

以上、焼きなまし法の説明でよく見る exp((e-e')/T) ≧ p って微妙だよね、という話でした。

26
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?