题意:求平面上一个点,使其到给定的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;
}

最新文章

  1. SAP(ABAP) 显示等待图标的FM:SAPGUI_PROGRESS_INDICATOR-SAP进度条
  2. 项目游戏开发日记 No.0x000002
  3. 从红米手机经常发生UIM没有服务的一些猜想
  4. php常见的面试题目
  5. (转) 一步一步学习ASP.NET 5 (三)- 认识新的Web结构
  6. Caused by: org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags
  7. Appcan 3.2 Switch操作
  8. 避免使用CSS表达式
  9. [PCL]NDT点云匹配方法
  10. C 基于UDP实现一个简易的聊天室
  11. some resource favor
  12. HDU1003前导和
  13. hdoj 1874 畅通工程续【dijkstra算法or spfa算法】
  14. TypeScript环境搭建
  15. linux中patch命令 -p 选项
  16. 如何在局域网安装Redmine(转贴)
  17. Dijkstra and Floyd算法
  18. PAT 个位数统计
  19. centos7下kubernetes(18。kubernetes-健康检查)
  20. μC/OS-II 任务堆栈的初始化

热门文章

  1. hadoop入门学习
  2. C基础 内存统一入口
  3. 搭建selenium+python自动化环境
  4. MyEclipse/Eclipse安装插件的几种方式
  5. mapper.xml中的&lt;sql&gt;标签
  6. linux下查看机器配置
  7. linux命令(16):mv命令
  8. DateTimeToUnix/UnixToDateTime 对接时间转换
  9. 微信小程序-二维码汇总
  10. K8S的APISERVER,应用了HTTPS之后,命令行如何访问?