机器学习基础—— 模拟退火(Simulated Annealing)
2017-02-08 12:20
549 查看
http://blog.csdn.net/lanchunhui/article/details/51112227
机器学习基础(四十五)—— 模拟退火(Simulated Annealing)
2016-04-10 12:36 207人阅读 评论(0) 收藏 举报分类:
机器学习(123)
版权声明:本文为博主原创文章,未经博主允许不得转载。
模拟退火算法是受物理学领域启发而提出的一种优化算法。所谓的退火是指将合金加热后再慢慢冷却的过程。大量的原子因为受到激发而向周围跳跃,然后又逐渐稳定到一个低能阶的状态,所以这些原子能够找到一个低能阶的配置(configuration)。
退火算法以一个问题的随机解开始。它用一个变量来表示温度,这一温度开始时非常高,而后逐渐变低:
def annealing(..., T=10000., cool=0.95, ...): while T>0.1: ... T *= cool1
2
3
4
5
6
1
2
3
4
5
6
退火算法的每一次迭代期间,算法会首先随机地选择某个数字,然后朝某个方向变化。算法最为关键的部分在于,如果新的变化带来的新的成本更低,则新的题解就会成为当前题解,这个爬山算法类似。不过如果成本值更高的话,则新的题解仍将可能成为当前题解(这是不同于爬山算法的地方)。这也是避免出现局部最小值的一种改进。
某些情况下,我们能够得到一个更优的解之前转向一个更差的解是很有必要的。模拟算法之所以管用,不仅在于它总是会接受一个更优的解,而且在退货的开始阶段会(以一定概率)接受表现较差的解。随着退火过程(温度减少)的不断进行,算法越来越不可能接受较差的解。知道最后节点,它将只会接受更优的解。更高成本的题解,其被接受的概率如下:
p=e−(highcost-lowcost)T
T 温度(表示接受较差解的意愿)开始非常高,指数部分接近于0,所以概率几乎为1.随着温度的递减,高成本和低成本值之间的差异越来越重要——差异越大,概率越低。因此此算法只倾向于稍差的解而不会是非常差的解。
def annealing(domains, costf, T=10000., cool=0.95, step=1): s0 = [random.randint(domains[i][0], domains[i][1]) for i in range(len(domains))] while T>0.1: i = random.randint(0, len(domains)-1) dir = random.randint(-step, step) s1 = s0[:] s1[i] += dir if s1[i] < domains[i][0]: s1[i] = domains[i][0] if s1[i] > domains[i][1]: s1[i] = domains[i][1] c1, c0 = costf(s1), costf(s0) if (c1 < c0 or random.random() < pow(math.e, -(c1-c0)/T)) s0 = s1 T *= 0.95 return s0
相关文章推荐
- LinuxMint 安装后的设置
- Json解析工具Jackson(简单应用)
- linux内核版本对比————CentOS、RedHat
- P1996 约瑟夫问题
- Servlet 3.0 新特性概述
- hdoj 1040
- 真是烦死了,破罗辑思维的物流
- 1095. Cars on Campus (30)
- 1035. 插入与归并(25)
- mysql group 字段值对比
- Madifest文件详解
- 1034. 有理数四则运算(20)
- 百练2787
- Spark shuffle-write原理分析
- Skinned Mesh原理解析和一个最简单的实现示例
- enum , typedef 关键词分析
- codeforce 749 D. Leaving Auction 拍卖 (set+二分) 思维题!!!
- MyEclipse中项目运行,提示Java内存溢出
- HandlerThread与ThreadLocal
- 梦想太远,现实太近