“模拟退火算法的并行化”之“什么是模拟退火算法”
来源:互联网 发布:html5手机微场景源码 编辑:程序博客网 时间:2024/05/22 00:58
退火,Annealing,高温物体经降温形成晶体的过程。其过程可以看做是在晶格空间求解最优解的过程。
模拟退火,Simulated Annealing,模拟自然界退火过程而求解多维非凹函数最优解的算法[1]。
[1] S. Kirkpatrick, C. D. Gelatt, Jr., and M. P. Vecchi, “Optimization by Simulated Annealing,”
Science, May 13, 1983, pp. 671 - 680.
不好理解,确实有点。
直接看伪码:
/* * Initialize Problem. */solution = randomSolution();temperature = initialTemperature();searchRegion = initialSearchRegion();/* * Solve by Simulated Annealing. */while (outerLoopExitCriterion() == false) { // Outer Loop while (innerLoopExitCriterion() == false) { // Inner Loop newSolution = generateNewSolution(solution, searchRegion); deltaCost = cost(newSolution) - cost(solution); randomNumber = random(0, 1); if (randomNumber < exp(-deltaCost/temperature)) { solution = newSolution; } } // End of Inner Loop temperature = updateTemperature(); searchRegion = updateSearchRegion();} // End of Outer Loop
cost(const Solution&)是成本函数,即我们试图最小化的函数。其余通过注释和函数及变量名就可猜出一二。
外层循环就是对温度,temperature和搜索范围,searchRegion的更新操作,一般有指定的计划方案,schedule,也会根据当前内部循环和解的情况做相应的调整。
这里要讲讲内层循环:
我们通过变换旧的解得到新的解,searchRegion指可变换的范围,不出所料,随着迭代的次数增多,searchRegion应该趋向缩小;
deltaCost即
Δcost ,用于衡量新解对旧解的改进程度,Δcost>0 表明解退步,Δcost<0 表明解进步,Δcost=0 表明解不进不退;下面生成一个随机数,用于当解退步时判断是否接受此解;
判断是否接受新解的关键一步:
if (randomNumber < exp(-deltaCost/temperature))
这里Δcost 代表deltaCost,T 代表temperture,r 代表randomNumber:- 当
Δcost<0 时,e−Δcost/T>1 ,由于r∼Uniform(0,1) ,则r∈[0,1] ,则if语句为真,当解有改进时恒接受; - 当
Δcost≥0 时,0<e−Δcost/T≤1 ,则根据r 和e−Δcost/T 的大小关系,决定是否接受新解。当然,当Δcost 变大或T 变小时,e−Δcost/T 更接近于0 ,则被接受的概率越低,相反,越高。 - 形象的说,
e−Δcost/T 可以看做是新解被接受的概率,当解改进时,概率大于1,一定接受,当解退步时,概率小于1,不一定接受。 - 当新解较旧解退步时,
Δcost 越大,退步越大,新解被接受的概率越低,相反,Δcost 越小,退步不大,则新解被接受的概率越高。 - 另外,当温度升高时,概率也变大,当温度降低时,概率就变小。一般初始温度很高,退步的新解的接受概率也大,随着迭代次数的增加,温度降低(退火的意义所在),退步的新解就不那么容易被接受了,当然,改进的新解总是被接受。
- 当
- 一旦满足上面的条件,新解被接受,替代旧解。
说点模拟退火的好处吧:
比较好实现,真的,主要逻辑就上面这几行,不同的应用,实现不同的函数就成了;
约束比较好加,一般的解空间是受约束的,即有些多维空间的点是解,有些不在解空间内,当你构造初始解和新解的时候,就要考虑这些事情了,模拟退火比其他的一些最优化解法(如解析求解)好在约束在构造解的时候,可以人为检查。
在不考虑运行时间的情况下(允许它很慢),非凹函数的最终解的质量还是很好的。由于模拟退火在退火过程中不是一概拒绝退步的解,这就使模拟退火对局部解不是那么敏感,在高温及中等温度的情况下,它可以爬上局部解周围的缓坡,跳出局部陷阱。
那缺点呢?
我本不想这么快就说它的缺点,但还是客观一点好,优缺点一起摆出:
模拟退火其实就是靠大数定律才成立的一个方法,初始解和产生新解,判断新解是否能够接受都是靠随机数,都是靠概率;
上面提到过,慢!本身模拟退火靠大数定律才成立,所以,大量的解是一定要产生的,当问题规模不断变大,搜索的解的数目呈指数级增长,想要提供很好质量的解变得异常难,无限膨胀的运行时间,不知要到何时;
很难并行化,但并不是不可以。模拟退火的执行是序列性的,从上面的代码就可以看出,一个解是在前面解的基础上产生的。它明显不是一个自然并行的程序(矩阵相乘就是自然并行的程序),它的并行化也是另外一篇博客的主题。
- “模拟退火算法的并行化”之“什么是模拟退火算法”
- “模拟退火算法的并行化”之“接手‘硬骨头’”
- “模拟退火算法的并行化”之“工欲善其事,必先利其器”
- 模拟退火算法的基本原理
- 模拟退火算法的介绍
- "活"的模拟退火算法
- 模拟退火算法
- 模拟退火算法
- 模拟退火算法
- 模拟退火,遗传算法
- 模拟退火算法概述
- 模拟退火算法
- 遗传模拟退火算法
- 模拟退火遗传算法
- 模拟退火算法
- 模拟退火算法
- 模拟退火算法
- 解析模拟退火算法
- Scrapy spiders介绍
- postgresql 存储过程简单使用
- gdb多线程调试
- CString比较相等不得不说的故事
- libubox - uloop runqueue ustream
- “模拟退火算法的并行化”之“什么是模拟退火算法”
- Ubuntu 14.04 安装 Sublime Text 3
- php 存PDF文件及其在线预览功能
- Linux 引导过程内幕
- python的文件句柄一次只能用一次
- Xcode如何关闭ARC
- Android 将Activity打成jar包供第三方调用
- spring mvc + mybatis +junit + log4j 用到的jar包整理与讨论。
- 正则表达式