接受的概率是 \(e^{\frac{\Delta f}{t}}\times 100 \%\)
代码 exp(df/t)*RAND_MAX>rand()
\(\Delta f\) 是负数!
模板
double t,d=0.999;
void sa()
{
for(int i=1;i<=100;i++)
{
double f1=fun();
/*
随机乱搞变化状态
生成[-randmax,randmax]的随机数:rand()*2-RAND_MAX
*/
double f2=fun();
double df=f1-f2;
if(df<0)
{
//接受
}
else if(exp(df/t)*RAND_MAX>rand())//本质是生成一个[0,1]之间的整数与e^(df/t)比较,乘过去即可
{
//接受
}
t*=d;
}
}
卡时
time(0);
//do something
while(clock()<0.9*CLOCKS_PER_SEC)sa();//0.9!!!
cout<<ans<<endl;
标签:RAND,rand,df,int,模拟退火,Delta
From: https://www.cnblogs.com/tai-chi/p/18340972