模拟退火求调!!!
查看原帖
模拟退火求调!!!
989997
DGL__DGL_AFO楼主2024/6/19 21:51

样例都不过,怎么会是捏

#include<bits/stdc++.h>
using namespace std;
int n;
double a[14][14];
double ans[14],dgl;
double cnt[14],np[14];
double res[14],res1,res2,op=1e18,maxx=-1e18,minn=1e18;
double dt;

double rand(double l,double r)
{
	return (double)rand()/RAND_MAX*(r-l)+l;
}

void fc()
{
	res2=0;
	for(int i=1;i<=n;i++)
		res2+=abs(res1-res[i]);
	dgl=min(dgl,res2);	
}

void SA()
{
	dgl=11451400;
	
	for(int i=1;i<=n;i++)
	  cnt[i]=rand(0,40000);
	  
	for(double t=20000;t>1e-5;t*=0.99)
	{
		for(int i=1;i<=n;i++)
		  np[i]=rand(cnt[i]-t,cnt[i]+t);
		  
		double d=0;
		for(int i=1;i<=n+1;i++) 
		{
			double js=0;
			for(int j=1;j<=n;j++)
		    js+=(np[j]-a[i][j])*(np[j]-a[i][j]);
		  js=sqrt(js);
			d+=js;  
		  res[i]=js;
		} 
		res1=d/n;
		fc();
		d=res2;  
	
		
		double dd=0;
		for(int i=1;i<=n+1;i++)
		{
			double js=0;
			for(int j=1;j<=n;j++)
			  js+=(cnt[j]-a[i][j])*(cnt[j]-a[i][j]);
			js=sqrt(js);
			dd+=js;
			res[i]=js;
		} 
		res1=dd/n;
		fc(); 
		dd=res2;
		
		dt=d-dd;
		
		//cout<<dt<<endl;
		
		if(exp(-dt/t)>rand(0,1))
		{
			for(int i=1;i<=n;i++)
			  cnt[i]=np[i];
		}
		
	}
	
	
}

int main()
{
	srand((double)time(0));
	cin>>n;
	for(int i=1;i<=n+1;i++)
	  for(int j=1;j<=n;j++)
	  {
	  	cin>>a[i][j];
	  	a[i][j]+=20000;
		}
	    
	
	for(int u=1;u<=1000;u++)
	{
		SA();
		//cout<<dgl<<' ';
		if(op>dgl)
		{
			op=dgl;
			for(int i=1;i<=n;i++)
			  ans[i]=cnt[i];
		}
		
	}
	
	for(int i=1;i<=n;i++)
	  printf("%.3lf ",ans[i]-20000);
	
	return 0;
}
2024/6/19 21:51
加载中...