爬山算法 模拟退火

bzoj3680 吊打XXX

题目大意:给定一些绳子和绳子上的重量,求出最后绳结的坐标。

思路:这个位置就是广义费马点,就是所有点到这个点的距离*每个点的权值最小的点。模拟退火,各种调常数。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#define maxnode 10005
using namespace std;
struct use{
    double x,y,gi;
}ai[maxnode]={0},ans;
double minn=999999999999999LL;
int n;
double ran(){return rand()%1000/1000.0;}
double fang(double a){return a*a;}
double dis(use a,use b){return sqrt(fang(a.x-b.x)+fang(a.y-b.y));}
double calc(use a)
{
    int i;double j=0;
    for (i=1;i<=n;++i) j+=dis(a,ai[i])*ai[i].gi;
    if (j<minn){minn=j;ans=a;} return j;
}
void work(double t)
{
    use a,now=ans;int i;double j;
    while(t>0.01)
    {
        a.x=now.x+t*(ran()*2-1);
        a.y=now.y+t*(ran()*2-1);
        j=calc(now)-calc(a);
        if (j>0||exp(j/t)>ran()) now=a;
        t*=0.980;
    }
    for (i=1;i<=1000;++i)
    {
        a.x=ans.x+t*(ran()*2-1);
        a.y=ans.y+t*(ran()*2-1);
        calc(a);
    }
}
int main()
{
    int i,j;scanf("%d",&n);srand(23333);
    for (i=1;i<=n;++i)
    {
        scanf("%lf%lf%lf",&ai[i].x,&ai[i].y,&ai[i].gi);
        ans.x+=ai[i].x*1.0;ans.y+=ai[i].y*1.0;
    }ans.x/=n;ans.y/=n;
    work(500000);printf("%.3f %.3f\n",ans.x,ans.y);
}

时间: 2024-10-12 08:07:21

爬山算法 模拟退火的相关文章

BZOJ 3680: 吊打XXX【模拟退火算法裸题学习,爬山算法学习】

3680: 吊打XXX Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 3192  Solved: 1198[Submit][Status][Discuss] Description gty又虐了一场比赛,被虐的蒟蒻们决定吊打gty.gty见大势不好机智的分出了n个分身,但还是被人多势众的蒟蒻抓住了.蒟蒻们将 n个gty吊在n根绳子上,每根绳子穿过天台的一个洞.这n根绳子有一个公共的绳结x.吊好gty后蒟蒻们发现

爬山算法和模拟退火算法简介

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

爬山算法和模拟退火算法简介(转)

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

机器学习优化算法之爬山算法小结

简言 机器学习的项目,不可避免的需要补充一些优化算法,对于优化算法,爬山算法还是比较重要的.鉴于此,花了些时间仔细阅读了些爬山算法的paper.基于这些,做一些总结. 目录 1. 爬山算法简单描述  2. 爬山算法的主要算法 2.1 首选爬山算法 2.2 最陡爬山算法 2.3 随机重新开始爬山算法 2.4 模拟退火算法(也是爬山算法) 3. 实例求解 正文 爬山算法,是一种局部贪心的最优算法. 该算法的主要思想是:每次拿相邻点与当前点进行比对,取两者中较优者,作为爬坡的下一步. 举一个例子,求解

爬山算法和退火算法

爬山算法爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解.爬山算法实现很简单,其主要缺点是会陷入局部最优解,而不一定能搜索到全局最优解.如下图所示:假设C点为当前解,爬山算法搜索到A点这个局部最优解就会停止搜索,因为在A点无论向那个方向小幅度移动都不能得到更优的解. 退火算法模拟退火算法来源于固体退火原理,将固体加温至充分高,再让其徐徐冷却,加温时固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平

机器学习之爬山算法小结

简言 机器学习的项目,不可避免的需要补充一些优化算法,对于优化算法,爬山算法还是比较重要的.鉴于此,花了些时间仔细阅读了些爬山算法的paper.基于这些,做一些总结. 目录 1. 爬山算法简单描述  2. 爬山算法的主要算法 2.1 首选爬山算法 2.2 最陡爬山算法 2.3 随机重新开始爬山算法 2.4 模拟退火算法(也是爬山算法) 3. 实例求解 正文 爬山算法,是一种局部贪心的最优算法. 该算法的主要思想是:每次拿相邻点与当前点进行比对,取两者中较优者,作为爬坡的下一步. 举一个例子,求解

爬山算法

算法描述:爬山算法是一种局部择优的方法,采用启发式方法,是对深度优先搜索的一种改进,它利用反馈信息帮助生成解的决策. 属于人工智能算法的一种.从当前的节点开始,和周围的邻居节点的值进行比较. 如果当前节点是最大的,那么返回当前节点,作为最大值(既山峰最高点):反之就用最高的邻居节点来,替换当前节点,从而实现向山峰的高处攀爬的目的.如此循环直到达到最高点. 算法的优缺点: 优点 避免遍历,通过启发选择部分节点,从而达到提高效率的目的. 缺点 因为不是全面搜索,所以结果可能不是最佳. 爬山算法一般存

POJ 2420 A Star not a Tree? 爬山算法

B - A Star not a Tree? Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=88808#problem/B Description Luke wants to upgrade his home computer network from 10mbs to 100mbs. His existing network uses 10ba

BZOJ 3680 吊打XXX 爬山算法

题意:链接 方法:爬山算法 解析: 首先刚开始选一个点,然后找到它的合外力的方向,朝这个方向走即可. 一直重复直至温度小于eps. 至于为何如此,因为每次走的方向一定,所以可看做函数单峰? 不必退火直接爬山即可. 代码: #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 10010 #de