一 概念

模拟退火(Simulated Annealing,简称SA)是一种通用概率算法(随机化算法),用来在一个大的搜寻空间内找寻命题的最优解。

随机化算法是这样一种算法,在算法中使用了随机函数,且随机函数的返回值直接或者间接的影响了算法的执行流程或执行结果。

随机算法包括模拟退火。禁忌搜索,遗传算法等。

适应范围:大的搜寻空间(例如,参数很多)

二 模拟退火算法-转载自http://www.cnblogs.com/heaad/archive/2010/12/20/1911614.html

优化算法入门系列文章目录(更新中):

  1. 模拟退火算法

  2. 遗传算法

一. 爬山算法 ( Hill Climbing )

介绍模拟退火前,先介绍爬山算法。爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解。

爬山算法实现很简单,其主要缺点是会陷入局部最优解,而不一定能搜索到全局最优解。如图1所示:假设C点为当前解,爬山算法搜索到A点这个局部最优解就会停止搜索,因为在A点无论向那个方向小幅度移动都不能得到更优的解。

图1

 

二. 模拟退火(SA,Simulated Annealing)思想

爬山法是完完全全的贪心法,每次都鼠目寸光的选择一个当前最优解,因此只能搜索到局部的最优值。模拟退火其实也是一种贪心算法,但是它的搜索过程引入了随机因素。模拟退火算法以一定的概率来接受一个比当前解要差的解,因此有可能会跳出这个局部的最优解,达到全局的最优解。以图1为例,模拟退火算法在搜索到局部最优解A后,会以一定的概率接受到E的移动。也许经过几次这样的不是局部最优的移动后会到达D点,于是就跳出了局部最大值A。

模拟退火算法描述:

若J( Y(i+1))>= J( Y(i) )  (即移动后得到更优解),则总是接受该移动

若J( Y(i+1))< J( Y(i) )  (即移动后的解比当前解要差),则以一定的概率接受移动,而且这个概率随着时间推移逐渐降低(逐渐降低才能趋向稳定)

  这里的“一定的概率”的计算参考了金属冶炼的退火过程,这也是模拟退火算法名称的由来。

  根据热力学的原理,在温度为T时,出现能量差为dE的降温的概率为P(dE),表示为:

    P(dE) =exp( dE/(kT) )

  其中k是一个常数,exp表示自然指数,且dE<0。这条公式说白了就是:温度越高,出现一次能量差为dE的降温的概率就越大;温度越低,则出现降温的概率就越小。又由于dE总是小于0(否则就不叫退火了),因此dE/kT < 0 ,所以P(dE)的函数取值范围是(0,1) 。

  随着温度T的降低,P(dE)会逐渐降低。

  我们将一次向较差解的移动看做一次温度跳变过程,我们以概率P(dE)来接受这样的移动。

  关于爬山算法与模拟退火,有一个有趣的比喻:

  爬山算法:兔子朝着比现在高的地方跳去。它找到了不远处的最高山峰。但是这座山不一定是珠穆朗玛峰。这就是爬山算法,它不能保证局部最优值就是全局最优值。

  模拟退火:兔子喝醉了。它随机地跳了很长时间。这期间,它可能走向高处,也可能踏入平地。但是,它渐渐清醒了并朝最高方向跳去。这就是模拟退火。

下面给出模拟退火的伪代码表示。

三. 模拟退火算法伪代码

代码

/*

*  J(y):在状态y时的评价函数值

*  Y(i):表示当前状态

* Y(i+1):表示新的状态

*  r: 用于控制降温的快慢

*  T: 系统的温度,系统初始应该要处于一个高温的状态

*  T_min:温度的下限,若温度T达到T_min,则停止搜索

*/

while( T > T_min )

