智能启发算法-模拟退火算法

1. 模拟退火算法认识

        爬山算法也是一个用来求解最优化问题的算法,每次都向着当前上升最快的方向往上爬,但是初始化不同可能会得到不同的局部最优值,模拟退火算法就可能跳出这种局部最优解的限制。模拟退火算法是模拟热力学系统中的退火过程。在退火过程中是将目标函数作为能量函数。大致过程如下

        初始高温 => 温度缓慢下降=> 终止在低温 (这时能量函数达到最小,目标函数最小)

        在热力学中的退火过程大致是变温物体缓慢降温而达到分子之间能量最低的状态。设热力学系统S中有有限个且离散的n个状态,状态的能量为,在温度下,经过一段时间达到热平衡,这时处于状态的概率为

        模拟退火算法也是贪心算法,但是在其过程中引入了随机因素,以一定的概率接受一个比当前解要差的解,并且这个概率随着时间的推移而逐渐降低。

2. 模拟退火算法描述

        若,即移动后得到更优的解,那么总是接受改移动。

        若,即移动后得到更差的解,则以一定的概率接受该移动,并且这个概率随时间推移逐渐降低。这个概率表示为

        由于是退火过程,所以dE < 0,这个公式说明了温度越高出现一次能量差为dE的降温概率就越大,温度越低,出现降温的概率就越小,由于dE总是小于0,所以P(dE)取值在01之间。伪码如下

3. 工程应用

        工程应用的一个例子:我们把物资编号成图1种那样,求物资卸载的时间,就可以用模拟退火算法,具体可以见程序的。

#模拟退火算法
def Anneal():
    AnnealPe = []  # 生成一个个体
    AnnealPeTemp = []
    for i in range(rNum):
        AnnealPe.append(i)
        AnnealPeTemp.append(i)
    random.shuffle(AnnealPeTemp)# 生成一个随机的个体
    T = 1000
    TMin = 0.1
    while T > TMin:
        dE = decodPe(AnnealPe) - decodPe(AnnealPeTemp)
        if(dE >= 0):
            for i in range(rNum):
                AnnealPe[i] = AnnealPeTemp[i]
        else:
            a = math.e**(dE/T)
            if(math.e**(dE/T)) > random.random():
                for i in range(rNum):
                    AnnealPe[i] = AnnealPeTemp[i]
        T = 0.9999 * T
        selectNum0 = 0
        selectNum1 = 0
        selectNum0 = random.randint(0, rNum - 1)
        selectNum1 = random.randint(0, rNum - 1)
        # 交换两个变异的
        amongNum = AnnealPeTemp[selectNum0]
        AnnealPeTemp[selectNum0] = AnnealPeTemp[selectNum1]
        AnnealPeTemp[selectNum1] = amongNum
    return (decodPe(AnnealPe))

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值