模拟退火(SA)—原理以及Python简单实现

1.模拟退火概念:
最优化算法,随机从某一状态开始,然后随机生成一个较小的随机数(扰动量),然后得到新的状态。若新状态比原状态好,则直接更新。若新状态比原状态差,则根据随机产生0~1之间的随机数和,状态转移概率(Metropolis准则)抉择是否更新状态。模拟退火算法是一种启发式搜索算法,即按照预定的控制策略进行搜索,在搜索过程中获取的中间信息将用来改进控制策略
在这里插入图片描述

简单说就是:
更新x:根据已有的x,再给出随机数值r,然后更新xNew = x + r
求值yNew:根据xNew和函数求出yNew
比较状态:yNew比原来的解更好时候,直接更新(x=xNew)。比原来差时,根据随着逐渐减小的概率p(状态转移概率)与随机数r比较,r<p时,更新,反之则不更新,随着执行次数的增加,也越难更新。
计算温度:t=t+1,T=T(t),循环,直到满足终止条件。

2.状态空间与领域函数:
状态空间:由编码的可行解的集合组成,说白了就是自变量定义域。
邻域函数:尽可能满足产生的候选解遍布全部的状态空间,通常由产生候选解的方式和候选解产生的概率分布组成,就是由产生的随机数再加上原来的自变量。

3.状态转移概率(Metropolis准则)
在这里插入图片描述

特点:P与T增而增,减而减,所以后期的状态转移概率非常小,即很难改变状态

4.冷却进度表
经典模拟退火算法降温方式:
在这里插入图片描述

快速模拟退火算法降温方式:
在这里插入图片描述

其余貌似不是很常见,暂时写这两个

5.初始温度设置:
模拟退火算法收初始温度的影响较大,对于求高质量解和计算效率都有拮抗影响(大概这个意思)。
确定初始温度的常用方法:
(1)均匀抽样一组状态,以各状态目标值的方差为初温。
(2)随机产生一组状态,确定亮亮状态间的最大目标值差,然后根据差值,利用一定的函数确定初温,如:
在这里插入图片描述
其中Pr为初始接受概率。
(3)根据经验公式给出

6.python代码实现:求出最小值

# 模拟退火模型构建
T  = 1000                                   # 温度
T0 = T                                      # 初始温度
Tmin = 1                                    # 最小温度
t = 0                                       # 时间
k = 50                                      # 每个温度的迭代次数
x = np.random.uniform(low=0,high=100)       # 随机化初始值
y = 0                                       # y初始值

def aimFunction(x):
    y = x ** 3 - 60 * x ** 2 - 4 * x + 6
    return y

while T > Tmin:
    for i in range(k):
        y = aimFunction(x)                                  # 目标函数
        xNew = x + np.random.uniform(low=-0.05,high=0.05)   # 更新xNew
        yNew = aimFunction(xNew)							# 求出新状态值
        if xNew < 100 and xNew > 0:							# 状态比较
            if y > yNew:
                x = xNew
            else:
                r = np.random.uniform(low=0,high=1)         # 随机数
                p = math.exp(-(yNew-y)/T)                   # 概率值
                if r < p:                                   # 小于则更新
                    x = xNew
    t = t + 1
    T = T0/(1+t)                                            # 快速模拟退火算法降温方式
    print("t:",t," T:",T)

print(aimFunction(x))

小白,望大佬指点
推荐模拟退火算法

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
有几个常用的Python模拟退火算法库可供使用,这些库提供了实现模拟退火算法的功能和工具。以下是其中一些库的示例: 1. Simulated Annealing (sa): 这个库提供了一个用于模拟退火算法的简单实现。你可以使用`pip`命令安装它:`pip install SimulatedAnnealing`。 ```python from SimulatedAnnealing import Annealer # 定义问题的目标函数和状态转移函数 def objective_function(state): # 目标函数逻辑 pass def state_transition(current_state): # 状态转移函数逻辑 pass # 创建退火实例 annealer = Annealer(objective_function, state_transition) # 运行退火算法 best_state, best_energy = annealer.anneal() ``` 2. Scipy: SciPy是一个强大的科学计算库,其中包含了一个优化模块,可以使用模拟退火算法进行全局优化。你可以使用`pip`命令安装它:`pip install scipy`。 ```python from scipy.optimize import minimize # 定义问题的目标函数 def objective_function(x): # 目标函数逻辑 pass # 使用模拟退火算法进行全局优化 result = minimize(objective_function, initial_guess, method='anneal') ``` 3. PySAP: PySAP是一个用于稀疏数据重建和分析的Python库,它包含了一个模拟退火算法实现。你可以使用`pip`命令安装它:`pip install pysap`。 ```python from pysap.algorithms import annealing # 定义问题的目标函数和状态转移函数 def objective_function(x): # 目标函数逻辑 pass def state_transition(x): # 状态转移函数逻辑 pass # 运行模拟退火算法 best_state, best_energy = annealing(objective_function, state_transition) ``` 这些库都提供了模拟退火算法的功能,你可以根据自己的需求选择其中之一来使用。希望能对你有帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值