退火WAWA求助
查看原帖
退火WAWA求助
205782
R浩轩泽Anmicius楼主2020/8/28 22:58

代码如下:

#pragma GCC opitimize(2)
#pragma GCC opitimize("Ofast")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<ctime>
#include<cmath>
#include<iomanip>
#include<cstdlib>
using namespace std;
#define int long double 
#define re register long
const long N=15; 
const int T=1e3,cool=0.995,mintemp=1e-15;
int n,node[N][N],dis[N],ans[N],variance;//node[N+2]存目前圆心坐标,dis每个点到圆心的距离
inline int dist(long num)
{
	int res=0;
	for(re i=1;i<=n;++i)
	res+=pow(node[num][i]-node[(long)(n+2)][i],2);
	return sqrt(res);
}//点到圆心的距离
inline int energy()
{
	int res=0,tot=0;
	for(re i=1;i<=n+1;++i)
	{
		dis[i]=dist(i);
		res+=dis[i];
	}
	res/=(n+1);
	for(re i=1;i<=n+1;++i)
	tot+=pow(dis[i]-res,2);
	return tot;
}
inline void SA()
{
	int temp=T;
	while(temp>mintemp)
	{
		int coor[N];
		for(re i=1;i<=n;++i)
		coor[i]=node[(long)(n+2)][i]+(rand()*2-RAND_MAX)*temp;
		int newe=energy();
		if(newe<variance)
		for(re i=1;i<=n;++i)
		{
			node[(long)(n+2)][i]=coor[i];
			ans[i]=coor[i];
			variance=newe;
		}
		else if(exp(-(newe-variance)/temp)>rand()/RAND_MAX)
		for(re i=1;i<=n;++i)node[(long)(n+2)][i]=coor[i];
		temp*=cool;
	}
}
inline void starts()
{
	memset(node,0,sizeof(node));
	memset(ans,0,sizeof(ans));
}
signed main(void)
{
	ios::sync_with_stdio(false);
	srand(time(NULL));srand(rand());
	cin>>n;
	starts();
	for(re i=1;i<=n+1;++i)
	for(re j=1;j<=n;++j)
	cin>>node[i][j];
	variance=energy();
	while((int)clock()/CLOCKS_PER_SEC<0.8)SA();
	//while(variance)SA();
	for(re i=1;i<=n;++i)cout<<fixed<<setprecision(3)<<ans[i]<<' ';
	//cout<<variance<<endl;
	return 0;
}

wa了100分...希望大佬帮帮忙诶

2020/8/28 22:58
加载中...