不知为什么会输出一个很随机的东西,应该不是参数的问题,本人已傻
#include<bits/stdc++.h>
using namespace std;
int n;
double T=1984,k=0.9989,l=1e-14,gailv,z=RAND_MAX,F;
struct node{
double x,y,w;
}a[1005],ans,ansb,best,t,high;
double random(double p,double q){
return double(rand())/z*(q-p)+p;
}
bool better(){
F=0.0;
for(int i=1;i<=n;i++){
F+=(sqrt((a[i].x-ansb.x)*(a[i].x-ansb.x)+(a[i].y-ansb.y)*(a[i].y-ansb.y)))*a[i].w;
}
if(F<best.w) return 1;
gailv=exp((best.w-F)/T);
return 0;
}
void sa(){
while(T>l){
ansb.x=ans.x+(random(-10000.000,10000.000))*T;
ansb.y=ans.y+(random(-10000.000,10000.000))*T;
//printf("%.3lf %.3lf",ansb.x,ansb.y);
//cout<<endl;
if(better()){
ans=ansb;best=ansb;
}
else if(gailv*z>rand()) ans=ansb;
T*=k;
}
}
int main(){
srand(time(0));
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lf%lf%lf",&a[i].x,&a[i].y,&a[i].w);
ans.x+=a[i].x;ans.y+=a[i].y;
}
ans.x/=n;ans.y/=n;
for(int i=1;i<=n;i++){
ans.w+=sqrt((a[i].x-ansb.x)*(a[i].x-ansb.x)+(a[i].y-ansb.y)*(a[i].y-ansb.y))*a[i].w;
}
best=ans;t=ans;high.w=best.w;
for(int i=1;i<=10;i++){
T=5e3+i;ans=t;best=t;sa();
if(best.w<high.w)high=best;
}
printf("%.3lf %.3lf",high.x,high.y);
return 0;
}