模拟退火,Simulated Annealing,SA

模拟退火算法名字的由来是其参考了金属冶炼的退火过程

模拟退火可以解决TSP旅行商问题

引入

当我们遇到一个爬山问题的时候

首先肯定是最简单的贪心法,但是贪心会陷入局部最优解,不一定能搜索出全局最优解

如图,假设C点为当前位置,贪心搜索到A点这个局部最优解就会停止搜索,因为在A点无论向那个方向小幅度移动都不能得到更优的解。

模拟退火算法

模拟退火其实也是一种贪心算法,但是它的搜索过程引入了随机因素。

模拟退火算法以一定的概率来接受一个比当前解要差的解,因此有可能会跳出这个局部的最优解,达到全局的最优解。

以图中为例,模拟退火算法在搜索到局部最优解A后,会以一定的概率接受到E的移动。也许经过几次这样的不是局部最优的移动后会到达D点,于是就跳出了局部最大值A。

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

实战演示

假设现在我们有一个函数,形式为

其函数图像为

通过求导我们也能发现,在x=10处该函数取到最小值,有全局最优解。

接下来我们通过拟退火算法实现整个寻优过程。

①解空间

解空间就是我们所要求的定义域的空间范围,在这里我们定为[0, 100]

②目标函数

目标函数就是我们要求的函数,这里即为y=3x2-60x+9

③新解的产生

通过当前的解产生一个新解的方法有很多,在这里我们直接通过加上一个微小的偏差bias来微调这个值。

x_new = x + np.random.uniform(-1, 1)

增加一个[-1,1]之间的实数。

④代价函数差

代价函数差就是前后两次函数值的差值:E(j)-E(i)

⑤接受准则

接受准则就是算法最核心的地方:

如果E(j) <E(i),就接受新的值;否则,以一定的概率接受新的值,即概率大于0-1之间的随机数则接受。在实际使用当中,我们可以把K看作1处理,甚至温度T都可以是任意尺度的值。比如初始T=1

⑥降温

利用选定的降温系数a进行降温处理,T=a*T,从而得到一个新的温度。比如a=0.999

⑦结束条件

可以选定一个结束的温度,当温度T不断衰减到某个值时,算法结束,输出当前状态。比如std=0.0000001

import numpy as np
import matplotlib.pyplot as pltdef x_function(x):return 3*x**2 - 60*x + 9x = [i for i in np.linspace(0, 100)]
y = map(x_function, x)
plt.plot(x, list(y))
plt.show()T = 1 # 初始温度
x = np.random.uniform(0, 100)
std = 0.00000001 # 终止温度
a = 0.999 # 衰减率while T > std:y = x_function(x)# 新值通过扰动产生x_new = x + np.random.uniform(-1, 1)if 0 <= x_new <= 100:y_new = x_function(x_new)if y_new < y:x = x_newelse:p = np.exp((y - y_new) / T)r = np.random.uniform(0, 1)if p > r:x = x_new# print(x)T = T * aprint(x, x_function(x))

可见,我们通过模拟退火的算法寻找到了全局最优的最小值x=10

总结

怎么来理解这个过程?事实上就是在解空间中先随机的选择一个解x,计算它的函数值,然后以一定的方式(可以是增减一个扰动)得到一个新的解x1,比较这两个函数值,取最小值。即使后者的函数值比前者大,也可以以一定的概率保留,只是说这个概率定义成了玻尔兹曼分布中的概率形式。和其他的启发式算法(遗传算法)一样,它们都是以概率为导向的迭代算法,说白了这个世界就是这么奇妙,冥冥之中自有概率在安排。

参考:

https://finthon.com/python-simulated-annealing/

