模拟退火算法_手把手教你模拟退火算法

模拟退⽕算法_⼿把⼿教你模拟退⽕算法
当下时代,计算机⽆处不在,我们的⽣活早已与电脑⼿机等电⼦设备融为⼀体。“算法”,我相信这个词你已经听过了⽆数遍,但你可能并不了解他的真实⾯⽬。今天,我将要开启⼀个全新的栏⽬,讲述数学模型与算法。
初识算法
算法到底是是么?我相信这个问题困扰了不少⼈。
概括的说,算法就是解决问题的⽅法,有着具体的过程与步骤,并且这些步骤的次数是有限的,不会⽆限重复下去。算法具有“死板”的特性,这与计算机程序相类似,所以算法能够与计算机适配的相当好。
每⼀种算法,其所能解决的问题不不尽相同的。例如快速排序算法针对于排序问题,K均值算法能够将已有数据根据特征分类,今天将要谈到的模拟退⽕算法,则是⽤于求解问题的最优解。
算法解释
模拟退⽕算法 (Simulated Annealing,SA) 最早的思想是由 N. Metropolis 等⼈于1953年提出。1983年, S. Kirkpatrick 等成功地将退⽕思想引⼊到组合优化领域。它是基于 Monte-Carlo 迭代求解策略的⼀种随
机寻优算法,其出发点是基于物理中固体物质的退⽕过程与⼀般组合优化问题之间的相似性。模拟退⽕算法从某⼀较⾼初温出发,伴随温度参数的不断下降,结合概率突跳特性在解空间中随机寻⽬标函数的全局最优解,即在局部最优解能概率性地跳出并最终趋于全局最优。
这么说起来可能略显混乱,那就让我们回到其出发点:固体退⽕上来理解。
处在低温状态时,固体中分⼦具有的内能很低,在原本的位置上做⼩范围的振动。若是将固体加热到⼀定温度,分⼦内能将会增加,热运动加剧,分⼦排列的⽆序度增加。此时再将温度缓缓降低,在每个温度都达到平衡态(即准静态过程),分⼦具有的能量逐渐降低,最终回归到有序排列的状态,分⼦内能也跟着降到最低。
若是将其抽象成具体问题上来说,可以将固体温度视为算法进⾏的次数,分⼦内能看做问题的解。对于⼀个函数最⼩值问题来说,可以先在定义域内随机选取⼀个点作为初始值x0,可以计算出第⼀个解
y0并将其视为最⼩值。随后对初始值进⾏扰动(可以是x1=x0+dx)此时的将会对应⼀个函数值y1,将y1与y0进⾏⽐较,若是⼩于,则将其视为新的最⼩值,反之维持原状。如此循环往复多次,即可寻出函数的最⼩值。
但上述⽅法有⼀个致命的缺点:容易陷⼊局部最优解(或者说极值) 。
对于⼀个具体的函数
函数图像
若是选取x=0为初始值(红点),按照上述步骤,最终迭代结果将会是在x=-0.9处取得最⼩值(蓝点)。但很显然,最⼩值是在x=-4处(⿊点)取得的。
这问题看似挺⽆解,但是这正是模拟退⽕最奇妙的地⽅。
再次回到固体降温。热⼒学中Boltzman 概率分布告诉我们:同⼀个温度,分⼦停留在能量⼩状态的概率⼤于停留在能量⼤状态的概率。温度越⾼,不同能量状态对应的概率相差越⼩,温度⾜够⾼时,各状态对应概率基本相同。随着温度的下降,能量最低状态对应概率越来越⼤,温度趋于0时,其状态趋于1。讲⼈话就是当处在某⼀温度时,⼤多数分⼦具有的能量较低且处于稳定状态。但是,还有少数分⼦“特⽴独⾏”,具有较⼤的内能,热运动较与其他分⼦更为剧烈。当温度逐渐降低,处于低内能状态的分⼦越来越多,最终绝⼤多数的分⼦内能降到最低并稳定下来。
大学生活导论
模拟退⽕算法利⽤了Boltzman 概率分布,当遇到不好的结果时,算法不会⽴刻否决掉,⽽是会以⼀定概率接受这个解(状态转移)。这⼀过程被称为Metropolis准则:
在循环初期,转移概率较⼤,会接受⼤部分的差解,给与更多的机会探索以跳出局部最优。随着循环次数增加,转移概率渐渐降低,差解越来越难被接受。最终,循环(降温)结束,解趋于稳定(内能降到最低)。
算法步骤
讲了这么多,我们该讲⼀下模拟退⽕具体该怎么施⾏了。以下是算法具体步骤:
1、设定初始温度,在解空间中随机选取⼀个作为初始解,并将其视为当前最优解
2、对初始解进⾏扰动,得到⼀个新的解
将新解与旧解进⾏⽐较,并依据Metropolis准则判断是否接受新解作为当前最优解
4、重复步骤2与步骤3,直⾄降温结束
5、输出结果
若是⽂字看不太明⽩,可以看看流程图:
其中有⼏个需要注意的点:
1、初始点的选取对算法结果有⼀定的影响,最好是多次运⾏对结果进⾏综合判断。
2、在算法运⾏初期,温度下降快,避免接受过多的差结果。当运⾏时间增加,温度下降减缓,以便于更快稳定结果。
3、当迭代次数增加到⼀定次数时,结果可能已经达到稳定,但是距离算法结束还有⼀段时间。在设计程序时应该加⼊适当的输出条件,满⾜输出条件即可结束程序。
实际应⽤
问题提出
资产变现有⼀个且窃贼在偷窃⼀家商店时发现有10件商品,且每⼀件的商品的价格和重量均是已知的。⼩偷希望带⾛的东西总价值越⾼越好,但他能带⾛的商品重量受到背包的限制,最多只能装下50磅东西。若是想要收益最⼤化,该带⾛哪些商品呢?
附:安娜卡列尼娜论文
增殖税
商品的价格:34 32 56 67 54 32 45 56 46 70
商品的重量:8 12 24 16 6 9 35 21 18 19
问题分析
设共有N件商品,第i件商品价格为vi,重量为wi,所处状态为xi,其中x的值为0和1,1为被带⾛,0为未带⾛。
这个问题具体的数学模型为fda
其中,价格、重量均是已知的,未知的则是物品是否被带⾛。对于这种情况,只需要⽤退⽕算法对x进⾏多次取值即可。
解决⽅案
编程语⾔我选择的是MATLAB,代码如下:
%% 开始clcclearclose all%% 参数准备a=0.95;                                %温度衰减速度times=1000;                            %循环次数k=[34 32 56 67 54 32 45 56 46 70];    % function [sol_new] = chage(sol_new,num,d,restriction)%对x进⾏随机扰动并使其满⾜约束条件  %产⽣随机扰动        temp1=ceil(rand*num);        sol_new(1,temp1)= function [p] = Metropolis(E_new,E_current,t0)%Metropolis准则f=exp( ( E_new-E_current )./t0 );a=rand;if a>=f    p=1;else    p=0;end
初次尝试,若有不⾜,望能指正公正该如何是好
愣着⼲嘛,快点关注( ̄▽ ̄)~*

本文发布于:2024-09-22 01:47:36,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/592256.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:算法   温度   问题   概率   状态   重量   结果
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议