模拟退火算法是受物理学领域启发而提出的一种优化算法。所谓的退火是指将合金加热后再慢慢冷却的过程。大量的原子因为受到激发而向周围跳跃,然后又逐渐稳定到一个低能阶的状态,所以这些原子能够找到一个低能阶的配置(configuration)。

退火算法以一个问题的随机解开始。它用一个变量来表示温度,这一温度开始时非常高,而后逐渐变低:

def annealing(..., T=10000., cool=0.95, ...):while T>0.1:... T *= cool

退火算法的每一次迭代期间,算法会首先随机地选择某个数字,然后朝某个方向变化。算法最为关键的部分在于,如果新的变化带来的新的成本更低,则新的题解就会成为当前题解,这个爬山算法类似。不过如果成本值更高的话,则新的题解仍将可能成为当前题解(这是不同于爬山算法的地方)。这也是避免出现局部最小值的一种改进。

某些情况下,我们能够得到一个更优的解之前转向一个更差的解是很有必要的。模拟算法之所以管用,不仅在于它总是会接受一个更优的解,而且在退货的开始阶段会(以一定概率)接受表现较差的解。随着退火过程(温度减少)的不断进行,算法越来越不可能接受较差的解。知道最后节点,它将只会接受更优的解。更高成本的题解,其被接受的概率如下:

p=e−(highcost-lowcost)T

p=e^{\frac{-(\text{highcost-lowcost})}T}

TT 温度(表示接受较差解的意愿)开始非常高,指数部分接近于0,所以概率几乎为1.随着温度的递减,高成本和低成本值之间的差异越来越重要——差异越大,概率越低。因此此算法只倾向于稍差的解而不会是非常差的解。

# costf:损失函数,step=1. 每次移动的步长(random.randint(-step, step):往左走,不走,往右走)
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] += dirif 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 = s1T *= 0.95return s0

1. 降温方程

⎧⎩⎨⎪⎪⎪⎪T(t)=T01+lntT(t)=T01+t

\left\{ \begin{split} &T(t)=\frac{T_0}{1+\ln t}\\ &T(t)=\frac{T_0}{1+t} \end{split} \right.

机器学习基础(四十五)—— 模拟退火(Simulated Annealing)相关推荐

  1. 机器学习基础(十五)—— blending

    base algorithm vs meta-algorithm(建立在其他算法基础之上的算法):这是只有集成学习才有的一对概念: uniform blending: (1)blending:TT 个 ...

  2. redhat linux修复文件系统,RHEL6基础四十五RHEL文件系统修复

    fsck---file system check 说明 :检查与修复 Linux 文件系统,可以同时检查一个或多个 Linux 档案系统. 注意:fsck扫描文件系统时一定要在单用户模式.修复模式或把 ...

  3. 孤荷凌寒自学python第四十五天Python初学基础基本结束的下阶段预安装准备

    孤荷凌寒自学python第四十五天Python初学基础基本结束的下阶段预安装准备 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天本来应当继续学习Python的数据库操作,但根据过去我自学 ...

  4. Python编程基础:第四十五节 方法链Method Chaining

    第四十五节 方法链Method Chaining 前言 实践 前言 方法链是指一个对象一次调用其自身的多个方法,通常写作对象.方法1.方法2.由于这种调用方法看起来像一个链条,所以我们将其称作方法链. ...

  5. [系统安全] 四十五.APT系列(10)Metasploit后渗透技术信息收集、权限提权和功能模块详解

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  6. [Python从零到壹] 四十五.图像增强及运算篇之图像灰度非线性变换详解

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  7. 【正点原子Linux连载】第四十五章 pinctrl和gpio子系统实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  8. 计算机软件发展四十五年

    计算机软件发展四十五年 2011年05月17日 09:00博览网原文链接我要评论(0) 摘要:通过对计算机软件发展的四十多年历史的回顾,详细论述其发展的三个不同阶段:开创阶段.稳定阶段以及发展阶段的过 ...

  9. 【Visual C++】游戏开发笔记四十五 浅墨DirectX教程十三 深度测试和Z缓存专场

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8607864 作者:毛星云(浅墨 ...

  10. 45.深度解密四十五:网站盈利模式和私域流量的变现方式细致讲解

    网络营销推广技术.技巧深度解密(四十五)指南: 1.本文档适合零基础以及互联网营销推广工作者,主要讲解网站的盈利模式和私域流量变现的方式问题. 2.原创版权文档,任何抄袭或者全部.部分模仿都是侵权行为 ...

最新文章

  1. python第三方库numpy-Python第三方库之openpyxl(2)
  2. 基于 HTML5 Canvas 的交互式地铁线路图 1
  3. 前端解析返回的对象时json显示$ref问题的解决
  4. jdk8 参数为方法_JDK 8中的几乎命名的方法参数
  5. POJ-1664 放苹果 动态规划思想解组合数学
  6. android之APP模块编译
  7. oracle java vm,我可以使用Oracle Java 7 HotSpot VM安装DCEVM吗?
  8. 使用jQuery快速高效制作网页交互特效(1)
  9. linux启动exe程序命令行参数,Linux可执行文件的启动及命令行参数和环境变量的传递...
  10. 2021年中式面点师(中级)报名考试及中式面点师(中级)考试总结
  11. 检查网络端口是否正常
  12. 基于JavaWeb的餐厅点餐系统设计与实现
  13. Dynamics CRM: 表单(Form)中的显示字段变成只读的几种情况
  14. unity游戏开发知识检测
  15. 全面解析Mybatis中参数处理
  16. 国内网页设计网站网址大全[问题点数:0分,结帖人:beijin2008]
  17. 无刷直流电机的simulink仿真
  18. mysql 报错 1054 - Unknown column ‘box_inf.box_number‘ in ‘where clause‘
  19. 【最新】智慧图书馆管理软件应该全面考量各个模块的建设
  20. 星座高考成绩查询2021,2021年能金榜题名的星座,2021年学业运势旺盛的星座

热门文章

  1. Oracle账户的umask,AIX的Umask
  2. java split 坑_Java坑锦集一 - split函数
  3. pytorch: Tensor的创建与调整
  4. OpenGL+VS2012环境搭建
  5. tf.transpose()个人理解,高纬度的变换,可以将部分维度看成黑盒(整体)
  6. HDU 6370(并查集)
  7. Python中第三方库Requests库的高级用法详解
  8. php://input 如何用?
  9. 【Gerrit】Add a Member
  10. 关于OCR,做个记录。