【POJ2069HDU3007】模拟退火算法之最小球/圆覆盖
启蒙博客:https://blog.csdn.net/AI_BigData_wh/article/details/77943787?locationNum=2&fps=1
POJ2069:最小球覆盖
被精度搞死。。POJ做题经常被精度卡到怀疑人生。。好感-1-1-1...-1
队友的模拟退火的模版好像是错的(但是能过HDU3007,很玄学了)。初识温度的设置不能太大,会影响最终结果的准确度。
ac代码:
#include <iostream>
#include <cmath>
using namespace std;
const int maxn = 40;
const double eps = 1e-7;
const double DINF = 0x7fffffff;
const double initT = 400;//设小了可能会wa,POJ2069开到500会wa,200-400可行
struct Point{double x, y, z;Point(double x = 0, double y = 0, double z = 0):x(x),y(y),z(z){}
};
Point p[maxn];
int n;
double dist(Point a, Point b)
{return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z));
}
double sa()
{double ans = DINF, T = initT;//T相当与迭代次数,多次结果更准确Point ansp = Point(0,0,0);// ansp记录最小球的圆心while(T > eps){double maxd = -1;int k = 0;for(int i = 0; i < n; i++)if(dist(ansp, p[i]) > maxd){maxd = dist(ansp, p[i]);k = i;//不单独开一个点maxd记录和当前圆心距离最远的点,会wa,精度问题吧}ans = min(ans, maxd);//更新最小半径ansp.x += (p[k].x-ansp.x)*T/maxd;ansp.y += (p[k].y-ansp.y)*T/maxd;ansp.z += (p[k].z-ansp.z)*T/maxd;T *= 0.98;//降温}return ans;
}
int main()
{//freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);while(scanf("%d", &n)){if(n == 0) break;for(int i = 0; i < n; i++) scanf("%lf %lf %lf", &p[i].x, &p[i].y, &p[i].z);printf("%.5lf\n", sa());}return 0;
}
HDU3007: 最小圆覆盖
数据比较水吧。用队友的模版也能过,两个都贴上吧。!(◎_◎;)
mine:
#include <iostream>
#include <cmath>
using namespace std;
const int maxn = 550;
const double eps = 1e-7;
const double DINF = 0x7fffffff;
const double initT = 400;//设小了可能会wa,POJ2069开到500会wa
struct Point{double x, y;Point(double x = 0, double y = 0):x(x),y(y){}
};
Point p[maxn];
int n;
double dist(Point a, Point b)
{return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double sa()
{double ans = DINF, T = initT;//T相当与迭代次数,多次结果更准确Point ansp = Point(0,0);//ansp记录最小球的圆心while(T > eps){double maxd = -1;int k = 0;for(int i = 0; i < n; i++)if(dist(ansp, p[i]) > maxd){maxd = dist(ansp, p[i]);k = i;}ans = min(ans, maxd);//更新最小半径ansp.x += (p[k].x-ansp.x)*T/maxd;ansp.y += (p[k].y-ansp.y)*T/maxd;T *= 0.98;//降温}printf("%.2lf %.2lf %.2lf\n", ansp.x, ansp.y, ans);
}
int main()
{//freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);while(scanf("%d", &n)){if(n == 0) break;for(int i = 0; i < n; i++) scanf("%lf %lf", &p[i].x, &p[i].y);sa();}return 0;
}
WJX‘s:
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=550;
const double eps=1e-3; //精度
const double start_T=1000; //初始温度
const double rate=0.98; //温度下降速率
struct point
{double x;double y;
} p[maxn];
int N;
double dist(point a,point b)
{return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double solve()
{double T=start_T;point ans_p={0,0}; //初始点double ans=1e99; //预设一个较大值while(T>eps){point maxd_p=p[1];for(int i=2;i<=N;i++){if(dist(ans_p,p[i])>dist(ans_p,maxd_p))maxd_p=p[i];}//找到距离ans_p最远的点,maxd_pans=min(ans,dist(ans_p,maxd_p));ans_p.x+=(maxd_p.x-ans_p.x)*(T/start_T); //以一定概率靠近maxd_pans_p.y+=(maxd_p.y-ans_p.y)*(T/start_T);T*=rate;}printf("%.2lf %.2lf %.2lf\n", ans_p.x, ans_p.y, ans);
}
int main()
{//freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);while(scanf("%d",&N) && N){for (int i = 1; i <= N; i++)scanf("%lf %lf", &p[i].x, &p[i].y);solve();}return 0;
}
【POJ2069HDU3007】模拟退火算法之最小球/圆覆盖相关推荐
- 最少圆覆盖通信覆盖问题-算法分析设计-贪心算法-java实现
问题描述 假设海岸线是一条无限延伸的直线,陆地在海岸线的一侧,海洋在另外一侧.每个小岛相当于海洋侧的一个点.坐落在海岸线上的基站只能覆盖半径为d的范围.应用直角坐标系,将海岸线作为x轴,设海洋侧在x轴 ...
- 模拟退火算法及常见应用
模拟退火 模拟退火( 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 ...
- 算法学习:最小圆覆盖
[参考博客] https://www.cnblogs.com/bztMinamoto/p/10698920.html [定义] [圆]一个圆心和他的半径,就能够确定这个半径 [解决问题] 字面意思 给 ...
- 模拟退火算法理论+Python解决函数极值+C++实现解决TSP问题
简述 算法设计课这周的作业: 赶紧写了先,不然搞不完了. 文章目录 简述 算法理论部分 变量简单分析 从状态转移概率到状态概率 推导 理解当温度收敛到接近0的时候,收敛到结果 理论部分的后记 pyth ...
- 数学建模国赛 常考赛题类型(模拟退火算法、粒子群算法、遗传算法)
不知小伙伴们有没有发现,在1992~2020年历年国赛赛题中,优化类赛题所占的比例非常大,如在近五年的题目中: 2016A:系泊系统的设计: 2017B:"拍照赚钱"的任务定价 2 ...
- 万字长文了解模拟退火算法原理及求解复杂约束问题(源码实现)
模拟退火算法原理 退火这个词,其实是铁匠发明的.它的意思很简单,就是将铁匠炉烧热后,再把下边的火撤掉,让金属在炉子里边慢慢冷却.人们发现,这个缓慢的降温过程能消除金属内部的各种缺陷,使得其恢复能量最低 ...
- Python数模笔记-模拟退火算法(4)旅行商问题
1.旅行商问题(Travelling salesman problem, TSP) 旅行商问题是经典的组合优化问题,要求找到遍历所有城市且每个城市只访问一次的最短旅行路线,即对给定的正权完全图求其总权 ...
- 模拟退火算法从原理到实战【基础篇】
模拟退火算法来源于固体退火原理,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小 ...
- consplan r语言_模拟退火算法实现:求解中国31个城市TSP问题
最近在学习玻尔兹曼机,里面用到了模拟退火算法,经过一天的实验,总算顺利完成,本文打算记录这一过程,以作备忘. 本文内容如下: 1.实验环境 2.算法原理简介 3.TSP案例代码实现 4.运行结果解析 ...
- k图着色 局部搜索算法与模拟退火算法的python实现
文章目录 前言 如何评价一个解? 通过计算出的冲突来找它的邻居解 数据的格式 局部搜索 概述 补充 代码 模拟退火 概述 补充 代码 总结以及不足之处 前言 这两种算法就不详细介绍了,流程思路比较简单 ...
最新文章
- Asp.net团队疯了(同时发布WebMatrix, Razor, MVC3和Orchard)
- 浅入浅出JS中的eval及json
- linux 之 rpm 网站
- 快慢指针____函数将字符串中的字符'*'移到串的前部分,前面的非'*'字符后移
- Dora.Interception: 一个为.NET Core度身定制的AOP框架
- Tree前序反序列化
- 【渝粤教育】国家开放大学2019年春季 2114人体解剖生理学 参考试题
- 作为面试官的一些经历,希望能给找工作的朋友一些参考
- Try increasing heap size with java option '-Xmxlt;sizegt;’.
- Introducing to Spring Framework
- EVE-NG之dynamips镜像重新计算idle值
- 文件系统系列之一:fat文件系统的结构分析
- 正好股票资讯大盘平衡被打破
- python sort函数原理_python sort函数原理
- 第五章 站在巨人的肩膀上
- 给网站添加悬浮音乐播放器
- Reog Ponorogo是爪哇族人在印尼的一个部落的传统舞蹈
- 【MySQL数据库笔记 - 进阶篇】(四)视图/存储过程/触发器
- Angular + xlsx + xlsx-js-style实现多个sheel页Excel下载
- 四、资讯安全网词汇表
热门文章
- 蓝桥杯 算法训练 斐波那契串
- magento 客户表相关_第9章 相关性分析
- 文字识别成语音_广东人专属!微信语音转文字可以识别粤语了!
- JS 使用正则表达式参考,分组捕获,遍历输出所有匹配结果
- mybatis中的三种多表查询的方式详解,业务装配,N+1,多表查询的sql
- c# html正则,c# 使用正则解析html
- python中换行的转义字符_Python语言中表示换行的转义字符是____________。(2.5分)_学小易找答案...
- matlab浪漫画图,Matlab技巧11:谁说数学人不懂浪漫——Matlab画隐函数曲面
- hello程序代码python_翻译:《实用的Python编程》01_02_Hello_world
- 项目中css初始化通用代码(源码,直接套)