退火玄学WA
查看原帖
退火玄学WA
205782
R浩轩泽Anmicius楼主2020/8/16 22:30

蒟蒻今天刚学的玄学退火...

除了Metropolis准则完全搞不懂以外还不怎么会调参,以至于现在都不知道是WA在调参上还是算法上www

代码如下:

#pragma GCC opitimize(2)
#pragma GCC opitimize(3)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iomanip>
#include<cmath>
#include<ctime>
using namespace std;
#define int double
#define re register long
const int cool=0.998;
//const int mintemp=1e-15;
const long N=15;
const long M=1e3+5;
int n,m,r,ansx,ansy;
struct Building{
	int x;
	int y;
	int r;
}builds[N];
struct Node{
	int x;
	int y;
}enemy[M];
long ans;
inline long kill(int x,int y)
{
	int minr=r;
	long cnt=0;
	for(re i=1;i<=n;++i)
	minr=min(minr,sqrt(pow(x-builds[i].x,2)+pow(y-builds[i].y,2))-builds[i].r);
	for(re i=1;i<=m;++i)
	if(sqrt(pow(x-enemy[i].x,2)+pow(y-enemy[i].y,2))<=minr)
	++cnt;
	return cnt;
}
inline void SA()
{
	int temp=1e5;
	while(temp>1e-15)
	{
		int nx=ansx+(rand()<<1-RAND_MAX)*temp;
		int ny=ansy+(rand()<<1-RAND_MAX)*temp;
		int nw=kill(nx,ny);
		//cout<<nw<<endl;
		int delta=nw-ans;
		if(delta>0)
		{
			ansx=nx;
			ansy=ny;
			ans=nw;
		}
		else if(exp(-delta/temp)*RAND_MAX<rand())
		{
			ansx=nx;
			ansy=ny;//注意此处并没有更新ans
		}
		temp*=cool;
	}
}
signed main(void)
{
	ios::sync_with_stdio(false);
	srand((unsigned long)time(0));
	cin>>n>>m>>r;
	for(re i=1;i<=n;++i)
	cin>>builds[i].x>>builds[i].y>>builds[i].r;
	for(re i=1;i<=m;++i)
	{
		cin>>enemy[i].x>>enemy[i].y;
		ansx+=enemy[i].x;
		ansy+=enemy[i].y;
	}
	ansx/=n;
	ansy/=n;
	ans=kill(ansx,ansy);
	while(clock()<950)SA();
	cout<<ans<<'\n';
	return 0;
}

求dalao指明错误

2020/8/16 22:30
加载中...