python实现模拟退火算法

作者: 小太阳花儿 | 来源:发表于2019-04-09 19:12 被阅读0次
    问题

    求F(x)在定义域[5,8]上的最大值

    源码
    # 模拟退火法
    import numpy as np
    import math
    
    
    
    # 定义域x从5到8闭区间
    BOUND = [5,8]
    
    tmp = 1e2
    tmp_min = 1e-3
    alpha = 0.98
    beta = 1
    def F(x):
        return math.sin(x*x)+2.0*math.cos(2.0*x)
    
    def judge(de,tmp):
        if de > 0:
            return 1
        else:
            if math.exp(de/tmp) > np.random.rand():
                return 1
            else:
                return 0
    
    
    x = np.random.rand()*(BOUND[1]-BOUND[0])+BOUND[0]
    f = F(x)
    counter = 0
    while tmp > tmp_min:
        delta = (np.random.rand()-0.5)*beta
        x_new = x + delta
        
        if x_new < BOUND[0]:
            x_new = x_new + BOUND[1] - BOUND[0]
        if x_new > BOUND[1]:
            x_new = x_new - BOUND[1] + BOUND[0]
            
        f_new = F(x_new)
        de = f_new - f
        flag = judge(de,tmp)
        if(flag):
            f = f_new
            x = x_new
        
        if de > 0:
            tmp = tmp * alpha
        counter += 1
        print('current x {}, y {},tmp {},counter {}'.format(x,f,tmp,counter))
    
    运行结果
    调调参数看怎样收敛比较快
    # 更优的参数配搭
    tmp = 1e2
    tmp_min = 1e-3
    alpha = 0.89
    beta = 1.2
    
    今天也要开心呀

    相关文章

      网友评论

        本文标题:python实现模拟退火算法

        本文链接:https://www.haomeiwen.com/subject/gkgiiqtx.html