{

//对于每一个温度不是只产生一个解进行比较,而是产生很多个解。crazyhacking注

  dE = J( Y(i+1)) - J( Y(i) ) ;

  if ( dE>= 0 )  //表达移动后得到更优解,则总是接受移动

Y(i+1) = Y(i) ;  //接受从Y(i)到Y(i+1)的移动

  else

  {

//函数exp( dE/T )的取值范围是(0,1) ,dE/T越大,则exp( dE/T )也

if ( exp( dE/T ) > random( 0 , 1 ) )

Y(i+1) = Y(i) ;  //接受从Y(i)到Y(i+1)的移动

  }

  T = r * T;  //降温退火,0<r<1 。r越大,降温越慢;r越小,降温越快

  /*

  * 若r过大,则搜索到全局最优解的可能会较高,但搜索的过程也就较长。若r过小,则搜索的过程会很快,但最终可能会达到一个局部最优值

  */

  i ++ ;

}

上面算法的问题是://对于每一个温度不是只产生一个解进行比较,而是产生很多个解。crazyhacking注

四. 使用模拟退火算法解决旅行商问题

  旅行商问题 ( TSP, Traveling Salesman Problem ) :有N个城市,要求从其中某个问题出发,唯一遍历所有城市,再回到出发的城市,求最短的路线。

  旅行商问题属于所谓的NP完全问题,精确的解决TSP只能通过穷举所有的路径组合,其时间复杂度是O(N!) 。

  使用模拟退火算法可以比较快的求出TSP的一条近似最优路径。(使用遗传算法也是可以的,我将在下一篇文章中介绍)模拟退火解决TSP的思路:

1. 产生一条新的遍历路径P(i+1),计算路径P(i+1)的长度L( P(i+1) )

2. 若L(P(i+1)) < L(P(i)),则接受P(i+1)为新的路径,否则以模拟退火的那个概率接受P(i+1) ,然后降温

3. 重复步骤1,2直到满足退出条件

  产生新的遍历路径的方法有很多,下面列举其中3种:

1. 随机选择2个节点,交换路径中的这2个节点的顺序。

2. 随机选择2个节点,将路径中这2个节点间的节点顺序逆转。

3. 随机选择3个节点m,n,k,然后将节点m与n间的节点移位到节点k后面。

五. 算法评价

模拟退火算法是一种随机算法,并不一定能找到全局的最优解,可以比较快的找到问题的近似最优解。 如果参数设置得当,模拟退火算法搜索效率比穷举法要高。

 from here : http://www.cnblogs.com/heaad/  转载请注明

三   算法注意事项--http://wenku.baidu.com/view/266560d2240c844769eaee07.html

模拟退火算法的参数控制问题

模拟退火算法的应用很广泛,可以求解NP完全问题,但其参数难以控制,其主要问题有以下三点:

(1) 温度T的初始值设置问题

温度T的初始值设置是影响模拟退火算法全局搜索性能的重要因素之一、初始温度高,则搜索到全局最优解的可能性大,但因此要花费大量的计算时间;反之,则可节约计算时间,但全局搜索性能可能受到影响。实际应用过程中,初始温度一般需要依据实验结果进行若干次调整。

(2) 退火速度问题退火速度问题退火速度问题退火速度问题。。。。   模拟退火算法的全局搜索性能也与退火速度密切相关。一般来说,同一温度下的“充分”搜索(退火)是相当必要的,但这需要计算时间。实际应用中,要针对具体问题的性质和特征设置合理的退火平衡条件。

(3) 温度管理问题温度管理问题温度管理问题温度管理问题。。。。   温度管理问题也是模拟退火算法难以处理的问题之一。实际应用中,由于必须考虑计算复杂度的切实可行性等问题,常采用如下所示的降温方式:      式中k为正的略小于1.00的常数,t为降温的次数。

转载于:https://www.cnblogs.com/catkins/archive/2013/03/25/5270641.html

