A Star not a Tree? 模拟退火

来源:互联网 发布:人工智能与机器人区别 编辑:程序博客网 时间:2024/05/11 22:20
/*模拟退火的思路非常巧妙。从大处定位,再慢慢细微。相当于先粗条再微调。*/#include <stdio.h>#include <cmath>struct point{    double x,y;}p[101];int n;double dis(point p1,point p2){    return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));}point getpoint(double a,double b){    point t;    t.x=a;    t.y=b;    return t;}double alldis(point a){   double sum=0;   for(int i=0;i<n;i++)   sum+=dis(a,p[i]);   return sum;}int main(){    while(scanf("%d",&n)==1)    {        for(int i=0;i<n;i++)        scanf("%lf%lf",&p[i].x,&p[i].y);        double step=100.0;        point tt,qq,pp;        pp=p[0];        double ans=alldis(pp);        while(step>0.2)        {            bool ret=true;            while(ret)            {                ret=false;                double tmp=0;                qq=getpoint(pp.x,pp.y+step);//tt为原始点,pp为以tt为中心更新后的点                tt=pp;                tmp=alldis(qq);                if(tmp<ans)                {                    ans=tmp;                    ret=true;                    tt=qq;                }                qq=getpoint(pp.x,pp.y-step);                tmp=alldis(qq);                if(tmp<ans)                {                    ans=tmp;                    ret=true;                    tt=qq;                }                qq=getpoint(pp.x+step,pp.y);                tmp=alldis(qq);                if(tmp<ans)                {                    ans=tmp;                    ret=true;                    tt=qq;                }                qq=getpoint(pp.x-step,pp.y);                tmp=alldis(qq);                if(tmp<ans)                {                    ans=tmp;                    ret=true;                    tt=qq;                }                pp=tt;            }            step=step/2.0;        }        printf("%d\n",int((ans+0.5)*100/100));    }    return 0;}

	
				
		
原创粉丝点击