% 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;
posted @ 2023-11-01 07:23  Pwtking  阅读(68)  评论(0)    收藏  举报