前言

*模拟退火算法是机器学习算法中的一种简单的算法。

在进行随机梯度下降时,采用模拟退火更新学习率是选择之一。


目录

  • 前言
  • 概述
  • 爬山算法(Hill Climbing)的缺陷
  • Metropolis算法
  • 模拟退火算法
  • 应用

概述

模拟退火算法来源于固体退火原理,是一种基于概率的算法,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小。(来源:百度百科)

模拟退火基于贪心算法。与同样基于贪心算法的爬山算法(Hill Climbing)不同的是,模拟退火算法在一些情况下可能克服陷入局部最优解而非找到全局最优解的情况

爬山算法(Hill Climbing)的缺陷

以寻找最大值为例。上图中曲线最大值处于B点。如果采用爬山算法,会陷入这样一种困境:如果从上图曲线最左端点开始寻找,最后会找到A点,因为A点任意方向的临近值都小于它。同样的,如果从上图曲线最右端点开始寻找,最后会找到C点,因为C点任意方向的临近值都小于它。但是A、C点都只是局部最优,而非全局最优。

Metropolis算法

上面这种缺陷是由贪心算法导致的。
对此,N.Metropolis等人提出一种方法:
借助以上所说的基于概率的思想,我们可以在爬山时(例如此时处于下图P点)以一定的概率选择比当前所处位置低的点,从而让程序获得摆脱这种陷阱的概率到达B点。

模拟退火算法

再来巩固一遍:
模拟退火算法基于这样一种物理原理:一个高温物体降至常温,温度越高时降温的概率越大(降温越快),温度越低时降温的概率越小(降温越慢)。
模拟退火算法基于此种思想搜索,即多次降温(迭代),直到获得一个可行解。
在迭代过程中,模拟退火算法随机选择下一个状态,存在两种可能:
1.新状态更优,则接受新状态;
2.新状态更差,则以一定概率接收该状态,不过这个概率随时间推移逐渐降低。
主要步骤如下:


1.设置参数:温度 TTT、降温系数 dTdTdT、评价函数 F(x)F(x)F(x)。
2.迭代退火,直到温度降到所设温度(一般为0度)。


代码框架如下:

double T = 10000;  // 起始温度
double dT = 0.98;  // 降温系数,一般取 0.95 ~ 0.99 之间的数
const double eps = 1e-10;  // 用来判断零,控制精度double func(double x){  //评价函数return (...);
}double SA(){  // 模拟退火过程double x = rand();  // 随机选择一个 x,根据情况需要控制范围double n = func(x);  // x 处的值double ans = n;while(T > eps){double newx = x + (2 * rand() - RAND_MAX) * T;  // [-RAND_MAX, RAND_MAX] 之间的随机数 * T 作为跳跃幅度while(newx < 0 && newx > 100) newx = x + (2 * rand() - RAND_MAX) * T;  // 确定新的 x 的范围,比如这里我要保证 x 介于 0 ~ 100 之间double next = func(newx);  // 新的 x 值对应的 y 值ans = max(n, next);  // 视情况而定何种比较,此处选取最大值if(next - n > eps){  // 新状态更优,则接受新状态x = newx;n = next;}else if(exp((next - n) / T) * RAND_MAX > rand()){  // 新状态更差,则以一定概率接收该状态,不过这个概率随时间推移逐渐降低x = newx;n = next;}T *= dT;  // 降温}return ans;
}

值得注意的是,以上代码中

exp((next - n) / T) * RAND_MAX > rand()

是根据科学家们推断出来的判断概率的方法(简化后),即
w=edeltaKTw=e^{\frac{delta}{KT}}w=eKTdelta​
其中 deltadeltadelta 即为 next−nnext-nnext−n,需是负数( www 之所以乘以 RAND_MAXRAND_\_MAXRAND_​MAX 是为了让其落在区间 [0, RAND_MAX] 中以便能够与rand()比较。因为C++中rand()产生一个介于区间 [0, RAND_MAX] 中的随机整数,此时 www 属于(0, 1)区间内)。KKK 在这里取1即可。

应用

模拟退火算法的典型应用就是求最值。
如给定常数 ccc,求
F(x)=ln(x)x+cF(x)=\frac{ln(x)}{x}+cF(x)=xln(x)​+c
在[0, 100]上的最大值。
代码如下:

