我最初的模拟退火函数是这样写的:
void month(){
for(double t=3e3;t>=1e-15;t*=0.996){
PDD nw(random(cur.x-t,cur.x+t),random(cur.y-t,cur.y+t));
double dt=calc(nw)-calc(cur);
if(exp(-dt/t)>random(0,1)) cur=nw;
}
}
(PDD
为pair<double,double>
)
其中random
函数是这样的:
double random(double l,double r){
return rand()*1.0/RAND_MAX*(r-l)+l;
}
结果发现连样例都出入很大
后来参照题解把函数改成了:
void month(){
for(double t=3e3;t>=1e-15;t*=0.996){
PDD nw(cur.x+t*(rand()*2-RAND_MAX),cur.y+t*(rand()*2-RAND_MAX));
double dt=calc(nw)-calc(cur);
if(exp(-dt/t)>random(0,1)) cur=nw;
}
}
就过了。
请问这两种随机新点的方式有什么不同啊?我感觉看上去效果是差不多的啊。