A Star not a Tree? 模拟退火
2012-08-13 22:12
218 查看
/*模拟退火的思路非常巧妙。从大处定位,再慢慢细微。相当于先粗条再微调。*/ #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; }
相关文章推荐
- 【POJ 2420】 A Star not a Tree?(模拟退火)
- POJ 2420 A Star not a Tree? (爬山法||模拟退火)
- [POJ2420]A Star not a Tree?(模拟退火)
- uva 10228 - Star not a Tree?(模拟退火)
- poj 2420 A Star not a Tree? 模拟退火
- POJ 2420 A Star not a Tree?(模拟退火)
- POJ 2420 A Star not a Tree? (简单模拟退火)
- POJ 2420 A Star not a Tree? 费马点,模拟退火
- POJ-2420 A Star not a Tree? 梯度下降 | 模拟退火
- poj 2420 A Star not a Tree?(模拟退火)
- uva 10228 - Star not a Tree?(模拟退火)
- POJ.2420.A Star not a Tree.模拟退火.0ms
- poj 2420 A Star not a Tree? (模拟退火)
- POJ 2420 A Star not a Tree? (模拟退火)
- 【POJ】2420.A Star not a Tree?(模拟退火)
- poj2420 A Star not a Tree? 模拟退火
- POJ 2420 A Star not a Tree? (模拟退火)
- POJ 2420 A Star not a Tree? (模拟退火)
- POJ 2420 A Star not a Tree? (模拟退火)
- poj 2420 A Star not a Tree?(模拟退火)