模拟退火Python实现(Simulated Annealing, SA)

17 篇文章 2 订阅
15 篇文章 0 订阅

一、概念

  模拟退火算法(Simulated Annealing,SA)最早的思想是由N. Metropolis [1] 等人于1953年提出。1983 年,S. Kirkpatrick 等成功地将退火思想引入到组合优化领域。它是基于Monte-Carlo迭代求解策略的一种随机寻优算法,其出发点是基于物理中固体物质的退火过程与一般组合优化问题之间的相似性。模拟退火算法从某一较高初温出发,伴随温度参数的不断下降,结合概率突跳特性在解空间中随机寻找目标函数的全局最优解,即在局部最优解能概率性地跳出并最终趋于全局最优。模拟退火算法是一种通用的优化算法,理论上算法具有概率的全局优化性能,目前已在工程中得到了广泛应用,诸如VLSI、生产调度、控制工程、机器学习、神经网络、信号处理等领域。

  模拟退火算法是通过赋予搜索过程一种时变且最终趋于零的概率突跳性,从而可有效避免陷入局部极小并最终趋于全局最优的串行结构的优化算法。

  基于神经网络动态转移过程,状态掉进了局部最优解里了,就是能量函数没有达到最低,只是掉进了局部能量最低的状态,这和我们梯度容易获得局部最优解差不多,大家这样理解就好,想要深入理解的建议自己多参考文献。为了解决伪吸引子的问题,人们提出了模拟退火算法和玻尔兹曼机彻底解决了伪吸引子的问题。

  模拟退火算法与初始值无关,算法求得的解与初始解状态S(是算法迭代的起点)无关;模拟退火算法具有渐近收敛性,已在理论上被证明是一种以概率收敛于全局最优解的全局优化算法;模拟退火算法具有并行性。

物理退火过程 :

  • 加温过程——增强粒子的热运动,消除系统原先可能存在的非均匀态;
  • 等温过程——对于与环境换热而温度不变的封闭系统,系统状态的自发变化总是朝自由能减少的方向进行,当自由能达到最小时,系统达到平衡态;
  • 冷却过程——使粒子热运动减弱并渐趋有序,系统能量逐渐下降,从而得到低能的晶体结构。

热力学中的退火现象指物体逐渐降温时发生的物理现象:

温度越低,物体的能量状态越低,到达足够的低点时,液体开始冷凝与结晶,在结晶状态时,系统的能量状态最低。缓慢降温时,可达到最低能量状态;但如果快速降温,会导致不是最低能态的非晶形。

  模仿自然界退火现象而得,利用了物理中固体物质的退火过程与一般优化问题的相似性从某一初温度开始,伴随温度的不断下降,结合概率突跳特性在解空间中随机寻找全局最优解。

组合优化问题对应物理状态
粒子状态
最优解能量最低的状态
设定初温溶解过程
Metropolis抽样过程等温过程
控制参数的下降冷却
目标函数能量

模拟退火算法的计算步骤:

  1. 初始化,任选初始解 i ∈ S i \in S iS,给定初始温度 T 0 T_{0} T0,终止温度 T f T_{f} Tf,令迭代指标 k = 0 , T k = T 0 k=0,T_{k}=T_{0} k=0,Tk=T0
    选择时 T 0 T_{0} T0,要足够高,使 E i T k → 0 \frac{{{E_i}}}{{{T_k}}} \to 0 TkEi0
    初始化:初始温度T(充分大),初始解状态S(是算法迭代的起点),每个T值的迭代次数L循环由此开始,对k=1, …, L做第2至第步5
  2. 随机产生一个领域解, j ∈ N ( i ) j \in N(i) jN(i),(其中 N ( i ) N(i) N(i)表示i的领域)。计算目标值增量 Δ f = f ( j ) − f ( i ) Δf=f(j)-f(i) Δf=f(j)f(i)
  3. Δ f < 0 \Delta f<0 Δf<0,令 i = j i=j i=j转步 ④(j比i优秀无条件赋值)否则产生概率 e − Δ f T k {e^{\frac{{ - \Delta f}}{{{T_k}}}}} eTkΔf使得
    e − Δ f T k = f ( j ) {e^{\frac{{ - \Delta f}}{{{T_k}}}}} = f(j) eTkΔf=f(j)
    这里实质上是当 T k T_{k} Tk高时,进行广域搜索; T k T_{k} Tk低时,局域搜索。
  4. 若达到热平衡(内循环次数大于 n ( T k ) n(T_{k}) n(Tk))时,转至步⑤,否则转步②。
  5. k = k + 1 k=k+1 k=k+1降低 T k T_{k} Tk,若 T k < T f T_{k}<T_{f} Tk<Tf则停止否则转步②。
    降低 T k T_{k} Tk的方法有以下两种:
    1. 较好的方法 T k + 1 = T k ∗ r T_{k+1}=T_{k}*r Tk+1=Tkr,其中 r ∈ ( 0.95 , 0.99 ) r \in (0.95,0.99) r(0.95,0.99)
    2. T k + 1 = T k − Δ T T_{k+1}=T_{k}-\Delta T Tk+1=TkΔT
      在这里插入图片描述