#include <bits/stdc++.h>using namespace std;double T = 100;
double dT = 0.98;
const double eps = 1e-10;double y;double func(double x)
{return (1.0 * log(x) / x) + y;
}double SA()
{double x = rand() % 100;double n = func(x);double ans = n;while(T > eps){double newx = x + (2 * rand() - RAND_MAX) * T;//while(newx < 0 && newx > 100) newx = x + (2 * rand() - RAND_MAX) * T;if(newx >= 0 && newx <= 100){double next = func(newx);ans = max(n, next);if(next - n > eps){x = newx;n = next;}else if(exp((next - n) / T) * RAND_MAX > rand()){x = newx;n = next;}}T *= dT;}return ans;
}int main()
{while(scanf("%lf", &y) != EOF){printf("%.4f\n", SA());}return 0;
}

结果:

66
66.3679
^ZProcess returned 0 (0x0)   execution time : 3.703 s
Press any key to continue.

验证:

结果 1e+66\frac{1}{e}+66e1​+66 约等于66.3679。

【机器学习算法】模拟退火(Simulated Annealing)相关推荐

  1. 机器学习中的数学——模拟退火算法(Simulated Annealing,SA)

    分类目录:<机器学习中的数学>总目录 相关文章: · 梯度下降法(Gradient Descent) · 随机梯度下降(Stochastic Gradient Descent, SGD) ...

  2. 模拟退火算法(Simulated Annealing,SA)的全面讲解及python实现

    https://blog.csdn.net/Trisyp/article/details/104953406 抽象来源:美国物理学家Metropolis等人在1953年发表研究复杂系统,计算其中能量分 ...

  3. 深入理解模拟退火算法(Simulated Annealing)

    本文将对模拟退火算法(Simulated Annealing)进行介绍,深入理解这个算法. 模拟退火算法和上一篇文章随机模拟算法中的Metropolis算法有着紧密的联系,在这里将详细探讨这种关系. ...

  4. 用模拟退火算法(simulated annealing / SA)求函数最小值

    #用模拟退火算法(simulated annealing / SA)求函数最小值 已知函数 f(x) = (x-1)^2 + 3,是求其在[ -2,2 ]的最小值时刻的解 下面为运用模拟退火算法求解上 ...

  5. 模拟退火算法(Simulated Annealing)详解

    问题提出 旅行商问题(Travelling Salesman Problem, 简记TSP,亦称货郎担问题):设有n个城市和距离矩阵D=[dij],其中dij表示城市i到城市j的距离(i,j=1,2 ...

  6. python模拟退火(Simulated Annealing)参数寻优实战

    python模拟退火(Simulated Annealing)参数寻优实战 目录 python模拟退火(Simulated Annealing)参数寻优实战 模拟退火 模拟退火算法流程

  7. 【运筹优化】元启发式算法详解:模拟退火算法(Simulated Annealing,SA)+ 案例讲解代码实战

    文章目录 一.介绍 二.基础知识 2.1 局部搜索(或蒙特卡罗)算法 2.2 Metropolis 算法 2.3 模拟退火算法 三.原理 3.1 Statistical Equilibrium 统计平 ...

  8. 模拟退火算法(Simulated Annealing,SA)

    这是一篇关于模拟退火算法的总结博客,包括算法思想,算法步骤,Python实现,MATLAB实现,算法进阶等. 目录 1 算法思想 2 算法步骤 3 SA解函数最小值(python实现) 4 SA解旅行 ...

  9. 模拟退火(Simulated Annealing, SA)算法简介与MATLAB实现

    目录 模拟退火算法概述 算法步骤 算法特点 模拟退火算法MATLAB实现 [例1]一元/多元函数优化 [例2]TSP问题 模拟退火算法概述 模拟退火算法(Simulated Annealing,简称S ...

  10. 优化算法----模拟退火算法(Simulated Annealing,SA)

    简介 \quad\quad 模拟退火算法是80年代初发展起来的一种基于Monte Carlo迭代求解策略的随机性寻优算法.其思想最早由Metropolis等人于1953年提出,由Krikpatrick ...

最新文章

  1. 解决git提交敏感信息(回退git版本库到某一个commit)
  2. wiki多个文件一起导入_wiki.js 使用 postgres 支持中文全文检索
  3. 长春金桥计算机学校,金桥学校2017年招生简章
  4. 34 SD配置-销售凭证设置-定义销售凭证类型
  5. 使用Lua 局部变量来优化性能,同一时候比較局部变量和全局变量
  6. 使用命令行打包发布cocostudio资源
  7. 全面:Realtek/瑞昱无线产品图谱及市场构成
  8. 初学者福利:分享五个免费的 Python 学习网站,抓紧收藏吧
  9. Sublime安装中文插件
  10. 一些个人感觉很不错的特效
  11. 【学习笔记】软件测试-版本迭代总结
  12. uva 10859 放置街灯--Placing Lampposts
  13. SSL P2719 买礼物的艰辛
  14. 微信“小程序”来了,短期不可高估,长期不可低估
  15. c 是泛型程序设计语言,在C语言中实现泛型编程
  16. SecureCRT$SecureFX的安装方法
  17. 前端实现lottie动画
  18. 免费开源的编辑器 - SciTE
  19. 对图像压缩自编码器的理解
  20. python语言程序设计 嵩天老师(第七周)

热门文章

  1. Java调用SMSLib发送短信详解
  2. idea插件---RestfulToolkit(接口自测工具)
  3. 几何学小课堂:非欧几何(广义相对论采用黎曼几何作为数学工具)【学数学关键是要学会在什么情况下,知道使用什么工具。】
  4. Web基础配置篇(二): Maven配置及使用
  5. udf iso9660 java_ISO和UDF光盘格式、扩展ISO9660
  6. python开发的需求分析_python 需求分析
  7. lorenz画图matlab,Matlab画Lorenz系统的最大李雅普诺夫指数图
  8. 2分钟教你学会一键JS解密
  9. python 判断excel文件是否被加密
  10. 【python学习】-使用sklearn对数据进行线性回归,并绘制回归线