模拟退火学习笔记

依旧学完就忘()

以下内容摘自 OI-wiki

UVA10228 A Star not a Tree?

板子题。设答案为 \((x,y)\),根据 \(T\) 的值随机移动并 \(O(n)\) check。

P1337 [JSOI2004]平衡点/吊打XXX

板子题,同上。改一下 check 的写法就可以。

P5544 [JSOI2016]炸弹攻击1

设答案点在 \((x,y)\)。正常写 checker 可能会出现周围都是 \(0\),从而跳不出去的情况。
所以当该点答案为 \(0\) 时,我们以 “半径至少扩大多少能使答案变成 \(1\)” 作为参考,从而保证函数相对连续。
那么把函数的返回值设为 \(-k\times mn+cnt\)。其中 \(k\) 是待定系数。
此题求最大值,求当前解不优但接受的概率时 \(\Delta\) 前不加负号。否则会退化成爬山。
调参调自闭了。

随机取新点的时候记得这样写:

db nx=x+(Rand()*2.0-1)*T*50.0;
db ny=y+(Rand()*2.0-1)*T*50.0;

不然调参调死也过不了。有大佬浇浇原理吗/kel

P3878 [TJOI2010]分金币

先将金币均分为两半作为初始值。
退火时每次随机在两堆中各选择一枚金币尝试进行交换,判断答案是否更优即可。

P2503 [HAOI2006]均分数据

考虑如果题意变为分成 \(m\) 个连续段的话怎么求。设 \(f_{i,j}\) 表示前 \(i\) 个分了 \(j\) 组,转移显然,这里不写了。
然后我们模拟退火随机交换这个序列中的数,对于新的序列用 dp 来 check 是否为更优解。

先写这些,以后啥时候做模拟退火再补充qwq

posted @ 2022-11-22 07:48  樱雪喵  阅读(66)  评论(1编辑  收藏  举报