题目链接:http://poj.org/problem?id=2420

题目大意:每组数据中给n个点(n<=100),求平面中一个点使得这个点到n个点的距离之和最小。

分析:一开始看到这个题想必是不好做的...因为平面太大了,不能使用枚举的方法,于是想到随机点出来比较。可是总不能无限的枚举,而且随机点出的答案需要是最优值还是一个玄学问题。所以想到了模拟退火的方法。

具体操作:首先随意找一个点作为出发点,然后设置一个初始温度,使得这个点可以在这个温度下乱跑[但是只让它往上下左右跑]温度越高,这个点就越活跃,在所找到的区域中选一个到其他点距离和最小的点,然后跳过去。完成这一步后,温度降低,再在新的点附近搜。联想到刚开始学模拟退火时看到的一张图:

再配上一句经典的话:

爬山算法:兔子朝着比现在高的地方跳去。它找到了不远处的最高山峰。但是这座山不一定是珠穆朗玛峰。这就是爬山算法,它不能保证局部最优值就是全局最优值。

模拟退火:兔子喝醉了。它随机地跳了很长时间。这期间,它可能走向高处,也可能踏入平地。但是,它渐渐清醒了并朝最高方向跳去。这就是模拟退火。

可以把我们的题目想像到这个图中去:

  山峰类似距离和的函数,求最小值相当于找最高峰,一开始允许随便找,就可以跨过第一座看上去是最高的峰顶而去往其他的位置。当时当温度降下来[或是酒慢慢醒了]就只能在比较近的位置找了,直到某个位置跳上了最高峰,得到最后的答案。

但是毕竟这个起始温度和降低温度的速度还是有些玄学的。所以不妨开得大一点保险好了...

AC代码

 #include<cstdio>
#include<cmath> using namespace std; const int maxn=;
const int T=;
const int INF=0x7fffffff;
const double eps=1e-;
const double delta=0.98; struct Node{double x,y;}node[maxn]; int n;
int dx[]={,,,-};
int dy[]={,-,,}; inline double dis(Node A,Node B){
return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));
} double sum_dis(Node A){
double sum=;
for(int i=;i<=n;i++)
sum+=dis(A,node[i]);
return sum;
} void search(){
Node Ans=node[],Now;
double t=T,res=INF;
bool find;
while(t>eps){
find=true;
while(find){
find=false;
for(int j=;j<;j++){
Now.x=Ans.x+dx[j]*t;
Now.y=Ans.y+dy[j]*t;
double Dis=sum_dis(Now);
if(Dis<res)
res=Dis,Ans=Now,find=true;
}
}
t=t*delta;
}
if(res-(int)(res)>0.5)
printf("%d\n", (int)(res+));
else
printf("%d\n", (int)(res));
} int main(){
#ifndef ONLINE_JUDGE
freopen("Poj2420.in","r",stdin);
freopen("Poj2420.out","w",stdout);
#endif while(~scanf("%d",&n)){
for(int i=;i<=n;i++)
scanf("%lf%lf",&node[i].x,&node[i].y);
search();
} return ;
}

