题目链接: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. MongoDB 3 + Windows 7 X64安装及配置

    注册windows服务,使MongoDB自动启动 1.使用系统管理员运行cmd C:\Users\admin> d: C:\Users\admin> cd "mongodb的安装 ...

  2. 这次一定理清晰ThinkPHP之中的模型、数据库之间命名规范

    ServiceSiteModel.class.php 这个模型操控的数据库是service_site表: <?php namespace Admin\Model; use Think\Model ...

  3. 一款兼容IE6并带有多图横向滚动的jquery特效

    一款兼容IE6并带有多图横向滚动的jquery特效,自动切换多个图片的jquery特效效果, 为大家分享这个的原因是,这款特效在兼容IE6上面很完美,实用性就广很多了. 适用浏览器:IE6.IE7.I ...

  4. IOS学习2

    1. #import,#include 和@class的区别 都引用一个类,根本定义区别:#include ,#import会把所有的copy一份到该文件 #import比#include的优势,im ...

  5. js代码优化

    1.减少Jquery使用 处理dom遍历和复杂的脚本场景时,jquery可能有很大的帮助,不过在处理简单的.直截了当的代码场景就会迟缓.尽可能的避免jquery对象创建,尤其在循环中. 2.优化循环 ...

  6. 02-线性结构3 Pop Sequence

    Given a stack which can keep M numbers at most. Push N numbers in the order of 1, 2, 3, ..., N and p ...

  7. java 中 java.lang.ArrayIndexOutOfBoundsException: 0 异常

    package test; public class Test { public static void main(String[] args) { final int num2 = Integer. ...

  8. jquery的prop()和attr()

    jQuery1.6以后prop()和attr()的应用场景如下: 第一原则:只添加属性名称该属性就会立即生效应该使用prop(); 第二原则:只存在true/false的属性应该使用prop(); 设 ...

  9. 【C#】 装箱 (boxing) 和拆箱 (unboxing)

    目录: 1. 装箱和拆箱 2. 深入理解装箱和拆箱 3. int[] to object[],值类型数组到对象数组的转化 4. 使用泛型减少装箱和拆箱 1.  装箱和拆箱 装箱 就是把“值类型”转换成 ...

  10. ThinkPHP 3.2.2跨控制器调用方法

     所谓跨控制器调用,指的是在一个控制器中调用另一个控制器的某个方法.在ThinkPHP中有三种方式实现跨控制器调用: 直接实例化: A()函数实例化; R()函数实例化. (1)直接实例化  直接实例 ...