zoukankan      html  css  js  c++  java
  • 洛谷 P1337 平衡点 & bzoj 3680 吊打 XXX —— 模拟退火

    题目:https://www.luogu.org/problemnew/show/P1337

    https://www.lydsy.com/JudgeOnline/problem.php?id=3680

    模拟退火!其实就是随机移动产生解,而且幅度越来越小,以一定的概率接受不优的解;

    设置一个“初温”,每次变小,作为移动的幅度和判断的系数之一;

    exp 是以 e 为底的幂,这个判断依据似乎是个公式;

    然后过程中保留一个最优解作为最后的答案;

    洛谷那道题 n <= 1000,所以 eps 设了 1e-17,dt 设了 0.997,并且做了三次 SA (否则会WA);

    bzoj 的 n <= 10000,所以 eps 设了 1e-15,dt 设了 0.99,并且只做了一次 (否则会T);

    感觉设这些系数很需要经验呢,随机化算法嘛。

    代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<ctime>
    #include<cstdlib>
    #include<cmath>
    #define eps 1e-15//1e-17
    #define dt 0.99//0.997
    using namespace std;
    typedef double db;
    int const xn=10005;
    int n,xx[xn],yy[xn],w[xn];
    db ansx,ansy,ans;
    int rd()
    {
      int ret=0,f=1; char ch=getchar();
      while(ch<'0'||ch>'9'){if(ch=='-')f=0; ch=getchar();}
      while(ch>='0'&&ch<='9')ret=(ret<<3)+(ret<<1)+ch-'0',ch=getchar();
      return f?ret:-ret;
    }
    db dis(db x,db y,db a,db b){return sqrt((x-a)*(x-a)+(y-b)*(y-b));}
    db cal(db x,db y)
    {
      db sum=0;
      for(int i=1;i<=n;i++)sum+=dis(x,y,xx[i],yy[i])*w[i];
      return sum;
    }
    void SA()
    {
      db T=10000,tx,ty,x=ansx,y=ansy,lst=ans;
      while(T>eps)
        {
          tx=x+(rand()*2-RAND_MAX)*T;
          ty=y+(rand()*2-RAND_MAX)*T;
          db tmp=cal(tx,ty),delt=tmp-lst;
          if(delt<0||exp(delt/T)*RAND_MAX<rand())x=tx,y=ty,lst=tmp;
          if(tmp<ans)ans=tmp,ansx=tx,ansy=ty;
          T*=dt; 
        }
    }
    int main()
    {
      srand(time(0));
      n=rd(); int sx=0,sy=0;
      for(int i=1;i<=n;i++)xx[i]=rd(),yy[i]=rd(),w[i]=rd(),sx+=xx[i],sy+=yy[i];
      ansx=1.0*sx/n; ansy=1.0*sy/n; ans=cal(ansx,ansy);
      SA(); 
      printf("%.3lf %.3lf
    ",ansx,ansy);
      return 0;
    }
  • 相关阅读:
    xdoj 1237 (贪心+逆向思维)
    linux系统 (实验一)实验楼的课程笔记
    fc_net.py cs231n
    cnn.py cs231n
    optim.py cs231n
    layers.py cs231n
    Python数据分析与展示[第一周]
    配置了两天python【python可以的】
    PYTHON网络爬虫与信息提取[scrapy框架应用](单元十、十一)
    PYTHON网络爬虫与信息提取[正则表达式的使用](单元七)
  • 原文地址:https://www.cnblogs.com/Zinn/p/9874687.html
Copyright © 2011-2022 走看看