优化算法(一)—— 模拟退火算法(SA算法) 实战
模拟退火,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算法) 实战相关推荐
- MAT之SA:利用SA算法解决TSP(数据是14个虚拟城市的横纵坐标)问题
MAT之SA:利用SA算法解决TSP(数据是14个虚拟城市的横纵坐标)问题 目录 输出结果 实现代码 输出结果 实现代码 %SA:利用SA算法解决TSP(数据是14个虚拟城市的横纵坐标)问题--Jas ...
- java寻优算法_模拟退火算法SA原理及python、java、php、c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径...
模拟退火算法SA原理及python.java.php.c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径 模拟退火算法(Simulated Annealing,SA)最早的思 ...
- 优化算法----模拟退火算法(Simulated Annealing,SA)
简介 \quad\quad 模拟退火算法是80年代初发展起来的一种基于Monte Carlo迭代求解策略的随机性寻优算法.其思想最早由Metropolis等人于1953年提出,由Krikpatrick ...
- 优化算法系列-模拟退火算法(1)——基本原理枯燥版本
优化算法系列之模拟退火算法(1)--基本原理枯燥版本 推荐书籍--><智能优化算法及其MATLAB实例(第二版)> 知乎上的形象描述: 一个锅底凹凸不平有很多坑的大锅,晃动这个锅使得 ...
- [算法学习]模拟退火算法(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 ...
- 数学建模——模拟退火算法(Simulated Annealing,SA)
模拟退火算法 一.模拟退火算法概述 二.算法步骤 三.算法特点 四.模拟退火算法理解(图解) 五.Metropolis准则 六.模拟退火算法的应用 七.模拟退火算法Matlab代码 工具箱求解非线性函 ...
- 模拟退火(Simulated Annealing, SA)算法简介与MATLAB实现
目录 模拟退火算法概述 算法步骤 算法特点 模拟退火算法MATLAB实现 [例1]一元/多元函数优化 [例2]TSP问题 模拟退火算法概述 模拟退火算法(Simulated Annealing,简称S ...
- 【opencv450-samples】旅行商问题(模拟退火算法Simulated Annealing,SA)
运行结果 视频演示 源码: #include <opencv2/core.hpp> #include <opencv2/imgproc.hpp> #include <op ...
- 经典算法:模拟退火(SA)算法
一.概念 模拟退火算法(SA) 来源于固体退火原理,是一种基于概率的算法. 模拟退火算法从某一较高初温出发,伴随温度参数的不断下降,结合概率突跳特性在解空间中随机寻找目标函数的全局最优解,即在局部最优 ...
- 智能优化算法(Ga,PSO,SA)高度模块化(可直接调用)python实现
智能优化算法(Ga,PSO,SA)高度模块化(可直接调用)python实现 为啥做这篇文章 此篇文章基于本人数学建模实验课程的智能算法研究,老师要求用matlab实现一种优化算法分析,并且实现函数封装 ...
最新文章
- 阿里员工在用的黑科技 今年云栖要公开了!
- Linux中和文件相关的操作
- c++ 交换变量实践
- 基于android的lbs技术,基于Android的LBS应用研究
- 如何实现office不同语言界面切换
- listview 刷新结束 监听_Flutter 开发从 0 到 1(四)ListView 下拉加载和加载更多
- dbtool一bug跟踪记
- c语言 大数开方,c语言求一个数的平方根
- Aliplayer简单使用
- python爬取新浪博客_python爬虫-韩寒新浪博客博文
- SYNCookie原理
- 基层教学组织评估系统6_项目完结心得收获、思考人生篇
- 【测绘程序设计】坐标方位角推算神器(C#版)
- 电信4g网络问题及恢复方案
- RuoYi-Vue项目登录过期的实现
- 福岛第1核电站2号3号反应堆辐射量急剧上升
- 电大计算机试题及答案形成性,国开电大机械CAD/CAM形成性作业1答案
- c语言编写可乐瓶游戏,可乐瓶游戏二十则
- win七系统如何卸载MySQL_Win7完全卸载sql2005和删除sql2005的方法
- 物流节点的定义,要有物流相关术语