[模拟退火-优雅的暴力]

题单介绍

## 前言:本片适用于 模拟退火入门-进阶 **模拟退火(SA)** 是一种 **随机化**算法。当一个问题的方案数量极大(甚至是**无穷**的)而且不是一个单峰函数时,我们常使用模拟退火求解。 一般的,很多题都可以用模拟退火~~水过~~,在OI界称之 **[优雅的暴力]** ### 模拟退火算法入门 先用一句话概括(再借OIWIKI):模拟退火=如果新状态的解更优则修改答案,否则以一定概率接受新状态 就是先随机出一个答案,如果这个答案是当前最优的就更新最优答案,反之则以一定概率认为这个答案可能更接近最优答案,而接受这个答案 下面是重点:如何 **随机出一个答案** 和 **确定接受新状态的概率**(并且要使随机出的答案尽可能接近最优解) 这就要引入一个新概念 **退火** 退火=固体退火原理,指固体在高温下徐徐冷却的事情 模拟退火的实现也近似固体退火原理,先有三个参数表示初始温度 $T_0$ ,降温系数 $d$ ,终止温度 $T_k$ 。其中 $T_0$ 是一个比较大的数,$d$ 是一个非常接近 1 但是小 1 的数, $T_k$ 是一个接近0的正数。 先将温度T初始成 $T_0$ ,每一次将 $T*=d$ ,直到 $T$ 到达$T_k$ ![](https://oi-wiki.org/misc/images/simulated-annealing.gif) 现在我们开始解决如何 **随机出一个答案** 和 **确定接受新状态的概率** 1. 随机出一个答案:根据题目而变,但一般是随机出的,但是和简单的随机不同,这个答案一般是根据先有的解(注意,不一定是最优解,因为有一定概率我们接受了一个可能更接近最优答案的答案),在此基础随机出的 2. 确定接受新状态的概率:一般比较固定,常见写法是 ```if (exp(-delta(随机出一个答案-当前最优解) / t(当前温度)) > (double)rand() / RAND_MAX;)接受新状态``` ### 模拟退火算法进阶 1. 关于参数 模拟退火的参数基本上决定了代码的准确性,**一般的, $T_0$ 越高, $T_k$ 越低( $T_k >0$ ),$d$ 越接近 $1$ ,模拟退火越准确,** 但时间越长,建议在写模拟退火是要卡卡参数 2. 关于随机数 模拟退火的精髓就在随机数上,随机数的随机性,循环周期基本上决定了准确度,随机性差,循环周期短的很可能将模拟退火卡掉,[建议参考这来优化随机数](https://oi-wiki.org//misc/random/) 3. 关于时间 模拟退火是一个**不太稳定**的算法 ~~(谁叫他随机)~~,单次可能找不到最优解,一般的要多次运行,有一个 ```clock()``` 函数,返回程序运行时间,建议在**不超时**的情况下尽可能多跑 一般的,可以这样```while ((double)clock()/CLOCKS_PER_SEC < MAX_TIME(一个小于时限的参数)) SA()(进行模拟退火);``` ### 模拟退火算法例题 #### 计算几何(基本思想:在当前点上尝试) - [P1337 [JSOI2004]平衡点 / 吊打XXX](https://www.luogu.com.cn/problem/P1337) - [P5544 [JSOI2016]炸弹攻击1](https://www.luogu.com.cn/problem/P5544) - [P4035 [JSOI2008]球形空间产生器](https://www.luogu.com.cn/problem/P4035)(注意精度) - [P4703 偷上网](https://www.luogu.com.cn/problem/P4703) - [CF2C Commentator problem](https://www.luogu.com.cn/problem/CF2C) - [P4274 [NOI2004] 小H的小屋](https://www.luogu.com.cn/problem/P4274) - [SP4587 FENCE3 - Electric Fences](https://www.luogu.com.cn/problem/SP4587) #### 最优序列(基本思想:在当前序列上重新构造) - [P3936 Coloring](https://www.luogu.com.cn/problem/P3936) - [P2503 [HAOI2006]均分数据](https://www.luogu.com.cn/problem/P2503) - [P2538 [SCOI2008]城堡](https://www.luogu.com.cn/problem/P2538) - [P3878 [TJOI2010]分金币](https://www.luogu.com.cn/problem/P3878) - [P4966 基地建设](https://www.luogu.com.cn/problem/P4966) #### 其他(一般是数据太水的) - [P4360 [CEOI2004]锯木厂选址](https://www.luogu.com.cn/problem/P4360) - [P1742 最小圆覆盖](https://www.luogu.com.cn/problem/P1742) (注意精度) ### 其他(参考文献等) [广告1:如果你没有学习过模拟退火,看这里](https://oi-wiki.org//misc/simulated-annealing/) [广告2:如果你没有学习过模拟退火,看这里](https://www.luogu.com.cn/blog/Darth-Che/mu-ni-tui-huo-xue-xi-bi-ji) ### 更新日志 2021:08:05 更正 P4360 数据过水,且正解非退火

题目列表

  • [JSOI2004] 平衡点 / 吊打XXX
  • [JSOI2016] 炸弹攻击1
  • [JSOI2008] 球形空间产生器
  • 最小圆覆盖
  • 偷上网
  • Commentator problem
  • FENCE3 - Electric Fences
  • [CEOI 2004] 锯木厂选址
  • Coloring
  • [HAOI2006] 均分数据
  • [SCOI2008] 城堡
  • [TJOI2010] 分金币
  • 基地建设
  • [NOI2004] 小H的小屋