模拟退火算法(SA,Simulated Annealing)

模拟退火算法用于解决最优化问题

爬山算法(一种完全的贪心搜索算法),每次向着当前上升速度最快的方向向上爬,最后的最优解取决于初始点,容易陷入局部最优解困境,如图,若起始点选择在C处,当算法到达A点时候将停止寻找,因为在A点附近没有任何上升的机会。模拟退火算法则用于尝试解决这个问题


这里写图片描述

过程中:目标函数 作为 能量函数
算法思想:模拟退火算法以一定的概率接受一个比当前解要差的解(这个概率随着时间的推移逐渐降低),最后就有可能跳出局部最优解从而达到全局最优解

算法伪代码:
T:系统当前的温度
min_T:温度下限
Y(i):当前状态
Y(i+1):新状态
J(y):表示在状态y时的评价函数值(能量函数)
r:控制降温快慢

While(T > min_T)
{
    dE = J(Y(i+1))-J(Y(i))
    if(dE >= 0):
        Y(i+1) = Y(i) //若移动后的状态比之前好,则接受移动
    else:
        if(exp(dE/T)>random(0,1)):
            Y(i+1) = Y(i) //接受移动
    T = r * T //降温退火
    i ++
}

一个模拟退火算法例子
计算列表元素的最大值

from random import randint
import math
import random

'''模拟退火算法选择列表中的最大值'''
def simAnnealingMAX(lst,howfar):
    '''
    lst是待确定最大值的列表
    howfar是每次前进时能够看到的最远方,当然越大算法越准确
    '''
    assert howfar>1,'parameter "howfar" must > 1'
    # 从列表中的第一个元素开始
    # 如果已经到达最后一个元素或者找到局部最大值,算法结束
    start = 0
    length = len(lst)
    times = 1# 随机游走次数

    while start <= length:
        # 当前局部最优解
        m = lst[start]
        # 下一个领域内的数字
        loc = lst[start+1:start+howfar]
        # 如果已经处理完所有数据,则结束
        if not loc:
            return m
        # 达到下一个里领域内的局部最优解及其下标
        mm = max(loc)
        mmPos = loc.index(mm)
        # 如果下一个领域内有更优的解,Go!
        if m <= mm:
            start += mmPos + 1
        else:
            # 如果下一个领域内没有更优解,以一定的概率前进或结束
            delta = (m-mm)/(m+mm)
            # 随机游走的次数越多,对概率要求越低
            if delta < random.random()/times:
                start += mmPos + 1
                times += 1
            else:
                return m

lst = [randint(1,200) for i in range(200)]
print('最优解最大值:',max(lst))
print('局部最优解:',simAnnealingMAX(lst,10))
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值