数学建模必备算法之模拟退火算法
发布日期:2021-05-04 01:05:13 浏览次数:50 分类:技术文章

本文共 1892 字,大约阅读时间需要 6 分钟。

在2020年的全国大学生数学建模竞赛的A题中,第三问要确定面积最小的最优炉温曲线,这是一个有个优化变量的优化问题,由于优化变量太多,导致假若直接用搜索法求解的话,计算量会非常大。 

一共5个优化变量,每个变量都进行20次搜索(搜索精度已经很小了)的话,就是要计算205次,假如计算一次需要0.05秒,也就是需要计算44小时以上。倘若再提高搜索的精度,则估计需要计算数天。

解决这个问题的其中一类方法就是用智能算法,包括模拟退火、遗传算法、蚁群算法、粒子群算法等等。

下面就来介绍一下比较适合于解这道题的模拟退火算法

模拟退火算法

模拟退火算法是属于贪心策略的算法,所谓贪心策略,就是总是做出在当前看来是最好的选择。而不是从整体最优上考虑,它得到的是某种意义下的局部最优解。因此,这种算法不是对所有的问题都能得到整体最优解,关键是选择什么样的贪心策略。

最基本的基于贪心策略的算法可以叫做爬上法,此算法是从当前解的附近解空间中去选择一个最优解作为当前解,一直这样重复,直到在附近的解空间中找不到更优解为止。因此这个算法很大的可能性找到的只能是局部最优解。

如下图所示:假设当前解是在C点,爬山算法搜索到A点这个局部最优解后就会停止搜索,因为在A点时,无论向哪个方向去小幅度移动都不能得到更优的解。

图片

而我们的模拟退火算法实际上也是基于贪心策略的,只不过它在爬山法这种纯粹的贪心策略的基础上,又在搜索过程中加上了随机因素。这个随机因素的具体表示就是:该算法会以一定的概率来接受一个比当前解要差的解。于是也就有了跳出爬山法的局部最优解的可能。

图片

还是以上面爬山法的图为例,模拟退火算法在到达局部最优解A后,会以一定的概率向E去移动。到达E点后,就会有可能到达D点,从而依据爬上法的思想,就会到达真正的全局最优解B点了。

模拟退火算法描述如下:

若K(Y(i+1))>=K(Y(i))(即移动后的第i+1处得到了更优解),则总是接受该移动。

若K(Y(i+1))<K(Y(i))(即移动后i+1处的解比当前解要差),则以一定的概率接受移动,且这个概率是随着时间推移逐渐降低(逐渐降低才能趋向稳定)。

那么怎么定义这个“一定的概率”呢?

实际上是参考了金属冶炼的退火过程,故而此算法被叫做模拟退火算法。

根据热力学的原理,在温度为T时,出现能量差为dE的降温的概率为P(dE),表示为:

P(dE)=exp(dE/(kT))

其中k是一个常数,exp表示自然指数,且dE<0。

此公式含义是:温度越高,出现一次能量差为dE的降温的概率就越大;温度越低,则出现降温的概率就越小。又由于dE总是小于0(因此叫退火),因此dE/kT<0,所以P(dE)的函数取值范围是(0,1)。

随着温度T的降低,P(dE)会逐渐降低。

我们将一次向较差解的移动看做一次温度跳变过程,我们以概率P(dE)来接受这样的移动。

因此可以将模拟退火算法与爬山算法对比成:

爬山算法:一只兔子朝着比当下所处的位置更高的地方跳。它逐步地跳到了不远处的最高山峰。但是这座山峰不一定就是整个解空间所在区域的最高山峰,它只是这只兔子目光所及的这一块区域的最高山峰。

模拟退火:一只兔子喝醉了。它随机地向各个方向跳了很长时间。这期间,它可能跳向比当下更高的地方,也有可能跳入比当下更低的地方。但是,等它逐渐地清醒了,会朝着最高的方向跳去。这种跳法更有可能会跳向最高的山峰。

此算法用流程图可以表示为:

图片

伪代码表示:

s:=s0;e:=E(s)        //设定目前状态为s0,其能量E(s0)

k:=0                 //评估次数k

while k<kmax and e>emax

//若还有时间(评估次数k还不到kmax)且结果还不够好(能量e不够低)则:

sn:=neighbour(s)     //随机选取一临近状态sn

en:=Esn)             //sn的能量为E(sn)

if random()<P(e,en,temp(k/kmax)) 

then                 //决定是否移至临近状态sn

s:=sn; e:=en        //移至临近状态sn

k:=k+1               //评估完成,次数k加一

returns              //回转状态s

模拟退火算法的应用非常广泛,在经典的0-1背包问题上、图着色问题上、物流配送里的调度问题等各类的调度问题上等等,都能够使用。

在跨领域上,大规模集成电路设计(VLSI)问题里的布线布板等优化问题都会用到此算法。以及在最近几年非常火的神经网络上,如何避免梯度下降算法过程中陷入局部最优解很多时候都是可以用到模拟退火算法。还有图像处理以及各种组合优化问题都会用到。

转载地址:https://blog.csdn.net/weixin_44949135/article/details/116310077 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:学生通讯录管理系统【用 结构数组 实现 通讯录管理】【C语言】
下一篇:操作系统【作业调度算法 调度图 例题(SPF、HPF、HRRN)】

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月14日 20时30分30秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

【Java锁体系】CopyOnWriteArrayList是什么?线程安全的arraylist是哪个? 2019-04-26
【面试题目】Java设计模式你有哪些了解?说几个常用的。 2019-04-26
【计算机操作系统】常说的死锁是什么?死锁产生的必要条件是什么?死锁的解决策略是什么? 2019-04-26
【计算机操作系统】进程管理详解?进程与线程区别是什么?进程调度的算法有哪些?进程通信有哪些? 2019-04-26
【计算机操作系统】虚拟内存是什么?分页系统地址映射?页面置换算法有哪些?分段地址映射又是什么? 2019-04-26
【计算机操作系统】设备管理?磁盘结构是怎么样的?磁盘调度算法有哪些? 2019-04-26
【多线程高并发】为什么要使用多线程?创建多少个线程合适呢? 2019-04-26
【多线程与高并发】 Java两个线程轮流打印1-100两个数?多线程轮流打印数字? 2019-04-26
【多线程与高并发】 Java两个线程轮流打印字符串? 2019-04-26
【Linux命令篇】Linux命令实践 2019-04-26
【Leetcode单调队列】Leetcode239 滑动窗口最大值 2019-04-26
【Leetcode-单调栈】单调栈相关的题目-下一个更大的元素I 每日温度 2019-04-26
【Leetcode单调队列】- 洛谷P1714切蛋糕 2019-04-26
【Leetcode优先级队列】- 数据流的中位数 2019-04-26
【Leetcode优先级队列】-合并K个升序链表 2019-04-26
【多线程与高并发】-Java如何实现一个阻塞队列呢? 2019-04-26
【多线程高并发】-Java使用阻塞队列ArrayBlockingQueue实现生产者消费者模式? 2019-04-26
【多线程高并发】-多线程实现数组的读与写 2019-04-26
【Java设计者模式】-Java实现订阅-发布者模式 2019-04-26
【计算机操作系统】-什么是系统调用呢?什么是用户态?什么是内核态? 2019-04-26