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

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

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

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

再配上一句经典的话:

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

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

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

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

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

AC代码

 1 #include<cstdio>
 2 #include<cmath>
 3
 4 using namespace std;
 5
 6 const int maxn=110;
 7 const int T=100000;
 8 const int INF=0x7fffffff;
 9 const double eps=1e-8;
10 const double delta=0.98;
11
12 struct Node{double x,y;}node[maxn];
13
14 int n;
15 int dx[4]={0,0,1,-1};
16 int dy[4]={1,-1,0,0};
17
18 inline double dis(Node A,Node B){
19     return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));
20 }
21
22 double sum_dis(Node A){
23     double sum=0;
24     for(int i=1;i<=n;i++)
25         sum+=dis(A,node[i]);
26     return sum;
27 }
28
29 void search(){
30     Node Ans=node[1],Now;
31     double t=T,res=INF;
32     bool find;
33     while(t>eps){
34         find=true;
35         while(find){
36             find=false;
37             for(int j=0;j<4;j++){
38                 Now.x=Ans.x+dx[j]*t;
39                 Now.y=Ans.y+dy[j]*t;
40                 double Dis=sum_dis(Now);
41                 if(Dis<res)
42                     res=Dis,Ans=Now,find=true;
43             }
44         }
45         t=t*delta;
46     }
47     if(res-(int)(res)>0.5)
48         printf("%d\n", (int)(res+1));
49     else
50         printf("%d\n", (int)(res));
51 }
52
53 int main(){
54 #ifndef ONLINE_JUDGE
55     freopen("Poj2420.in","r",stdin);
56     freopen("Poj2420.out","w",stdout);
57 #endif
58
59     while(~scanf("%d",&n)){
60         for(int i=1;i<=n;i++)
61             scanf("%lf%lf",&node[i].x,&node[i].y);
62         search();
63     }
64
65     return 0;
66 }

View Code

转载于:https://www.cnblogs.com/Robert-Yuan/p/5033878.html

Poj2420 A Star not a Tree? 模拟退火算法相关推荐

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

    题意:平面上给你n个点,让你求一个点,到这n点的距离和最小 板子得模拟退火,系数也是很好控制,对数器和ACdream得代码跑了1884组样例,结果只有一组不一样,可是我得解更优啊, 交上去RE, 不想 ...

  2. POJ2420——A Star not a Tree?

    题目链接:http://poj.org/problem?id=2420 A Star not a Tree? 题目大意:求费马点!!!模拟退火即可...... #include<iostream ...

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

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

  4. [POJ2420 A Star not a Tree?]

    [关键字]:随机化搜索 模拟退火 [题目大意]:给出n个点,找出一个距离所有点之和最小的点,输出距离. //============================================== ...

  5. poj2420A Star not a Tree?(模拟退火)

    链接 求某一点到其它点距离和最小,求这个和,这个点 为费马点. 做法:模拟退火 1 #include <iostream> 2 #include<cstdio> 3 #incl ...

  6. music算法_“要热爱 请深爱”系列(5)浅谈模拟退火算法

    黄乐天 浅谈模拟退火算法 背景 在实际生活中, 数学问题中,我们常常会遇到(一定范围内)函数求最值的问题.一般可以用数学方式解答,但如果遇到如下恶心的函数: 它的函数图像是这样的: 我们只好用计算机科 ...

  7. 爬山法、随机重启爬山法、模拟退火算法对八皇后问题和八数码问题的性能测试...

    代码地址:https://github.com/laiy/AI/tree/master/awesome-search 一些前提: 1. 首先要明确这些算法并不是用于解决传统的搜索问题的(环境是可观察的 ...

  8. 模拟退火算法及常见应用

    模拟退火 模拟退火( S i m u l a t e d A n n e a l i n g [ S A ] Simulated ~~Annealing[SA] Simulated  Annealin ...

  9. 2018-4-8模拟退火算法

    阅读资料来源: <智能优化算法以及matlab实现>第七章 [图文]智能优化算法_数学建模_王成章_模拟退火法_2011_百度文库 https://wenku.baidu.com/view ...

最新文章

  1. Leetcode | Binary Tree Maximum Path Sum
  2. 使用WinSCP在WIndows与树莓派之间传递文件
  3. Android被忽略的tools
  4. ueditor1.4.3jsp版成功上传图片后却回显不出来与在线管理显示不出图片的解决方案...
  5. Pytorch学习-Task1
  6. [html] marquee详解
  7. 贪心(用了结构体排序)
  8. 设置Netbeans 6.5为英文界面
  9. 绝地求生服务器维护内容,绝地求生最新更新维护几点开始? 绝地求生10.30更新维护内容...
  10. webpack4 es6转换
  11. 最方便的字符设备驱动的写法
  12. JAVA Swing GUI设计 WindowBuilder Pro Container使用大全7——JDesktopPane使用
  13. 是时候了!网易首谈AI加持的AR
  14. fabric.js 不同类型 不同控件_如何模拟不同类型的阻尼
  15. mysql 索引触发_mysql 添加索引后 在查询的时候怎么触发?
  16. 迅雷对非会员进行下载限速的解决方案
  17. 耳机电声测试仪软件,杭州爱华 AWA6128D双耳机测试仪
  18. Java Timer
  19. ArcGis利用栅格处理工具进行影像裁剪
  20. CentOS 8 部署禅道,并使用自己的数据库

热门文章

  1. Android多线程----异步消息处理机制之Handler
  2. 从JAVA转学习Go——Go在eclipse的环境搭建
  3. 求解最大字段和的几种方法
  4. CubieBoard 简单入门
  5. C++中构造函数和析构函数可以抛出异常吗?
  6. C 语言包含的数据类型如下图所示:
  7. 树莓派上搭建Git服务器
  8. 【运维】Linux 系统 之 SSH
  9. 【云中沙箱】视频直播技术浅析与实践!
  10. php检测函数是否存在函数 function_exists