【模拟退火】poj2420 A Star not a Tree?
题意:求平面上一个点,使其到给定的n个点的距离和最小,即费马点。
模拟退火的思想是随机移动,然后100%接受更优解,以一定概率接受更劣解。移动的过程中温度缓慢降低,接受更劣解的概率降低。
在网上看到的代码都不太靠谱,我这个代码的关键之处在于,每一次随机走点时,不是1次,而是在10次随机中取最优者作为当前这一步的随机结果,这样运行时非常优秀。
T降温时乘0.9/0.99这样的数都行,越接近1越准确,但速度越慢。
这份代码即使用0.9也可以ac。
- #include<cstdio>
- #include<cmath>
- #include<cstdlib>
- using namespace std;
- const double EPS=0.00000001;
- const double PI=acos(-1.0);
- struct Point{
- double x,y;
- Point(const double &x,const double &y){
- this->x=x;
- this->y=y;
- }
- Point(){}
- void read(){
- scanf("%lf%lf",&x,&y);
- }
- double length(){
- return sqrt(x*x+y*y);
- }
- }a[105],p;
- double ans;
- int n;
- typedef Point Vector;
- Vector operator - (const Point &a,const Point &b){
- return Vector(a.x-b.x,a.y-b.y);
- }
- Vector operator + (const Vector &a,const Vector &b){
- return Vector(a.x+b.x,a.y+b.y);
- }
- Vector operator * (const double &K,const Vector &v){
- return Vector(K*v.x,K*v.y);
- }
- double calc(Point p){
- double res=0.0;
- for(int i=1;i<=n;++i){
- res+=(a[i]-p).length();
- }
- return res;
- }
- int main(){
- srand(233);
- // freopen("poj2420.in","r",stdin);
- // freopen("poj2420.out","w",stdout);
- scanf("%d",&n);
- for(int i=1;i<=n;++i){
- a[i].read();
- p.x+=a[i].x;
- p.y+=a[i].y;
- }
- p.x/=(double)n;
- p.y/=(double)n;
- ans=calc(p);
- double T=100000.0;
- while(T>EPS){
- double bestnow=10000000.0;
- Point besttp;
- for(int i=1;i<=10;++i){
- double rad=(double)(rand()%10000+1)/10000.0*2.0*PI;
- Point tp=p+T*Point(cos(rad),sin(rad));
- double now=calc(tp);
- if(now<bestnow){
- bestnow=now;
- besttp=tp;
- }
- }
- if(bestnow<ans || exp((ans-bestnow)/T)*10000.0>(double)(rand()%10000)){
- ans=bestnow;
- p=besttp;
- }
- T*=0.99;
- }
- printf("%.0f\n",ans);
- return 0;
- }
【模拟退火】poj2420 A Star not a Tree?的更多相关文章
- poj2420 A Star not a Tree? 找费马点 模拟退火
题目传送门 题目大意: 给出100个二维平面上的点,让你找到一个新的点,使这个点到其他所有点的距离总和最小. 思路: 模拟退火模板题,我也不懂为什么,而且一个很有意思的点,就是初始点如果是按照我的代码 ...
- poj-2420 A Star not a Tree?(模拟退火算法)
题目链接: A Star not a Tree? Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5219 Accepte ...
- 模拟退火算法A Star not a Tree?(poj2420)
http://write.blog.csdn.net/postedit A Star not a Tree? Time Limit: 1000MS Memory Limit: 65536K Tot ...
- Poj2420 A Star not a Tree? 模拟退火算法
题目链接:http://poj.org/problem?id=2420 题目大意:每组数据中给n个点(n<=100),求平面中一个点使得这个点到n个点的距离之和最小. 分析:一开始看到这个题想必 ...
- POJ-2420 A Star not a Tree? 梯度下降 | 模拟退火
题目链接:https://cn.vjudge.net/problem/POJ-2420 题意 给出n个点,找一个点,使得这个点到其余所有点距离之和最小. 思路 一开始就在抖机灵考虑梯度下降,猜测是个凸 ...
- [POJ2420]A Star not a Tree?(模拟退火)
题目链接:http://poj.org/problem?id=2420 求费马点,即到所有其他点总和距离最小的点. 一开始想枚举一个坐标,另一个坐标二分的,但是check的时候还是O(n)的,复杂度相 ...
- poj2420 A Star not a Tree? 模拟退火
题目大意: 给定n个点,求一个点,使其到这n个点的距离最小.(\(n \leq 100\)) 题解 模拟退火上 #include <cmath> #include <cstdio&g ...
- [POJ2420]A Star not a Tree?
来源: Waterloo Local 2002.01.26 题目大意: 找出$n$个点的费马点. 思路: 模拟退火. 首先任取其中一个点(或随机一个坐标)作为基准点,每次向四周找距离为$t$的点,如果 ...
- [模拟退火][UVA10228] A Star not a Tree?
好的,在h^ovny的安利下做了此题 模拟退火中的大水题,想当年联赛的时候都差点打了退火,正解貌似是三分套三分,我记得上一道三分套三分的题我就是退火水过去的... 貌似B班在讲退火这个大玄学... 这 ...
随机推荐
- Codeforces Round #484 (Div. 2)
题目链接:http://codeforces.com/contest/982 A. Row time limit per test:1 second memory limit per test:256 ...
- Coursera在线学习---第九节(2).推荐系统
一.基于内容的推荐系统(Content Based Recommendations) 所谓基于内容的推荐,就是知道待推荐产品的一些特征情况,将产品的这些特征作为特征变量构建模型来预测.比如,下面的电影 ...
- 土司论坛nc反弹神器使用方法
说明: PS:我本机是linux,因为没有服务器所以使用win7来演示.倘若你是windows可以在本机生成dll以后再放到服务器上面去执行dll即可反弹shell物理机ip:192.168.1.12 ...
- MySQL当中的case when then
其实就相当于if else:而且也可以用if来替代. case whent 条件1 then 条件2 else 条件3 end; 如果条件1成立就执行条件2否则执行条件3 mysql ) end; + ...
- 斯坦福开源无Bug的随机计算图Certigrad
斯坦福开源无Bug的随机计算图Certigrad https://news.cnblogs.com/n/573690/ ttps://github.com/dselsam/certigrad
- kivy安装
>>> os.system('pip install kivy')Collecting kivy Downloading Kivy-1.9.1-cp27-none-win_amd64 ...
- django开发项目实例2--如何链接图片和css文件(静态文件)
在上一篇随笔里面,我们已经介绍了如何从零开始用django建立一个项目并且初步运行以来了, 现在我们就要开始写我们的html了,也就是django里面的模板了,不过这节我们只讲如何链接图片和css(静 ...
- 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 ...
- 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 ...
- 使用dpkg命令卸载已经安装的软件包
如何在Ubuntu中使用dpkg命令卸载软件 http://jingyan.baidu.com/article/f54ae2fc2724a71e92b849c4.html sudo dpkg -i x ...