题意:求平面上一个点,使其到给定的n个点的距离和最小,即费马点。

模拟退火的思想是随机移动,然后100%接受更优解,以一定概率接受更劣解。移动的过程中温度缓慢降低,接受更劣解的概率降低。

在网上看到的代码都不太靠谱,我这个代码的关键之处在于,每一次随机走点时,不是1次,而是在10次随机中取最优者作为当前这一步的随机结果,这样运行时非常优秀。

T降温时乘0.9/0.99这样的数都行,越接近1越准确,但速度越慢。

这份代码即使用0.9也可以ac。

  1. #include<cstdio>
  2. #include<cmath>
  3. #include<cstdlib>
  4. using namespace std;
  5. const double EPS=0.00000001;
  6. const double PI=acos(-1.0);
  7. struct Point{
  8. double x,y;
  9. Point(const double &x,const double &y){
  10. this->x=x;
  11. this->y=y;
  12. }
  13. Point(){}
  14. void read(){
  15. scanf("%lf%lf",&x,&y);
  16. }
  17. double length(){
  18. return sqrt(x*x+y*y);
  19. }
  20. }a[105],p;
  21. double ans;
  22. int n;
  23. typedef Point Vector;
  24. Vector operator - (const Point &a,const Point &b){
  25. return Vector(a.x-b.x,a.y-b.y);
  26. }
  27. Vector operator + (const Vector &a,const Vector &b){
  28. return Vector(a.x+b.x,a.y+b.y);
  29. }
  30. Vector operator * (const double &K,const Vector &v){
  31. return Vector(K*v.x,K*v.y);
  32. }
  33. double calc(Point p){
  34. double res=0.0;
  35. for(int i=1;i<=n;++i){
  36. res+=(a[i]-p).length();
  37. }
  38. return res;
  39. }
  40. int main(){
  41. srand(233);
  42. // freopen("poj2420.in","r",stdin);
  43. // freopen("poj2420.out","w",stdout);
  44. scanf("%d",&n);
  45. for(int i=1;i<=n;++i){
  46. a[i].read();
  47. p.x+=a[i].x;
  48. p.y+=a[i].y;
  49. }
  50. p.x/=(double)n;
  51. p.y/=(double)n;
  52. ans=calc(p);
  53. double T=100000.0;
  54. while(T>EPS){
  55. double bestnow=10000000.0;
  56. Point besttp;
  57. for(int i=1;i<=10;++i){
  58. double rad=(double)(rand()%10000+1)/10000.0*2.0*PI;
  59. Point tp=p+T*Point(cos(rad),sin(rad));
  60. double now=calc(tp);
  61. if(now<bestnow){
  62. bestnow=now;
  63. besttp=tp;
  64. }
  65. }
  66. if(bestnow<ans || exp((ans-bestnow)/T)*10000.0>(double)(rand()%10000)){
  67. ans=bestnow;
  68. p=besttp;
  69. }
  70. T*=0.99;
  71. }
  72. printf("%.0f\n",ans);
  73. return 0;
  74. }

【模拟退火】poj2420 A Star not a Tree?的更多相关文章

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

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

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

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

  3. 模拟退火算法A Star not a Tree?(poj2420)

    http://write.blog.csdn.net/postedit A Star not a Tree? Time Limit: 1000MS   Memory Limit: 65536K Tot ...

  4. Poj2420 A Star not a Tree? 模拟退火算法

    题目链接:http://poj.org/problem?id=2420 题目大意:每组数据中给n个点(n<=100),求平面中一个点使得这个点到n个点的距离之和最小. 分析:一开始看到这个题想必 ...

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

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

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

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

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

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

  8. [POJ2420]A Star not a Tree?

    来源: Waterloo Local 2002.01.26 题目大意: 找出$n$个点的费马点. 思路: 模拟退火. 首先任取其中一个点(或随机一个坐标)作为基准点,每次向四周找距离为$t$的点,如果 ...

  9. [模拟退火][UVA10228] A Star not a Tree?

    好的,在h^ovny的安利下做了此题 模拟退火中的大水题,想当年联赛的时候都差点打了退火,正解貌似是三分套三分,我记得上一道三分套三分的题我就是退火水过去的... 貌似B班在讲退火这个大玄学... 这 ...

随机推荐

  1. Codeforces Round #484 (Div. 2)

    题目链接:http://codeforces.com/contest/982 A. Row time limit per test:1 second memory limit per test:256 ...

  2. Coursera在线学习---第九节(2).推荐系统

    一.基于内容的推荐系统(Content Based Recommendations) 所谓基于内容的推荐,就是知道待推荐产品的一些特征情况,将产品的这些特征作为特征变量构建模型来预测.比如,下面的电影 ...

  3. 土司论坛nc反弹神器使用方法

    说明: PS:我本机是linux,因为没有服务器所以使用win7来演示.倘若你是windows可以在本机生成dll以后再放到服务器上面去执行dll即可反弹shell物理机ip:192.168.1.12 ...

  4. MySQL当中的case when then

    其实就相当于if else:而且也可以用if来替代. case whent 条件1 then 条件2 else 条件3 end; 如果条件1成立就执行条件2否则执行条件3 mysql ) end; + ...

  5. 斯坦福开源无Bug的随机计算图Certigrad

    斯坦福开源无Bug的随机计算图Certigrad https://news.cnblogs.com/n/573690/ ttps://github.com/dselsam/certigrad

  6. kivy安装

    >>> os.system('pip install kivy')Collecting kivy Downloading Kivy-1.9.1-cp27-none-win_amd64 ...

  7. django开发项目实例2--如何链接图片和css文件(静态文件)

    在上一篇随笔里面,我们已经介绍了如何从零开始用django建立一个项目并且初步运行以来了, 现在我们就要开始写我们的html了,也就是django里面的模板了,不过这节我们只讲如何链接图片和css(静 ...

  8. LeetCode解题报告—— Reverse Linked List II & Restore IP Addresses & Unique Binary Search Trees II

    1. Reverse Linked List II Reverse a linked list from position m to n. Do it in-place and in one-pass ...

  9. Set Matrix Zeroes——常数空间内完成

    Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. Did yo ...

  10. 使用dpkg命令卸载已经安装的软件包

    如何在Ubuntu中使用dpkg命令卸载软件 http://jingyan.baidu.com/article/f54ae2fc2724a71e92b849c4.html sudo dpkg -i x ...