二、Python代码实现

  给定函数 f ( x ) = x ⋅ s i n ( x ) , x ∈ [ 0 , 12.55 ] f(x)=x·sin(x),x \in[0,12.55] f(x)=xsin(x),x[0,12.55],求函数在给定区域的最大值。

import numpy as np


# 自定义目标函数C
def C(s):
    return 1 / (s * np.sin(s) + 12)


# 初始化
# 设定初始温度
# 函数原型:numpy.random.uniform(low,high,size)
# 从一个均匀分布[low,high)中随机采样,注意定义域是左闭右开,即包含low,不包含high.
t0 = np.var(np.random.uniform(0, 12.55, 100))

# 设定初始解
s0 = np.random.uniform(0, 12.55, 1)

# 设定迭代次数
iters = 3000

# 设定终止条件,连续ct个新解都没有接受(ct/cn大于某个值)时终止算法
ct = 200
ct_array = []

# 保存历史最好的状态,默认取上边界值
best = 12.55

for t in range(1, iters + 1):
    # 在s0附近,产生新解,但又能包含定义内的所有值
    s1 = np.random.normal(s0, 2, 1)
    while s1 < 0 or s1 > 12.55:
        s1 = np.random.normal(s0, 2, 1)
    # 计算能量增量
    delta_t = C(s1) - C(s0)
    if delta_t < 0:
        s0 = s1
        ct_array.append(1)
    else:
        p = np.exp(-delta_t / t0)
        if np.random.uniform(0, 1) < p:
            s0 = s1
            ct_array.append(1)
        else:
            ct_array.append(0)

    best = s0 if C(s0) < C(best) else best

    # 更新温度
    t0 = t0 / np.log(1 + t)

    # 检查终止条件
    if len(ct_array) > ct and np.sum(ct_array[-ct:]) == 0:
        print("迭代 ", t, " 次,连续 ", ct, " 次没有接受新解,算法终止!")
        break

# 状态最终停留位置
s0
# array([7.98092592])

# 最佳状态,即对应最优解的状态
best
# 迭代  363  次,连续  200  次没有接受新解,算法终止!
# array([7.98092592])

三、​​应用:

1、模拟退火算法在VLSI设计中的应用

  利用模拟退火算法进行VLSI的最优设计,是目前模拟退火算法最成功的应用实例之一。用模拟退火算法几乎可以很好地完成所有优化的VLSI设计工作。如全局布线、布板、布局和逻辑最小化等等。

2、模拟退火算法在神经网计算机中的应用

  模拟退火算法具有跳出局部最优陷阱的能力。在Boltzmann机中,即使系统落入了局部最优的陷阱,经过一段时间后,它还能再跳出来,再系统最终将往全局最优值的方向收敛。

3、模拟退火算法在图像处理中的应用

  模拟退火算法可用来进行图像恢复等工作,即把一幅被污染的图像重新恢复成清晰的原图,滤掉其中被畸变的部分。因此它在图像处理方面的应用前景是广阔的。

4、模拟退火算法的其他应用

  除了上述应用外,模拟退火算法还用于其它各种组合优化问题,如TSP和Knapsack问题等。大量的模拟实验表明,模拟退火算法在求解这些问题时能产生令人满意的近似最优解,而且所用的时间也不很长。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
模拟退火算法(Simulated Annealing,SA)是一种通用的优化算法,它模拟物质从高温到低温的退火过程,通过不断降低温度,使得系统达到最优状态。 下面是一个简单的 Python 实现: ```python import math import random def simulated_annealing(cost_function, initial_state, initial_temperature, cooling_rate, min_temperature): current_state = initial_state current_cost = cost_function(current_state) temperature = initial_temperature while temperature > min_temperature: neighbor_state = get_neighbor(current_state) neighbor_cost = cost_function(neighbor_state) delta = neighbor_cost - current_cost if delta < 0: current_state = neighbor_state current_cost = neighbor_cost else: probability = math.exp(-delta / temperature) if random.random() < probability: current_state = neighbor_state current_cost = neighbor_cost temperature *= cooling_rate return current_state, current_cost def get_neighbor(state): # 生成一个随机的邻居状态 pass def cost_function(state): # 计算状态的代价 pass # 示例 initial_state = ... initial_temperature = ... cooling_rate = ... min_temperature = ... best_state, best_cost = simulated_annealing(cost_function, initial_state, initial_temperature, cooling_rate, min_temperature) print("Best state:", best_state) print("Best cost:", best_cost) ``` 其中,`cost_function` 是代价函数,`initial_state` 是初始状态,`initial_temperature` 是初始温度,`cooling_rate` 是降温速率,`min_temperature` 是最小温度。 在 `simulated_annealing` 函数中,首先初始化当前状态和代价,然后不断迭代直到达到最小温度。每次迭代,先生成一个随机的邻居状态,然后计算邻居状态的代价与当前状态的代价之差。如果邻居状态的代价比当前状态的代价更优,则接受邻居状态;否则以一定的概率接受邻居状态,概率随温度的降低而减小。最终返回最优状态和最优代价。 在实际应用中,需要根据具体问题来定义代价函数和邻居状态的生成方式。同时,需要设置合适的初始温度、降温速率和最小温度,以保证算法能够在合理的时间内收敛到最优解。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值