【模拟退火算法】

#include<cstdio>
#include<cmath>
#include<algorithm>
#define ld long double
#define eps 1e-8
using namespace std;
int n;double r;
struct point{
  double x,y;
}p[100005],o;
inline double sqr(double x){
  return x*x;
}
double dis(point a,point b)
{
  return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));
}
inline bool cmp(double a,double b)
{
  return fabs(a-b)<eps;
}
point geto(point a,point b,point c)
{
      double a1,a2,b1,b2,c1,c2;
      point ans;
      a1=2*(b.x-a.x),b1=2*(b.y-a.y),c1=sqr(b.x)-sqr(a.x)+sqr(b.y)-sqr(a.y);
      a2=2*(c.x-a.x),b2=2*(c.y-a.y),c2=sqr(c.x)-sqr(a.x)+sqr(c.y)-sqr(a.y);
      if(cmp(a1,0))
      {
           ans.y=c1/b1;
           ans.x=(c2-ans.y*b2)/a2;
      }
      else if(cmp(b1,0))
      {
           ans.x=c1/a1;
           ans.y=(c2-ans.x*a2)/b2;
      }
      else
      {
          ans.x=(c2*b1-c1*b2)/(a2*b1-a1*b2);
          ans.y=(c2*a1-c1*a2)/(b2*a1-b1*a2);
      }
      return ans;
}

int main()
{
  scanf("%d",&n);
  for(int i=1;i<=n;i++)
  {
      scanf("%lf%lf",&p[i].x,&p[i].y);
  }
  o=p[1];
  for(int i=1;i<=n;i++)
  {
    if(dis(o,p[i])<r||cmp(dis(o,p[i]),r))continue;
    o.x=(p[i].x+p[1].x/2);o.y=(p[i].y+p[1].y/2);r=dis(p[i],p[1])/2;
    for(int j=2;j<i;j++)
    {
      if(dis(o,p[j])<r||cmp(dis(o,p[j]),r))continue;
      o.x=(p[i].x+p[j].x)/2;o.y=(p[i].y+p[j].y)/2;r=dis(p[i],p[j])/2;
      for(int k=1;k<j;k++)
      {
        if(dis(o,p[k])<r||cmp(dis(o,p[k]),r))continue;
        o=geto(p[i],p[j],p[k]);r=dis(o,p[i]);
      }
    }
  }
  printf("%.3f",r);return 0;
} 

MARK VOID(GETO)

bzoj1336/bzoj1337

张老师上上礼拜讲的课,感觉再不写就要忘记这个鬼畜的东西了。

时间: 2024-10-10 05:47:10

【模拟退火算法】的相关文章

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

题目链接: A Star not a Tree? Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5219   Accepted: 2491 Description Luke wants to upgrade his home computer network from 10mbs to 100mbs. His existing network uses 10base2 (coaxial) cables that allo

PKU 1379 Run Away(模拟退火算法)

题目大意:原题链接 给出指定的区域,以及平面内的点集,求出一个该区域内一个点的坐标到点集中所有点的最小距离最大. 解题思路:一开始想到用随机化算法解决,但是不知道如何实现.最后看了题解才知道原来是要用模拟退火算法解决. 不过个人感觉这个算法的实现过程中仍然采用了随机化算法.二者均属于概率算法.  参考链接 Point Goto_Rand_Dir(double key,Point temp)函数中,Point temp必须得定义在参数中,不能定义在函数内部, 否则temp没有初始值,无法进行后面的

两种改进的模拟退火算法求解大值域约束满足问题1.0

0引言 约束满足问题(Constraint Satisfaction Problem,CSP)是人工智能研究领域中一个非常重要的分支,现已成为理论计算机科学.数学和统计物理学等交叉学科研究中的热点问题.人工智能.计算机科学和自动控制等领域中的许多问题都可以归结为约束满足问题.同时,约束满足问题在实际问题如模式识别.决策支持.物流调度及资源分配等领域也有着非常广泛的应用. CSP由一个变量集合和一个约束集合组成.每个变量都有一个非空的可能值域,每个约束描述了一个变量子集与子集内各变量的相容赋值,所

