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

题目大意:原题链接

给出指定的区域,以及平面内的点集,求出一个该区域内一个点的坐标到点集中所有点的最小距离最大.

解题思路:一开始想到用随机化算法解决,但是不知道如何实现。最后看了题解才知道原来是要用模拟退火算法解决。

不过个人感觉这个算法的实现过程中仍然采用了随机化算法。二者均属于概率算法。  参考链接

Point Goto_Rand_Dir(double key,Point temp)函数中,Point temp必须得定义在参数中,不能定义在函数内部,

否则temp没有初始值,无法进行后面的加法运算.

#include<ctime>
#include<cmath>
#include<cstdio>
#include<cstdlib>
const int shift=60;
const double inf=1e10;
const double pi=acos(-1.0);
struct Point
{
    double x,y;
}p[1010],randp[4];

double Get_Dis(Point a,Point b)
{
    return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
Point Get_Rand_Point(int a,int b)
{
    Point temp;
    temp.x=rand()%a+1;
    temp.y=rand()%b+1;
    return temp;
}
Point Goto_Rand_Dir(double key,Point temp)
{
    double delta=2*pi*(double)rand()/RAND_MAX;
    temp.x+=key*sin(delta);
    temp.y+=key*cos(delta);
    return temp;
}

int main()
{
    double dis[5];
    int i,j,k,T,x,y,m;
    scanf("%d",&T);
    srand(time(NULL));
    while(T--){
        double now;
        Point temp;
        scanf("%d%d%d",&x,&y,&m);
        for(i=1;i<=m;i++)
            scanf("%lf%lf",&p[i].x,&p[i].y);
        for(i=1;i<=4;i++){//分别往四个方向找四个方向的最小值
            dis[i]=inf;
            randp[i]=Get_Rand_Point(x,y);//给randp[]数组随机取横纵坐标值
            for(j=1;j<=m;j++){
                now=Get_Dis(randp[i],p[j]);
                if(now<dis[i]) dis[i]=now;//dis[i]存的是最小值
            }
        }
        double key=sqrt(1.0*(x*x+y*y))/2;//关键
        while(key>=0.01){//精度要求
            for(i=1;i<=4;i++){
                for(j=1;j<=shift;j++){
                    temp=randp[i];//采用之前四个方向确定的随机横纵坐标值
                    temp=Goto_Rand_Dir(key,temp);
                    if(temp.x<0||temp.y<0||temp.x>x||temp.y>y)
                        continue;
                    now=inf;
                    for(k=1;k<=m;k++){
                        double dist=Get_Dis(temp,p[k]);
                        if(now>dist) now=dist;//now存的是最小值
                    }
                    if(now>dis[i]){
                        dis[i]=now;//dis[i]中存的是最小值最大
                        randp[i]=temp;
                    }
                }
            }
            key=key*0.8;
        }
        for(i=1,k=1;i<=4;i++)//在四个方向中找最小值最大
            if(dis[i]>dis[k]) k=i;
        printf("The safest point is (%.1lf, %.1lf).\n",randp[k].x,randp[k].y);
    }
}
时间: 2024-10-27 10:13:14

PKU 1379 Run Away(模拟退火算法)的相关文章

POJ 1379 Run Away 模拟退火

一开始写了一发很快的,发现一会能过一会不能,貌似有点悬,毕竟是随机算法. 后来重写了一发迭代5遍的,基本上把把AC了= = 模拟退火果然是一种不是很靠谱的算法. #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <cstdlib> #include <ctime> using namespace std; const

poj 1379 Run Away 模拟退火 难度:1

Run Away Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 6482   Accepted: 1993 Description One of the traps we will encounter in the Pyramid is located in the Large Room. A lot of small holes are drilled into the floor. They look complet

POJ 1379 模拟退火算法

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

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

两种改进的模拟退火算法求解大值域约束满足问题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 二. 模

模拟退火算法简介

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

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

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