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