请教各位一个事情
查看原帖
请教各位一个事情
239895
Yusani_huh楼主2021/12/6 23:40

我最初的模拟退火函数是这样写的:

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;
	}
}

PDDpair<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;
	}
}

就过了。

请问这两种随机新点的方式有什么不同啊?我感觉看上去效果是差不多的啊。

2021/12/6 23:40
加载中...