菜鸡求助sublime
  • 板块灌水区
  • 楼主white_carton
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/8/7 22:10
  • 上次更新2023/11/3 05:17:51
查看原帖
菜鸡求助sublime
487199
white_carton楼主2023/8/7 22:10

RT,同一份模拟退火代码,放在devc++上答案正确,但是在sublime上就输出nan,在结构体数组里加了一个没用的变量后sublime上也对了,想问下什么原理。

#include<bits/stdc++.h>
using namespace std;
const int maxn=12;
int n;
struct node{
	double x[maxn],h;
	inline friend node operator +(const node &x,const node &y){
		node a;
		for(int i=0;i<n;i++){
			a.x[i]=x.x[i]+y.x[i];
		}
		return a;
	}
	inline friend node operator -(const node &x,const node &y){
		node a;
		for(int i=0;i<n;i++){
			a.x[i]=x.x[i]-y.x[i];
		}
		return a;
	}
	inline void operator /=(const int &y){
		for(int i=0;i<n;i++){
			x[i]/=y;
		}
	}
}s[maxn],ans;
inline double sqr(double x){
	return x*x;
}
inline double abs(const node &a){
	double res=0;
	for(int i=0;i<n;i++){
		res+=sqr(a.x[i]);
	}
	return sqrt(res);
}
inline double dis(node a){
	double res=0;
	for(int i=0;i<=n;i++){
		res+=abs(a-s[i]);
	}
	return res;
}
const double wd=0.99995,eps=1e-5;
const int tim__=250000;
double v[maxn];
void sa(){
	double t=5000;
	while(t>eps){
		double r=dis(ans)/(n+1);
		for(int i=0;i<n;i++){
			v[i]=0;
			for(int j=0;j<=n;j++){
				v[i]+=(abs(ans-s[j])-r)*(s[j].x[i]-ans.x[i]);
			}
			v[i]/=n+1;
		}
		for(int i=0;i<n;i++){
			ans.x[i]+=t*v[i];
		}
		t=t*wd;
	}
	for(int tim=0;tim<tim__&&1.0*clock()/CLOCKS_PER_SEC<0.9;tim++){
		double sum=dis(ans)/(n+1);
		for(int i=0;i<n;i++){
			v[i]=0;
			for(int j=0;j<=n;j++){
				v[i]+=(abs(ans-s[j])-sum)*(s[j].x[i]-ans.x[i]);
			}
			v[i]/=n+1;
		}
		for(int i=0;i<n;i++){
			ans.x[i]+=t*v[i];
		}
	}
}
int main(){
	cin>>n;
	for(int i=0;i<=n;i++){
		for(int j=0;j<n;j++){
			cin>>s[i].x[j];
		}
		ans=ans+s[i];
	}
	ans/=n+1;
	sa();
	for(int i=0;i<n;i++){
		cout<<fixed<<setprecision(3)<<ans.x[i]<<" ";
	}
}

打的是 P4035

2023/8/7 22:10
加载中...