% Nb 颓 |

-
三个要点:
-
- 初始温度:目前比较好用的 \([10^3,10^5]\) 不等,必要的时候 \(>1e9\)
-
- (但有时过不了的时候可以尝试初温调到 \(1\)。
-
- 降温系数:\(0.99\) 左右吧,或者可以 \(0.9919,0.99919\)
-
- 最终温度:\(1^{-x},x \in [5,18]\) 比较行!
-
判断接受解:
else if (exp((ans-now)/T)<(double)rand()/RAND_MAX)
-
关于大于小于号:若答案要求最大值接受解时用 \(<\),舍弃解时 \(>\);若要求答案最小值时反之。
-
退火的时候可以卡时多退几次:
while ((double)clock()/CLOCKS_PER_SEC<0.9) SA();
-
尽量保持 getans 部分复杂度尽量低,尽量使遍历次数低于 \(10^3\) 级
-
退火时随机解一定要由当前解转移过来
-
随机数一定要用
mt19937,其范围为 \([0,2^{32}]\),RAND_MAX为 \(2^{32}\) -
退火时考虑一下答案的离散状况,离散程度较高的退火效果很差。(计算几何类问题较适用模拟退火)
-
生成小数:
double a=Rand();
while (a>n) a/=10;
- 生成负数:
ll a=((ll)(ansa+((ll)(Rand()*2-RAND_MAX))*T)%n+n)%n+1;
ll a=((ll)((Rand()*2-RAND_MAX)*T)%n+n)%n+1;

浙公网安备 33010602011771号