Matlab随笔之模拟退火算法

问题描述: 我方有一个基地,经度和纬度为( 70,40).假设我方飞机的速度为 1000 公里/小时. 我方派一架飞机从基地出发,侦察完敌方所有目标,再返回原来的基地.在敌方每一目 标点的侦察时间不计,求该架飞机所花费的时间(假设我方飞机巡航时间可以充分长). 这是一个旅行商问题.我们依次给基地编号为 1,敌方目标依次编号为 2, 3,…, 101, 最后我方基地再重复编号为 102(这样便于程序中计算). 距离矩阵 D = ( dij )102×102 , 其中 dij 表示表示 i, j 两

大白话解析模拟退火算法(转)

优化算法入门系列文章目录(更新中): 1. 模拟退火算法 2. 遗传算法 一. 爬山算法 ( Hill Climbing ) 介绍模拟退火前,先介绍爬山算法.爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解. 爬山算法实现很简单,其主要缺点是会陷入局部最优解,而不一定能搜索到全局最优解.如图1所示:假设C点为当前解,爬山算法搜索到A点这个局部最优解就会停止搜索,因为在A点无论向那个方向小幅度移动都不能得到更优的解. 图1 二. 模

POJ 1379 模拟退火算法

求规定平面上一点到已知点的最小距离最大的点. 模拟退火的流程是,随机构造几组解作为初始解空间,每次对当前解空间进行随机扩展,若发现更优解则替换. 进行的次数由参数人为控制,而随机扩展的幅度也是随着次数逐渐减小的. #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<cmath> #include<string> #include&

模拟退火算法简介

优化算法入门系列文章目录(更新中): 1. 模拟退火算法 2. 遗传算法 一. 爬山算法 ( Hill Climbing ) 介绍模拟退火前,先介绍爬山算法.爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解. 爬山算法实现很简单,其主要缺点是会陷入局部最优解,而不一定能搜索到全局最优解.如图1所示:假设C点为当前解,爬山算法搜索到A点这个局部最优解就会停止搜索,因为在A点无论向那个方向小幅度移动都不能得到更优的解. 图1    

【算法杂谈】模拟退火算法

最近看到量子退火计算机[D-Ware]研制成功,博主表示十分的兴奋. 我就浅谈一下什么是[模拟退火算法] ----------------------[从爬山算法开始]---------------------------------- [抱歉,图画的太渣] 好的,我们现在开始假设你在爬这座山,你的任务是在爬完这座山之后告诉我最高的点是哪里. 那么我们用爬山算法的思想来模拟一下. 首先,你来到了A,你心想:这里是我到过最高的地方了(......),所以在当前情况下最优值是A 一会,你来到了B,你

模拟退火算法解析

一. 爬山算法 ( Hill Climbing ) 介绍模拟退火前,先介绍爬山算法.爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解. 爬山算法实现很简单,其主要缺点是会陷入局部最优解,而不一定能搜索到全局最优解.如图1所示:假设C点为当前解,爬山算法搜索到A点这个局部最优解就会停止搜索,因为在A点无论向那个方向小幅度移动都不能得到更优的解. 图1     二. 模拟退火(SA,Simulated Annealing)思想 爬山法

[转] 大白话解析模拟退火算法

感谢原文作者,转自:http://www.cnblogs.com/heaad/archive/2010/12/20/1911614.html 一. 爬山算法 ( Hill Climbing ) 介绍模拟退火前,先介绍爬山算法.爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解. 爬山算法实现很简单,其主要缺点是会陷入局部最优解,而不一定能搜索到全局最优解.如图1所示:假设C点为当前解,爬山算法搜索到A点这个局部最优解就会停止搜索,因