立志成为饮水机!

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

让我们又来发一句:

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

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

 

前言

众所周知·,有一种绝妙的算法 ——  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 @   寒冰大大  阅读(423)  评论(1编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
点击右上角即可分享
微信分享提示