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;}