OSDN Git Service

update simulated-annealing.md
authorMout-sea <2582621015@qq.com>
Tue, 6 Aug 2019 11:29:57 +0000 (19:29 +0800)
committerMout-sea <2582621015@qq.com>
Tue, 6 Aug 2019 11:29:57 +0000 (19:29 +0800)
docs/misc/simulated-annealing.md

index 66f6103..398a491 100644 (file)
@@ -10,7 +10,7 @@
 
 >  **什么是退火?** (选自百度百科)
 >
-> 退火是一种金属热处理工艺,指的是将金属缓慢加热到一定温度,保持足够时间,然后以适宜速度冷却。目的是降低硬度,改善切削加工性;消除残余应力,稳定尺寸,减少变形与裂纹倾向;细化晶粒,调整组织,消除组织缺陷。准确的说,退火是一种对材料的热处理工艺,包括金属材料、非金属材料。而且新材料的退火目的也与传统金属退火存在异同。
+>  退火是一种金属热处理工艺,指的是将金属缓慢加热到一定温度,保持足够时间,然后以适宜速度冷却。目的是降低硬度,改善切削加工性;消除残余应力,稳定尺寸,减少变形与裂纹倾向;细化晶粒,调整组织,消除组织缺陷。准确的说,退火是一种对材料的热处理工艺,包括金属材料、非金属材料。而且新材料的退火目的也与传统金属退火存在异同。
 
 由于退火的规律引入了更多随机因素,那么我们得到最优解的概率会大大增加。于是我们可以去模拟这个过程,将目标函数作为能量函数。
 
@@ -100,8 +100,27 @@ int main() {
 
 * * *
 
+## 一些 trick
+
+### 分块模拟退火
+
+有时函数的峰很多,模拟退火难以跑出最优解。
+
+此时可以把整个值域分成几段,每段跑一遍模拟退火,然后再取最优解。
+
+### 卡时
+
+有一个 `clock()` 函数,返回程序运行时间。
+
+可以把主程序中的 `simulateAnneal();` 换成 `while ((double)clock() / CLOCKS_PER_SEC < MAX_TIME) simulateAnneal();` 。这样子就会一直跑模拟退火,直到即将 TLE 。
+
+这里的 `MAX_TIME` 是一个自定义的略小于时限的数。
+
+* * *
+
 ## 习题
 
 -   [「BZOJ 3680」吊打 XXX](https://www.lydsy.com/JudgeOnline/problem.php?id=3680)
 -   [「JSOI 2016」炸弹攻击](https://www.lydsy.com/JudgeOnline/problem.php?id=4852)
 -   [「HAOI 2006」均分数据](https://www.lydsy.com/JudgeOnline/problem.php?id=2428)
+