优化算法(一)—— 模拟退火算法(SA算法) 实战相关推荐

  1. MAT之SA:利用SA算法解决TSP(数据是14个虚拟城市的横纵坐标)问题

    MAT之SA:利用SA算法解决TSP(数据是14个虚拟城市的横纵坐标)问题 目录 输出结果 实现代码 输出结果 实现代码 %SA:利用SA算法解决TSP(数据是14个虚拟城市的横纵坐标)问题--Jas ...

  2. java寻优算法_模拟退火算法SA原理及python、java、php、c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径...

    模拟退火算法SA原理及python.java.php.c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径 模拟退火算法(Simulated Annealing,SA)最早的思 ...

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

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

  4. 优化算法系列-模拟退火算法(1)——基本原理枯燥版本

    优化算法系列之模拟退火算法(1)--基本原理枯燥版本 推荐书籍--><智能优化算法及其MATLAB实例(第二版)> 知乎上的形象描述: 一个锅底凹凸不平有很多坑的大锅,晃动这个锅使得 ...

  5. [算法学习]模拟退火算法(SA)、遗传算法(GA)、布谷鸟算法(CS)、人工蜂群算法(ABC)学习笔记---附MATLAB注释代码

    目录 1.模拟退火算法(Simulated Annealing,SA) 1.1 本质: 1.2 算法思想 1.3 SA流程图 1.4 模拟退火过程 1.5 SA解决TSP问题 1.6 SA改进方向 1 ...

  6. 数学建模——模拟退火算法(Simulated Annealing,SA)

    模拟退火算法 一.模拟退火算法概述 二.算法步骤 三.算法特点 四.模拟退火算法理解(图解) 五.Metropolis准则 六.模拟退火算法的应用 七.模拟退火算法Matlab代码 工具箱求解非线性函 ...

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

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

  8. 【opencv450-samples】旅行商问题(模拟退火算法Simulated Annealing,SA)

    运行结果 视频演示 源码: #include <opencv2/core.hpp> #include <opencv2/imgproc.hpp> #include <op ...

  9. 经典算法:模拟退火(SA)算法

    一.概念 模拟退火算法(SA) 来源于固体退火原理,是一种基于概率的算法. 模拟退火算法从某一较高初温出发,伴随温度参数的不断下降,结合概率突跳特性在解空间中随机寻找目标函数的全局最优解,即在局部最优 ...

  10. 智能优化算法(Ga,PSO,SA)高度模块化(可直接调用)python实现

    智能优化算法(Ga,PSO,SA)高度模块化(可直接调用)python实现 为啥做这篇文章 此篇文章基于本人数学建模实验课程的智能算法研究,老师要求用matlab实现一种优化算法分析,并且实现函数封装 ...

最新文章

  1. 阿里员工在用的黑科技 今年云栖要公开了!
  2. Linux中和文件相关的操作
  3. c++ 交换变量实践
  4. 基于android的lbs技术,基于Android的LBS应用研究
  5. 如何实现office不同语言界面切换
  6. listview 刷新结束 监听_Flutter 开发从 0 到 1(四)ListView 下拉加载和加载更多
  7. dbtool一bug跟踪记
  8. c语言 大数开方,c语言求一个数的平方根
  9. Aliplayer简单使用
  10. python爬取新浪博客_python爬虫-韩寒新浪博客博文
  11. SYNCookie原理
  12. 基层教学组织评估系统6_项目完结心得收获、思考人生篇
  13. 【测绘程序设计】坐标方位角推算神器(C#版)
  14. 电信4g网络问题及恢复方案
  15. RuoYi-Vue项目登录过期的实现
  16. 福岛第1核电站2号3号反应堆辐射量急剧上升
  17. 电大计算机试题及答案形成性,国开电大机械CAD/CAM形成性作业1答案
  18. c语言编写可乐瓶游戏,可乐瓶游戏二十则
  19. win七系统如何卸载MySQL_Win7完全卸载sql2005和删除sql2005的方法
  20. 物流节点的定义,要有物流相关术语

热门文章

  1. secure CRT 信号灯超时时间已到
  2. Java架构师发展之路
  3. Octotree插件安装
  4. 谷歌浏览器如何安装插件-以octotree为例
  5. 转载:编译原理三大圣书——龙书、虎书、鲸书
  6. stm32采集交流电压信号_基于STM32的多路电压采集的设计与实现
  7. 建筑工程计算机的应用,计算机对建筑工程的应用
  8. I2S协议及在verilog中实现
  9. JLink下载Hex文件
  10. ROS安装教程|从零开始