模拟退火求最小球覆盖和最小圆覆盖

原本在我的认识中,模拟退火一定要有一个随机化在里面。

但是有些模拟退火,你可以清楚地意识到答案是可以向某个方向逼近的,这个时候就不用随机了。

比如像第一道题POJ 2069,这道题求的就是最小球覆盖。

对于任意的初始点,我们都能算出以当前点作为圆心的覆盖半径是多少。

显然,决定这条半径多长的,是所有点中离圆心最远的。

那么我们是不是可以越来越靠近这个最远的点,使得最远的距离最小,也就是球的半径能最小?

答案是肯定的,我们直接慢慢地更新答案即可。

同时我们也套上模拟退火的板子,用一个T来表示那一步移动的步长。

最小圆覆盖当然比三维情况要简单,所以能理解上面的,那道题也就顺便切掉了。

分别附上这两道题的代码:

POJ 2069

#include<cstdio>
#include<cmath>
const int maxn = 35;
const double delta = 0.98;
struct Point
{double x, y, z;
} s[maxn];
double ansx, ansy, ansz, ans;
int n;inline double sq(double x)
{return x * x;
}
double dist(double x, double y, double z, double xx, double yy, double zz)
{return sqrt(sq(x - xx) + sq(y - yy) + sq(z - zz));
}int main()
{while(scanf("%d", &n) == 1 && n){ansx = ansy = ansz = 0;// 取平均值过不了是最骚的for(int i = 1; i <= n; i++){scanf("%lf%lf%lf", &s[i].x, &s[i].y, &s[i].z);}for(double T = 100; T > 1e-15; T = T * delta)// 话说这道题卡精度{double maxdist = -1e15; int idx = -1;for(int i = 1; i <= n; i++){double temp = dist(ansx, ansy, ansz, s[i].x, s[i].y, s[i].z);if(temp > maxdist){maxdist = temp; idx = i;}}ans = maxdist;ansx += (s[idx].x - ansx) / maxdist * T;ansy += (s[idx].y - ansy) / maxdist * T;ansz += (s[idx].z - ansz) / maxdist * T;}printf("%.5lf\n", ans);}return 0;
}

HDU 3007

#include<cstdio>
#include<cmath>
const int maxn = 505;
struct Nodes
{double x, y;
} s[maxn];
double ansx, ansy;
int n;
inline double sq(double x)
{return x * x;
}
double dist(double x, double y, double xx, double yy)
{return sqrt(sq(x - xx) + sq(y - yy));
}
int main()
{while(scanf("%d", &n) == 1 && n){ansx = ansy = 0;for(int i = 1; i <= n; i++){scanf("%lf%lf", &s[i].x, &s[i].y);ansx += s[i].x; ansy += s[i].y;}ansx /= n; ansy /= n;const double delta = 0.98;for(double T = 2018; T > 1e-10; T *= delta){double maxr = -1e10; int idx = -1;for(int i = 1; i <= n; i++){double temp = dist(ansx, ansy, s[i].x, s[i].y);if(temp > maxr){maxr = temp; idx = i;}}ansx += (s[idx].x - ansx) / maxr * T;ansy += (s[idx].y - ansy) / maxr * T;}printf("%.2lf %.2lf %.2lf\n", ansx, ansy, dist(ansx, ansy, s[1].x, s[1].y));}return 0;
}

转载于:https://www.cnblogs.com/Garen-Wang/p/9913287.html

POJ - 2069 Super Star HDU - 3007 Buried memory相关推荐

  1. poj 2069 Super Star 最小求覆盖【爬山算法】

    题意:给定几个点,要求覆盖这些点的最小球半径.(求到n个点的最大距离最小化的点 因为是单峰的所以可以用爬山算法 主要是我的退火算法板子精度达不到? //#include<bits/stdc++. ...

  2. ZOJ - 1450 Minimal Circle HDU - 3007 Buried memory 最小圆覆盖模板 【随机函数】【增量法】

    题意 给N个点,求最小的圆将这N个点全部覆盖,输出圆心坐标和半径 分析 最小的圆肯定落在三个点上,因此暴力枚举圆上的三个点即可,点增量算法O(n ^ 3),加入随机化,平均复杂度可以降到O(n^2) ...

  3. poj 2069 Super Star 模拟退火

    题目大意: 给定三位空间上的n(\(n \leq 30\))个点,求最小的球覆盖掉所有的点. 题解: 貌似我们可以用类似于二维平面中的随机增量法瞎搞一下 但是我不会怎么搞 所以我们模拟退火就好了啊QA ...

  4. 【hdoj】3007 Buried memory 【计算几何--最小圆覆盖】

    传送门:Buried memory 苍天饶过谁,第三次在hdoj上 交计算几何的题了,没一次是AC的. ┭┮﹏┭┮都是模板题啊,我都是抄板子的啊,为什么会这样,我怎么这么菜. 题意: 求最小圆覆盖 的 ...

  5. PKU2069 Super Star 点集最小外接球

    变步长法属于模拟退火算法的一种.pku2790就可以使用这种方法求解. 题意:是求一些空间点集的最小外接球半径.选取一个初始点,然后按一定步长前进,前进的方向选择为指向最靠近它的点.不断让步长衰减,过 ...

  6. POJ 2069最小球覆盖 HDU3007最小圆覆盖【模拟淬火算法】

    POJ 2069最小球覆盖 1.给定N个三维点,要求覆盖这些点的最小球半径: 2.采用模拟淬火算法,随机选取一个点作为初始解,然后不断向当前最远的点靠近: 3.这是一个不断调整的过程,对应模拟淬火算法 ...

  7. POJ-2069 Super Star(最小球覆盖)

    POJ-2069 Super Star 题意: 给你n个点,求覆盖所有点的最小球的半径 4<=n<=30 题解: 求最小球覆盖的步骤: (1)对于一个点:球心就是这个点,且半径无穷小. ( ...

  8. POJ 2195 Going Home / HDU 1533(最小费用最大流模板)

    题目大意: 有一个最大是100 * 100 的网格图,上面有 s 个 房子和人,人每移动一个格子花费1的代价,求最小代价让所有的人都进入一个房子.每个房子只能进入一个人. 算法讨论: 注意是KM 和 ...

  9. poj 2096 , zoj 3329 , hdu 4035 —— 期望DP

    题目:http://poj.org/problem?id=2096 题目好长...意思就是每次出现 x 和 y,问期望几次 x 集齐 n 种,y 集齐 s 种: 所以设 f[i][j] 表示已经有几种 ...

最新文章

  1. iOS11开发教程(二十三)iOS11应用视图实现按钮的响应(3)
  2. springmvc和tomcat原理
  3. atitit.微信支付的教程文档 attilax总结
  4. 收藏网站制作常用经典css.div.布局.设计实例打包下载
  5. App后台开发运维和架构实践学习总结(3)——RestFul架构下API接口设计注意点
  6. 抖音autojs 云控脚本源码
  7. 写了一个个人资产管理的后台系统
  8. 抖音电影视频剪辑——电影版权问题
  9. 2003sql php_Windows Server 2003下安装PHP +mssql2000
  10. java 扫描仪_Java调用扫描仪2
  11. 周末分享 | 2019年最好的演讲:别让任何人打乱你的人生节奏
  12. 【PTC Thingworx(三)】连接和监控工厂设备
  13. 实时折线图php mysql 源码_超级漂亮网址导航源码,自助链源码(PHP+MYSQL完整版)...
  14. UITT不忘初心,为交易而生
  15. 一个事物两个方面的对比举例_作比较的句子大全简短-对比的句子什么比什么重要-什么和什么做比较的句子...
  16. MySQL数据库,数据的约束
  17. 用pymysql批量导入数据
  18. 在Centos7下Hyperledger Cello安装部署和简单使用
  19. 升级XCode8之后控制台打印了好多乱七八糟的东西
  20. visio2016激活 试用版

热门文章

  1. Java摇骰子比大小_还在摇骰子比大小?这几款火热的KTV喝酒游戏你值得收藏
  2. php 判断文件类型,php 判断图片文件的真实类型
  3. redis 从节点如何选举从节点升级为主节点_Redis哨兵的配置和原理
  4. linux swing 字体颜色,Linux 下 java Swing 中文字体变成方框的问题解决
  5. hashmap删除指定key_「集合系列」- 深入浅出分析HashMap
  6. cropper左右移动_移动端cropper.js上传图片、裁剪
  7. worknc的后处理如何安装_这些压缩空气后处理问题,大部分人都没有关注到
  8. 现在进行时和一般现在时的将来时态_39
  9. Bzoj 1566: [NOI2009]管道取珠(动态规划-神题)
  10. 无序列表圆点变空心_前端HTML -- 列表标签