模拟退火算法

算法思路

模拟退火是模拟物理上退火方法,通过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)

相关推荐

  1. 模拟退火算法

    2024-04-03 15:50:03       14 阅读
  2. Python模拟退火算法

    2024-04-03 15:50:03       13 阅读
  3. 模拟退火算法matlab代码

    2024-04-03 15:50:03       12 阅读
  4. MATLAB初学者入门(12)—— 模拟退火算法

    2024-04-03 15:50:03       11 阅读
  5. 模拟退火算法详细讲解(含实例python代码)

    2024-04-03 15:50:03       11 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-03 15:50:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-03 15:50:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-03 15:50:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-03 15:50:03       20 阅读

热门阅读

  1. 每日OJ题_回文串dp①_力扣647. 回文子串

    2024-04-03 15:50:03       13 阅读
  2. 【WPF应用24】C#中的Image控件详解与应用示例

    2024-04-03 15:50:03       16 阅读
  3. rust实现希尔排序算法

    2024-04-03 15:50:03       17 阅读
  4. 七彩云转码系统v12.8二开正式版发布

    2024-04-03 15:50:03       14 阅读
  5. 宝塔面板CentOS Stream 8 x86 下如何安装openlitespeed

    2024-04-03 15:50:03       12 阅读
  6. 【Python BUG】局域网内远程连接mysql错误:1130

    2024-04-03 15:50:03       16 阅读
  7. AI大模型学习的理论基础

    2024-04-03 15:50:03       13 阅读
  8. 26.活锁、饥饿锁

    2024-04-03 15:50:03       14 阅读