退火求调
查看原帖
退火求调
788881
ririTLE楼主2024/5/7 00:41

不知为什么会输出一个很随机的东西,应该不是参数的问题,本人已傻

#include<bits/stdc++.h>
using namespace std;
int n;
double T=1984,k=0.9989,l=1e-14,gailv,z=RAND_MAX,F;
struct node{
	double x,y,w;
}a[1005],ans,ansb,best,t,high;
double random(double p,double q){
	return double(rand())/z*(q-p)+p;
}
bool better(){
	F=0.0;
	for(int i=1;i<=n;i++){
		F+=(sqrt((a[i].x-ansb.x)*(a[i].x-ansb.x)+(a[i].y-ansb.y)*(a[i].y-ansb.y)))*a[i].w;
	}
	if(F<best.w) return 1;
	gailv=exp((best.w-F)/T);
	return 0;
}
void sa(){
	while(T>l){
		ansb.x=ans.x+(random(-10000.000,10000.000))*T;
		ansb.y=ans.y+(random(-10000.000,10000.000))*T;
		//printf("%.3lf %.3lf",ansb.x,ansb.y);
		//cout<<endl;
		if(better()){
			ans=ansb;best=ansb;
		}
		else if(gailv*z>rand()) ans=ansb;
		T*=k;
	}
}
int main(){
	srand(time(0));
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%lf%lf%lf",&a[i].x,&a[i].y,&a[i].w);
		ans.x+=a[i].x;ans.y+=a[i].y;
	}
	ans.x/=n;ans.y/=n;
	for(int i=1;i<=n;i++){
		ans.w+=sqrt((a[i].x-ansb.x)*(a[i].x-ansb.x)+(a[i].y-ansb.y)*(a[i].y-ansb.y))*a[i].w;
	}
	best=ans;t=ans;high.w=best.w;
	for(int i=1;i<=10;i++){
		T=5e3+i;ans=t;best=t;sa();
		if(best.w<high.w)high=best;
	}
	printf("%.3lf %.3lf",high.x,high.y);
	return 0;
}
2024/5/7 00:41
加载中...