• [模拟退火的兄弟]模拟上火


    让我们又来发一句:

    发布于博客园,未经本人允许,不可转载。(你就别把这种睿智文章发到其他地方丢我脸了吧)

    目前你能在这几个地方看到:博客园,洛谷

    前言

    众所周知·,有一种绝妙的算法 ——  SA 也就是模拟退火。

    它是解决TSP问题的比较优秀方法之一。

    它的解决方案是先定一个极大的范围,然后不断缩小范围。

    但是范围实在是太大了,我们在这个巨大的范围内浪费了很多时间。

    因此,优化的办法——模拟上火,就来了。

    举这个例子

    当然由于本人太菜,模拟上火只能拿89分,可能是参数调的不完美。

    但是时间从926ms→261ms,基本上飞起来。存在毒瘤翻车情况(跑几次模拟上火都A不了的),因此模拟上火适用的范围是:

    数据太大,一般的模拟退火T到飞起,因此需要缩小到一个合适的范围。

    一般来说,一个峰比较少的函数,或者比较密集的函数,我们可以用到模拟上火

    下面我们就来说一下模拟上火的主要函数确定温度的fever函数

     1 double fever(int age)  //age指的是迭代次数
     2 {
     3     double nx,ny;
     4     nx=ax,ny=ay;
     5     double t=max(bt,1.1)+rand()/10.0;
     6     double dt=((rand()%1000)/100000.0)+1.1;  //dt指的是升温系数
     7     while(age)
     8     {
     9         double tx,ty;
    10         age--;
    11         tx=nx+(rand()*2-RAND_MAX)*t;
    12         ty=ny+(rand()*2-RAND_MAX)*t;
    13         double nowe=getengry(tx,ty);  
    14         if(nowe<lans) lans=nowe,nx=tx,ny=ty,ax=tx,ay=ty,age+=5;   //找到比你好了的,多活几年吧
    15         else if(exp(-nowe/t)*RAND_MAX>rand()) nx=tx,ny=ty,age-=5; //你就是最好了的,折寿
    16         t*=dt;
    17     } 
    18     return t;
    19 }

    于是经过本人(yy出来的)模拟上火,就弄出来了

    对了,如果你真的要好好去学模拟退火,这篇文章你可以关了。

    如果这篇文章对你有帮助的话,请马上关闭这个页面,这才是对你的帮助。

    由于是yy了一个标题,所以瞎写写了一般,文章内容绝对无学术意义(应该

    另外,我是等这篇文章被爬

  • 相关阅读:
    前端获取当前路径
    pycharm快捷键
    权限(二)
    权限(1)
    cookie,session,用户认证组件
    装饰器
    admin组件的使用
    thinkphp5.0独立配置
    thinkphp5.0读取配置
    thinkphp5.0配置加载
  • 原文地址:https://www.cnblogs.com/zsx6/p/11255830.html
Copyright © 2020-2023  润新知