求解最值问题的模拟退火python代码:

基于python求解一元最值问题的模拟退火

给出一元最值问题的模拟退火python代码,多元最值问题适当修改即可:
问题描述:求解函数y=11sin(x)+7cos(5x)在[-3,3]内的最大值!

# --utf-8--
# author: 来瓶安慕嘻
# time:2020-7-2
# 模拟退火

import pandas as pd
from matplotlib import pyplot as plt
import numpy as np
import math
import random

def sa():
    '''初始化参数'''
    T0 = 100 
    T = T0 
    maxgen = 300 
    Lk = 100 
    alfa = 0.95 
    x_lb = -3 
    x_ub = 3 


    '''初始化x0,y0'''
    x0 = x_lb+(x_ub-x_lb)*random.random()

    # 初始化iter_x和iter_y,用来储存每一次的y值和x值,用来最后搜寻最大值和最小值
    iter_x = [x0]
    iter_y = [cal_y(x0)]

    '''==========================
    开始模拟退火啦
    =============================
    '''
    for i in range(maxgen):
        for j in range(Lk):
            y0 = cal_y(x0)
            y = np.random.randn(1)
            x_new = x0+y*T
            if x_new < x_lb:
                r = random.random()
                x_new= r*x_lb+(1-r)*x0
            elif x_new > x_ub:
                r = random.random()
                x_new= r*x_ub+(1-r)*x0
            x1 = x_new
            y1 = cal_y(x1)
            if y1>y0:
                x0 = x1
                iter_x.append(x1)
                iter_y.append(y1)
            else:
                p = math.exp(-(y0-y1)/T)
                if random.random() < p:
                    x0 = x1
        T = alfa*T


    best_y = max(iter_y)
    best_x = float(iter_x[iter_y.index(best_y)])
    print('最佳的位置为:',np.round(best_x,4))
    print('对应的最优值为:',np.round(best_y,4))

def cal_y(x):
    y = 11 * math.sin(x) + 7 * math.cos(5 * x)
    return y


if __name__ == '__main__':
    sa()
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值