模拟退火是在多峰函数上寻找最值的概率算法,其结果取决于人品。
#include<bits/stdc++.h>
#define ri register int
using namespace std;
int n;
int x[1010],y[1010],w[1010];
double de=0.998;
double avex,avey,avew;
double clac(double qx,double qy)
{
double res=0;
for(ri i=1;i<=n;i++)
{
double a=qx-x[i];
double b=qy-y[i];
res+=sqrt(a*a+b*b)*w[i];
}
return res;
}
void SA()
{
double t=10000;
while(t>1e-15)
{
double newx=avex+((rand()<<1)-RAND_MAX)*t;
double newy=avey+((rand()<<1)-RAND_MAX)*t;
double neww=clac(newx,newy);
double tmp=neww-avew;
if(tmp<0)
{
avex=newx;
avey=newy;
avew=neww;
}
else if(exp(-tmp/t)*RAND_MAX>rand())
{
avex=newx;
avey=newy;
}
t*=de;
}
}
int main()
{
scanf("%d",&n);
for(ri i=1;i<=n;i++)
{
scanf("%d%d%d",&x[i],&y[i],&w[i]);
avex+=x[i]*1.0;
avey+=y[i]*1.0;
}
avex/=n,avey/=n;
avew=clac(avex,avey);
while((double)clock()/CLOCKS_PER_SEC<0.60)
SA();
printf("%.3lf %.3lf",avex,avey);
}