立志成为饮水机!

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

让我们又来发一句:

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

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

 

前言

众所周知·,有一种绝妙的算法 ——  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了一个标题,所以瞎写写了一般,文章内容绝对无学术意义(应该

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

posted @ 2019-07-27 17:08  寒冰大大  阅读(414)  评论(1编辑  收藏  举报