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

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 って微妙だよね、という話でした。


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308628084.html

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-02-21
  • 2021-08-15
  • 2021-10-22
  • 2022-01-28
  • 2021-10-04
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-01-25
  • 2022-12-23
  • 2021-10-26
  • 2022-12-23
  • 2022-12-23
  • 2021-11-06
相关资源
相似解决方案