Poj2420 A Star not a Tree? 模拟退火算法的更多相关文章

  1. poj-2420 A Star not a Tree?(模拟退火算法)

    题目链接: A Star not a Tree? Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5219   Accepte ...

  2. poj2420 A Star not a Tree? 模拟退火

    题目大意: 给定n个点,求一个点,使其到这n个点的距离最小.(\(n \leq 100\)) 题解 模拟退火上 #include <cmath> #include <cstdio&g ...

  3. poj2420 A Star not a Tree? 找费马点 模拟退火

    题目传送门 题目大意: 给出100个二维平面上的点,让你找到一个新的点,使这个点到其他所有点的距离总和最小. 思路: 模拟退火模板题,我也不懂为什么,而且一个很有意思的点,就是初始点如果是按照我的代码 ...

  4. uva 10228 - Star not a Tree?(模拟退火)

    题目链接:uva 10228 - Star not a Tree? 题目大意:给定若干个点,求费马点(距离全部点的距离和最小的点) 解题思路:模拟退火算法,每次向周围尝试性的移动步长,假设发现更长处, ...

  5. POJ 2420 A Star not a Tree? 爬山算法

    B - A Star not a Tree? Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/co ...

  6. 【模拟退火】poj2420 A Star not a Tree?

    题意:求平面上一个点,使其到给定的n个点的距离和最小,即费马点. 模拟退火的思想是随机移动,然后100%接受更优解,以一定概率接受更劣解.移动的过程中温度缓慢降低,接受更劣解的概率降低. 在网上看到的 ...

  7. POJ-2420 A Star not a Tree? 梯度下降 | 模拟退火

    题目链接:https://cn.vjudge.net/problem/POJ-2420 题意 给出n个点,找一个点,使得这个点到其余所有点距离之和最小. 思路 一开始就在抖机灵考虑梯度下降,猜测是个凸 ...

  8. [POJ2420]A Star not a Tree?(模拟退火)

    题目链接:http://poj.org/problem?id=2420 求费马点,即到所有其他点总和距离最小的点. 一开始想枚举一个坐标,另一个坐标二分的,但是check的时候还是O(n)的,复杂度相 ...

  9. POJ 2420 A Star not a Tree?(模拟退火)

    题目链接 居然1Y了,以前写的模拟退火很靠谱啊. #include <cstdio> #include <cstring> #include <string> #i ...

随机推荐

  1. 学习实践:使用模式,原则实现一个C++自动化测试程序

    个人编程中比较喜欢重构,重构能够提高自己的代码质量,使代码阅读起来也更清晰.但是重构有一个问题,就是如何保证重构后带代码实现的功能与重构前的一致,如果每次重构完成后,对此不闻不问,则会有极大的风险,如 ...

  2. VS2010在非IE浏览器下调试Silverlight程序

    以Chrome为例: 第一步:在程序中设置断点. 第二步:右键点击web应用程序的起始页(.html或.aspx文件),选择"浏览方式",选中Chrome或其它非IE浏览器,点&q ...

  3. nginx php 安装

    .选定源码目录选定目录 /data/klj/ cd /data/klj/ 2.安装PCRE库cd /data/klj/wget ftp://ftp.csx.cam.ac.uk/pub/software ...

  4. DevExpress控件开发常用要点(项目总结版)

    使用DevExpress控件来做项目开发已经有很长一段时间了,在摸索开发到客户苛刻要求的过程中,其中碰到过很多问题需要解决的,随着一个个问题的解决,也留下很多对DevExpress控件的使用经验及教训 ...

  5. C# 添加系统计划任务方案

    你可以在Windows 计划任务管理器里面添加计划任务,调试OK后导出XML文件,然后在要部署的计算机上执行CMD导入命令,把计划任务信息配置导入到服务器上的计划任务列表中,命令如下: SCHTASK ...

  6. WIN8+VS2013编写发布WCF之二(部署)

    上文简介了如何建立WCF工程并且调试,下面说一下如何部署. 本文将陆陆续续讲述三种部署方式,随着项目的进展将不断补全. 声明: 用管理员身份打开VS2013,发布前请将程序的.net版本改成与服务器相 ...

  7. OXPattern

    10000的随机数组由ox组成,查找数组中oox...x(任意x)oox....x(任意x)o的个数 enum { DATA_SIZE = , }; enum enum_status { STATUS ...

  8. Mysql账号管理

    一 用户添加 通过insert 方式添加用户 insert into mysql.user(Host,User,Password) values("localhost"," ...

  9. Android Cookie共享到WebView避免再次登录(保持登录状态)

    最近在做项目时用到了webview打开指定链接的网页,可已经把webview设置了cookie但始终跳转到登录页面,这明显是cookie没有设置成功导致webview没有将设置好的cookie发送出去 ...

  10. MVC 局部加载页面的实例

    我们在做MVC 进行某一块的局部刷新,有的使用AJAX 请求,有的使用局部页: 下面我给大家推荐一种使用局部页面实现的这种方式: 第一步: 嵌套视图页 <div id="showAud ...