模拟退火算法

算法思路

模拟退火是模拟物理上退火方法,通过N次迭代(退火),逼近函数的上的一个最值(最大或者最小值)。

预备知识

随机函数

在Python中,可以使用random模块中的函数来获取随机数。这个模块提供了多种生成随机数的方法。

首先,你需要导入random模块。然后,你可以使用以下函数来获取不同类型的随机数:

  • random(): 返回一个[0.0, 1.0)之间的随机浮点数。
  • randint(a, b): 返回一个[a, b]之间的随机整数(包含a和b)。
  • randrange(start, stop[, step]): 返回一个从start到stop之间的随机整数,步长为step。
  • choice(seq): 从非空序列seq中随机选择一个元素。
  • shuffle(seq): 将序列seq中的元素随机打乱顺序。
  • uniform(a, b): 返回一个[a, b]之间的随机浮点数。

以下是一些使用random模块获取随机数的示例:

import random

# 返回一个[0.0, 1.0)之间的随机浮点数
random_float = random.random()
print(random_float)

# 返回一个[1, 10]之间的随机整数
random_int = random.randint(1, 10)
print(random_int)

# 从一个列表中随机选择一个元素
my_list = [1, 2, 3, 4, 5]
random_choice = random.choice(my_list)
print(random_choice)

# 打乱一个列表的顺序
random.shuffle(my_list)
print(my_list)

# 返回一个[2.0, 7.0]之间的随机浮点数
random_uniform = random.uniform(2.0, 7.0)
print(random_uniform)

请注意,每次运行这些代码时,由于生成的是随机数,所以结果都会有所不同。

伪代码

import random
//Range_max 为事先定义的正的最大范围
T = 2000; //代表开始的温度
dT = 0.99; //代表系数delta T
eps = 1e-14; //相当于0.0000000000000001

//用自变量计算函数值,这里可能存在多个自变量对应一个函数值的情况,比如f(x,y)
def func(int x, ... ) {
    //这里是对函数值进行计算
    ans = .......
    return ans;
}
//原始值
x = random.random()*Range_max; //x0取规定范围内的随机值
double f = func(x,...); //通过自变量算出f(x0)的值
while(T > eps) {
    //--------------
    //这里是每一次退火的操作
    
    //x1可以左右随机移动,幅度和温度T正相关,所以*T
    //注意这里移动可以左右移动,但是也可以单向移动
    //关于rand()详细见开头注的①
    dx = (Range_max*random.random() - Range_max) * T; 
    
    //让x落在定义域内,如果没在里面,就重新随机。题目有要求需要写,否则不用写
    // ================
    while(x > ? || x < ? ...) {
        dx = (Range_max*random.random() - Range_max) * T; 
    }
    // ================
    
    //求出f(x1)的值
    df = func(dx);
    //这里需要具体问题具体分析,我们要接受更加优秀的情况。可能是df < f(比如求最小值)
    if(f < df) {
        f = df; x = dx;  [...,y = dy;] // 接受,替换值,如果多个自变量,那么都替换
    }
    //否则概率接受,注意这里df-f也要具体问题具体分析。
    //详细见开头注的②③
    else if(exp((df - f) / T) > random.random()) {
        f = df; x = dx;  [...y = dy;] // 接受,替换值,如果多个自变量,那么都替换
    }
    //--------------
    T = T * dT; //温度每次下降一点点, T * 0.99
}
//最后输出靠近最优的自变量x值,和函数值f(x)
print(x,f)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值