首先通过下面这个链接大概了解了一下什么是模拟退火,我觉得这篇博客还是不错的,但是最开始看完还是感觉很迷茫,不知道模拟退火改如何去应用并解决问题。

点击打开链接

为什么叫模拟退火呢?

想象一个高温物体的降温过程。其温度为T时出现能量差为dE的降温概率为P(dE) =  e ^ ( -dE / (k * T) ) 。

其实就是温度越高降温的概率越大,温度越低降温概率越小。而模拟退火就是利用这样一种思想去进行搜索。

那么在进行搜索的时候首先定义一个初始值( 温度 ) T , 一个系数 r ( 降温速度  0 < r < 1 ) , 假设你当前状态为 f i , 你的下一个状态为 f i +1 , 对这两个状态进行评价,如果更接近你想要的结果,就更新到这个状态,否则则以 P ( dE ) 的概率去更新到 这个状态,但是其实在实际题目中,这个概率是不必要的,这一步有时是可以忽略掉的。我们可以想象,随着搜索次数的不断增多,搜索范围将越来越趋近于稳定,也就是随着时间的增长温度降低的概率越来越低,直到趋近于1。对应搜索就是随着你搜索的次数越多,你搜索到的值是你想要的值的概率就越大。找了一张图可以直观的感受一下模拟退火的过程。

所以具体步骤

1.  初始温度 T , 精度 EPS ( 温度的下界 ) ,当T < EPS 时结束搜索,输出当前最优解

2.  在这个状态周围搜索出一个新的状态 , 如果是当前最优解则更新 ,如果不是则以降温概率更新 ( 可忽略 )

3.  缩小T.

对于初始温度T设定,初始值与你的搜索范围有关。因为T也决定你的搜索范围,为什么不是最优解以降温概率更新的部分可以忽略我是这样认为的,我觉得初始的搜索范围可以取整个搜索范围的大小,任意一个初始搜索点,每次搜索当前搜索范围内的状态,进行最优解的更新以及缩小搜索范围,根据模拟退火的思想,随着搜索范围 T ( 温度 )

的降低,最优解会越来越稳定,而我个人认为的取搜索范围,然后通过系数去减小搜索范围,这样就可以贪心的去保留当前最优解,最终依旧大概率获得全局最优解。可以忽略降温概率更新是因为依旧可以通过搜索范围的变化去得到一个更优值。最终当搜索范围小于你要求的精度时,输出当前最优解。

通过别人的一点认识(点击打开链接),对于精度要求为小数点后1位的,下界可以取1e-3或1e-4,降温系数取 0.8 ,对于精度要求为1e-5 , 下界可取1e-7或1e-8 ,降温系数取 0.98。 可以说是取精度要求* 1e-2 或 1e-3 为下界?然后降温系数在具体调试这样?而且根据实际情况降温系数取0.98或0.99的速度也还可以,这个我在下面的题目进行了小实验。

一.  一维坐标搜索

以hdu 2899为例

题意

F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x (0 <= x <=100)

F (x) 的最小值

我们可订初始温度 T 为 100 ,降温系数取 0.98 ,温度下界 ( 精度 )取1e-6 , 搜索起始点任意,取( 0 , 0 ) 。

题目很简单我就直接贴代码了。

#include<bits/stdc++.h>
using namespace std;
const double EPS=1e-6;
const double r=0.98;
const int dx[2]={-1,1};
double y;double F(double x)
{return 6*pow(x,7)+8*pow(x,6)+7*pow(x,3)+5*pow(x,2)-y*x;
}int main()
{int T;cin>>T;while(T--){cin>>y;double step=100;double x=0;while(step>EPS){for(int i=0;i<2;i++){double next_x=x+dx[i]*step;if(next_x<0||next_x>100)continue;if(F(next_x)<F(x))x=next_x;}step*=r;}printf("%.4f\n",F(x));}return 0;
}

通过在hdu的提交,初始温度100,下界1e-6 , 退火速率 0.99时140ms,0.98时为78ms。

二. 二维坐标搜索

以hdu 3932 为例

题意:

给你一个搜索范围 ( 0,0 ) 到 ( X ,Y )这个矩形范围,给你 N 个点 , 要求找出一个点使这个点到这 N 个点的最大距离最小。

可以想象的就是把一维转变成二维,那么单点搜索我们就可以变成随机多点并行搜索,原来的双向移动,转变为360度随机移动。最后在多点的搜索结果中取最优。

显然移动是以圆的范围移动的,那么温度上界 T 取矩形对角线, 即圆的最大半径,精度为小数点后1位, 精确度EPS取1e-3, 降温速率 r 取0.8,对于每个点我随机了36次移动,具体这个值怎么取更合适我还没考虑清楚。代码如下。

