牛马的退火模版,根据实际情况调参即可 ```cpp void sa() { ans=calc();//计算初始状态 for (double t=1000; t>1e-10; t*=0.997) {//初始温度、末温度、降温参数根据题目修改 ......//产生一个新的状态,如果类似函数的问题则转移距离要和当前温度有关 double/int/... now=calc(), d=now-ans; //计算新状态的价值和差距 if (d<0) ans=now, ......;//如果更优直接到新的状态并更新状态 if (exp(-1.0*d/t)*RAND_MAX>rand()) ......//如果在一定容差范围内则接受新状态 } } ``` 注: 1. 若最优值是最大值,则需要将 $d=now-ans$ 改为 $d=ans-now$ 2. 若要记录最优答案的状态,则在更新 $ans$ 时记录答案,其实最后的状态有大概率已经是答案了 3. 若不同状态的答案差距很小并且状态也很小,则需要适当调低初始温度,若不同的状态对应的答案取值很少,还需要考虑换成爬山算法。 4. 末温度尽量低,$Δt$ 尽量大。 5. 部分(很少)题目有必要多跑几次退火。 Loading... 牛马的退火模版,根据实际情况调参即可 ```cpp void sa() { ans=calc();//计算初始状态 for (double t=1000; t>1e-10; t*=0.997) {//初始温度、末温度、降温参数根据题目修改 ......//产生一个新的状态,如果类似函数的问题则转移距离要和当前温度有关 double/int/... now=calc(), d=now-ans; //计算新状态的价值和差距 if (d<0) ans=now, ......;//如果更优直接到新的状态并更新状态 if (exp(-1.0*d/t)*RAND_MAX>rand()) ......//如果在一定容差范围内则接受新状态 } } ``` 注: 1. 若最优值是最大值,则需要将 $d=now-ans$ 改为 $d=ans-now$ 2. 若要记录最优答案的状态,则在更新 $ans$ 时记录答案,其实最后的状态有大概率已经是答案了 3. 若不同状态的答案差距很小并且状态也很小,则需要适当调低初始温度,若不同的状态对应的答案取值很少,还需要考虑换成爬山算法。 4. 末温度尽量低,$Δt$ 尽量大。 5. 部分(很少)题目有必要多跑几次退火。 最后修改:2025 年 07 月 02 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