随机化算法-----模拟退火相关推荐

  1. 0046算法笔记——【随机化算法】舍伍德随机化思想解决跳跃表问题

    问题描述 如果用有序链表来表示一个含有n个元素的有序集S,则在最坏情况下,搜索S中一个元素需要O(n)计算时间.提高有序链表效率的一个技巧是在有序链表的部分结点处增设附加指针以提高其搜索性能.在增设附 ...

  2. 算法积分0042算法笔记——【随机化算法】计算π值和计算定积分

    最近研究算法积分,稍微总结一下,以后继续补充: 1.盘算π值 问题描述 设有一半径为r的圆及其外切四边形.向该正方形随机地投掷n个点.设落入圆内的点数为k.由于所投入的点在正方形上平均分布,因而所投入 ...

  3. 随机化算法-数值随机化算法

    随机数 随机数在随机化算法设计中扮演着十分重要的角色.在现实计算机上无法产生真正的随机数,因此在随机化算法中使用的随机数都是一定程度上随机的,即伪随机数. 线性同余法是产生伪随机数的最常用的方法.由线 ...

  4. 算法小课堂(十)随机化算法

    目录 一.概述 1.1概念 1.2分类 二.数值随机化算法 2.1随机数 2.2用随机投点法计算Π值 2.3随机投点法计算定积分 三.舍伍德(Sherwood)型随机化算法 3.1随机洗牌算法 3.2 ...

  5. 数值随机化算法和舍伍德随机算法

    开篇 我们之前讨论过的动态规划算法.回溯法.分支限界算法.二分法等等都是每个计算步骤确定的算法,而这次要讨论的是随机化算法,允许算法在执行过程中随机地选择下一个计算步骤. 随机化算法不一定是最优的,甚 ...

  6. 优化算法——模拟退火算法

    模拟退火算法原理 爬山法是一种贪婪的方法,对于一个优化问题,其大致图像(图像地址)如下图所示: 其目标是要找到函数的最大值,若初始化时,初始点的位置在CCC处,则会寻找到附近的局部最大值AAA点处,由 ...

  7. schrage方法c语言编程软件,C++: 详解 使用Schrage's Method Revealed 实现随机化算法

    C++: 详解 使用Schrage's Method Revealed(随机化算法) 标签: C++ 随机化算法 Schrage by 小威威 在了解Schrage's Method Revealed ...

  8. 快速排序的随机化算法C语言版

    快速排序的随机化算法C语言版 #include<stdio.h> #include<stdlib.h> void quicksort(int *a, int left, int ...

  9. 0049算法笔记——【随机化算法】蒙特卡罗算法,主元素问题,素数测试问题

    1.蒙特卡罗算法 基本概述        蒙特卡罗(Monte Carlo)方法,又称随机抽样或统计试验方法.传统的经验方法由于不能逼近真实的物理过程,很难得到满意的结果,而蒙特卡罗方法由于能够真实地 ...

最新文章

  1. Valgrind 快速入门
  2. 常见的基于node.js的web框架
  3. vue如何取消下拉框按回车自动下拉_按逗号拆分Excel单元格,再分离中文数字,春节压岁钱统计就用它...
  4. 大数据项目开发案例_大数据分析技术——项目案例1(猫眼电影数据分析上)...
  5. Uber提出有创造力的POET:自行开发更困难环境和解决方案
  6. c++ 解析xml文件
  7. 超实用,Spring Security+JWT+Vue实现一个前后端分离无状态认证Demo
  8. java 搜索起始位置,从Java中的给定位置搜索字符
  9. 关于Java的反射机制,你需要理解这些..
  10. LTE物理层一些基本概念
  11. 【Android-File】Android文件的读写
  12. 卖油的都开始卖菜了,打败你的往往不是对手
  13. 《14天从0到1学Java》第一天之04第一行Java代码
  14. 能哄老婆睡觉的小故事
  15. Spark Transformation转换算子和Action行动算子
  16. 独立看门狗和窗口看门狗的区别
  17. AVFrame相关api内存管理
  18. win7计算机开始里没有设置,win7系统开始菜单没有设置的解决方法?
  19. Unity5权威讲解之菜鸟读书笔记(一)
  20. 杭电acm 4545魔法串(字符串处理)

热门文章

  1. 有效的括号Python解法
  2. linux修改密码提示unix,linux中普通用户批改密码出现(passwd:Authentication token manipulation error)...
  3. Notepad++远程连接Linux系统
  4. 线程id 获取线程名称_016 线程及初步网络编程
  5. 我学的技术,过时?被淘汰?
  6. Modelsim10.7中文注释乱码问题
  7. FPGA实现A5算法并仿真
  8. centos7 xampp启动mysql数据库_mysql主从配置,用win xampp和centos7环境下测试
  9. java workerdone_【架构】Java并发编程——线程池的使用
  10. asp python 定时任务_python定时任务最强框架APScheduler详细教程