萌新求助模拟退火
查看原帖
萌新求助模拟退火
398132
爱好MC的蒟蒻楼主2021/10/6 09:12

rt 可能是CSP考前学的最后一个算法了

#include <bits/stdc++.h>
using namespace std;
const double down=0.96;
struct node{
	int x,y,v;
}w[1005];
int n;
double sx,sy,sv;
double get_energy(double x,double y){
	double r=0,ax,ay;
	for(int i=1;i<=n;i++){
		ax=x-w[i].x;
		ay=x-w[i].y;
		r+=sqrt(ax*ax+ay*ay)*w[i].v;
	}
	return r;
}
void mnth(){
	double temp=3000;
	while(temp>1e-15){
		double ax=sx+(rand()*2-RAND_MAX)*temp;
		double ay=sy+(rand()*2-RAND_MAX)*temp;
		double av=get_energy(ax,ay);
		double c=av-sv;
		if(c<0){
			sx=ax;
			sy=ay;
			sv=av;
		}
		else if(exp(-c/temp)*RAND_MAX>rand()){
			sx=ax;
			sy=ay;
		}
		temp*=down;
	}
}
int main(){
	srand((int)time(0));
	cin >>n;
	for(int i=1;i<=n;i++){
		cin >>w[i].x>>w[i].y>>w[i].v;
		sx+=w[i].x;
		sy+=w[i].y;
	}
	sx/=n;
	sy/=n;
	sv=get_energy(sx,sy);
	mnth();
	mnth();
	mnth();
	mnth();
	mnth();
	printf("%.3lf %.3lf",sx,sy);
	return 0;
}

样例不过求助

2021/10/6 09:12
加载中...