#include<bits/stdc++.h>
using namespace std;const double EPS=1e-3;
const double PI=acos(-1.0);
const double INF=0x3f3f3f3f;
const double r=0.8;
const int maxn=1e4+5;
const int num=20;struct Point{double x,y;
};Point a[maxn];
Point m[maxn];
int n;
double d[maxn];double dist(Point A, Point B)
{return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));
}double MAX(Point t)
{double res=-1;for(int i=0;i<n;i++)res=max(res,dist(t,a[i]));return res;
}int main()
{double xx,yy;srand(time(0));while(cin>>xx>>yy>>n){for(int i=0;i<n;i++)cin>>a[i].x>>a[i].y;for(int i=0;i<num;i++){m[i].x=(rand()%1000+1)/1000.0*xx;m[i].y=(rand()%1000+1)/1000.0*yy;d[i]=MAX(m[i]);}double T=sqrt(xx*xx+yy*yy);Point next,now;while(T>EPS){for(int i=0;i<num; i++){now.x=m[i].x;now.y=m[i].y;for(int j=0;j<36;j++){double ang=(rand()%1000+1)/1000.0*2*PI;next.x=now.x+cos(ang)*T;next.y=now.y+sin(ang)*T;if(next.x<0||next.x>xx||next.y<0||next.y>yy)continue;if(MAX(next)<d[i]){m[i].x=next.x;m[i].y=next.y;d[i]=MAX(next);}}}T*=r;}int res;double ans=INF;for(int i=0;i<num;i++){if(d[i]<ans){ans=d[i];res=i;}}printf("(%.1f,%.1f).\n",m[res].x,m[res].y);printf("%.1f\n",ans);}return 0;
}

三. 近似解决旅行商问题

留坑。。。

哪里有错误请指出!谢谢!

模拟退火的一些个人见解相关推荐

  1. 电子设计搜索引擎引入分析和见解

    电子设计搜索引擎引入分析和见解 Electronics Design Search Engine Introduces Analytics and Insights 2020年上半年最受欢迎的组件是什 ...

  2. poj2420A Star not a Tree?(模拟退火)

    链接 求某一点到其它点距离和最小,求这个和,这个点 为费马点. 做法:模拟退火 1 #include <iostream> 2 #include<cstdio> 3 #incl ...

  3. 模拟退火 HDU - 2899 Strange Function

    Strange Function [ HDU - 2899 ] 题目大意: 函数 F(x) = 6x7 + 8x6 + 7x3 + 5x2 - yx, 其中x的范围是0 ≤ x ≤ 100. 输入y值 ...

  4. 局部邻域搜索-爬山法,模拟退火,禁忌,迭代局部搜索,变邻域局部搜索的简单阐释

    原文来源: 局部搜索算法 - JiePro - 博客园 https://www.cnblogs.com/JiePro/p/Metaheuristics_0.html 局部搜索算法 目录: 1.数学定义 ...

  5. 2018-4-8模拟退火算法

    阅读资料来源: <智能优化算法以及matlab实现>第七章 [图文]智能优化算法_数学建模_王成章_模拟退火法_2011_百度文库 https://wenku.baidu.com/view ...

  6. 2018-4-8使用兔子的例子对比说明遗传算法,局部搜索,禁忌搜索,模拟退火方法

    文章的来源: [图文]智能优化算法_数学建模_王成章_模拟退火法_2011_百度文库 https://wenku.baidu.com/view/335c56e94afe04a1b071de13.htm ...

  7. 谈谈你对集成学习的见解与认识,描述一下它们的优势所在?

    [每日一问]谈谈你对集成学习的见解与认识,描述一下它们的优势所在? Datawhale优秀回答者:HipHopMan 集成方法有很多种,一种叫做bagging,bagging的思想是,我把我的数据做一 ...

  8. HDU2899(二分查找+or+模拟退火算法)

    这道题其实是利用函数求导,判断求导后的函数是否大于零或者小于零,等于零情况,从而判断原函数的单调性,代入X求出函数的最小值. 模拟退火算法: 方法一:二分 #include<stdio.h> ...

  9. luogu P4035 [JSOI2008]球形空间产生器(高斯消元 / 模拟退火)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 数据范围只开到了10,而且是经典的力学结构,所以我们可以用模拟退火,可以做一下 nnn 维的正交分解h ...

最新文章

  1. node.js 微信小程序 部署服务器_微信小程序云开发环境部署,及添加数据
  2. 对学校的希望和寄语_家长对学校的寄语怎么写
  3. 消费提示:警惕近期淘宝上大量超低价白菜包邮产品
  4. 为什么乱码:meta http-equiv=content-type前的非ANSI字符
  5. ElementUI弹框组件 messageBox 如何换行 ?
  6. python写一个类_python3学习笔记--002--写一个类
  7. vscode 添加库头文件_VSCode配置C/C++并添加非工作区头文件的方法
  8. pvremore删除物理卷
  9. 闲置光猫改成无线打印服务器,简单几步,让闲置路由器变身专业无线AP-无线ap设置...
  10. Cadence Allegro修改字体粗细图文教程
  11. 台式电脑主板插线步骤图_电脑主板开关接线图解教程(图文)
  12. 信息隐藏与数字水印实验4-LSB信息隐藏的卡方分析
  13. 2019寒假·纪中记Day0-Day3
  14. Userland中debian系统打开chromium
  15. xpath兄弟结点语法
  16. TcaplusDB君 · 行业新闻汇编(一)
  17. 达芬奇密码 第八十二章
  18. 所见所得的OFFICE功能区编辑器(自定义界面编辑)RibbonCreator
  19. 分享:从华为转正到离职
  20. Java程序设计(一)

热门文章

  1. 【软件测试】黑盒测试方法小结
  2. Android源码国内源下载
  3. 实现 外网 远程桌面 连接 个人pc(开机自启动,校园网web自动验证,多用户远程桌面)
  4. Autosar代码包初识 3 - 创建RH850的GreenHills工程编译Autosar Demo工程
  5. Debian配置国内源
  6. python基础 多点坐标 绘制折线图 计算两点距离
  7. STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记二(2):Cortex-M3处理器内存模型
  8. Python的学习(十八)---- 单元测试工具nose
  9. NoSQL数据库资料
  10. java jpanel 层,java – 循环遍历JPanel