質問


問題名 ユーザ名 質問 回答 全体公開 投稿日時 最終更新日時
chaemon
焼きなまし法の実装において、最適値が更新されたらそれを覚えておいてそれを最後に返すのではく、最新のものを返すようになっているため、見つかった最適解でないものが返ってきちゃうことはありませんか?つまり、最適じゃないのをたまたま採用したところ、そこでtime limitが来て返されるという現象がありそうに見えますがどうなんでしょう?
今回の焼きなまし法のサンプルコードは、入門者向けに本質的な部分のみを実装したものになるため、質問の通り見つかった最良解ではないものが返ってくる場合は存在します。
そのため、必要に応じて、最良解を保持して返すような実装を各自で行っていただければと思います。
Yes
igaxx
文脈が小さいと何故山登り、焼きなましがよくなるのでしょうか?
もしくは逆に、文脈が大きいと何故ビームサーチが良くなるのでしょうか?
まず基本的に、ビームサーチより焼きなましの方が強くなりやすいです。なぜなら、焼きなましは解の全体(配送ルート全体)を見て評価することができるのに対して、ビームサーチは解の途中の状態(i番目までのルート)で評価する必要があるためです。解の途中の状態で評価する場合、例えば「行ってないレストランが凄く遠い」といった要素を評価するのが難しいですが、焼きなましだと全部確定した状態で評価することになるので評価が簡単かつ正確になります。

しかし、文脈が強い場合、近傍で少し変化させた先の解が良い解でなかったり、有効な解にならなかったりします。そのため、近傍で良い解に行く確率が低くなり、焼きなましが弱くなるため、ビームサーチの方が相対的に強くなりやすいです。
Yes
A - Food Delivery gmmtea
ちょっとした疑問です。
山登り法において「操作後の距離が現在(操作前)の距離以下なら採用」という方針になっているようですが、「操作後の距離が現在(操作前)の距離*未満*なら採用」でないことに意図はありますか?
Ruby コードで言うと下記の箇所でインデントが二重になっている意図がわかりませんでした。

```
    # 【穴埋め】操作後の距離が現在(操作前)の距離以下なら採用
    # 【ヒント】現在の距離はcurrent_distに入っている
    if new_dist <= current_dist
      # 進行状況を可視化するため、距離が真に小さくなったら、現在の試行回数と合計距離を標準エラー出力に出力
      if new_dist < current_dist
        $stderr.puts "iteration: #{iteration}, total distance: #{new_dist}"
      end
    ...
```
同じ距離のルートに変更することを許すことで、より多くのルートを調べることができるので良いルートを見つけやすいという理由です。
Yes
A - Food Delivery jupiter_68
近傍を適用する際に用いられる乱数生成の関数 "std::mt19937" はどの程度の計算量になるのでしょうか?
また山登り法を行うのに際して、制限時間2.0secの間にどの程度の試行が行われるのでしょうか?
教えていただければ幸いです。
std::mt19937は「メルセンヌツイスタ」という乱数生成アルゴリズムで、O(1)のアルゴリズムです。
ただ少々重めなので、近傍計算が非常に軽い時はボトルネックになることもあります。そのような場合は、例えばxorshiftなどの軽いアルゴリズムを使用してみるのも良いです。

試行回数は近傍の重さに依存しますが、O(1)の近傍であれば2.0secの間に概ね10^7~10^8回くらいと思って頂けると良いかなと思います。
Yes
kaede2020_admin
質問がある場合は以下の質問事項をご記入ください
①テーブル名
②言語
③質問内容
Yes