模拟退火算法总结

版权声明:转载请联系邮箱[email protected] https://blog.csdn.net/weixin_42528077/article/details/82708978

Metropolis准则——以概率接受新状态

固体退火问题介绍

退火是指将固体加热到足够高的温度,使分子呈随机排列状态,然后逐步降温使之冷却,最后分子以低能状态排列,固体达到某种稳定状态。

  • 加温过程——增强粒子的热运动,消除系统原先可能存在的非均匀态;

  • 等温过程——对于与环境换热而温度不变的封闭系统,系统状态的自发变化总是朝自由能减少的方向进行,当自由能达到最小时,系统达到平衡态;

  • 冷却过程——使粒子热运动减弱并渐趋有序,系统能量逐渐下降,从而得到低能的晶体结构。

Metropolis接受准则

先给定以粒子相对位置表征的初始状态old,作为固体的当前状态,该状态的能量是$E_{old}$。然后用摄动装置使随机选取的某个粒子的位移随机地产生一个微小变化,得到一个新状态new,新状态的能量是$E_{new}$

假设在状态时 X o l d ,系统受到某种扰动而使其状态变为 X n e w 。与此相对应,系统的能量也从 E ( X o l d ) 变成 E ( X n e w ) ,系统由状态 X o l d 变为状态 X n e w 的接受概率P为:

P ( X o l d X n e w ) = 1 E ( X o l d ) E ( X n e w )

P ( X o l d X n e w ) = e E ( X n e w ) E ( X o l d ) T E ( X o l d ) E ( X n e w )

在温度T下,当前状态到新状态(1)若 E ( X o l d ) E ( X n e w ) ,则接受new为当前状态;(2)否则,以概率 p = e x p ( E ( X n e w ) E ( X o l d ) T ) 接受该状态为当前状态,否则保持old为当前状态。

接受准则的意义

重复以上新状态的产生过程。在大量迁移(固体状态的变换称为迁移)后,系统趋于能量较低的平衡状态。

接受的概率表达式说明,在高温时接受与当前状态能量差较大的新状态为当前状态的概率较大,而在低温时则概率较小;当T趋近于0时,就不能接受任何能量变高的新状态了。

模拟退火算法

基本架构

把 Metropolis准则引入到优化过程中来,最终得到一种对Metropolis算法进行迭代的组合优化算法,即模拟退火算法。

对优化问题,需要有一个控制参数t和非负目标函数 f ( x i t ) ,其中 x i t 是在控制参数为t时的解。对于控制参数的每一取值,算法持续进行”产生新解—判断—接受/舍弃”的迭代过程。

控制参数t模拟了物理过程中的温度T,目标函数模拟了物理过程中的能量E,而解模拟了粒子群的微观状态。对于控制参数的每一取值,算法持续进行”产生新解—判断—接受/舍弃”的迭代过程就对应着固体在某一恒定温度下趋于热平衡的过程,也就是执行了一次Metropolis算法。

模拟退火算法从某个初始解出发,经过大量解的变换后,可以求得给定控制参数值为t时组合优化问题的相对最优解 x o p t t 。然后减少控制参数的值,重复执行Metropolis算法,就可以在控制参数趋于零时,最终求得组合优化问题的整体最优解。

固体退火必须”徐徐”降温,才能使固体在每一温度下都达到热平衡,最终趋于能量最小的基态,控制参数的值也必须缓慢衰减,才能确保模拟退火算法最终趋于组合优化问题的整体最优解集。

流程框图

框图

代码实现

% 使用模拟退火计算这个函数h = @(x) x + 10.*sin(5.*x) + 7.*cos(4.*x) 在[-10,10]上的最小值
% 它真正的最小值在x = -5.398附近
% 在模拟退火算法的中采用一种神奇的算法产生新解
%(在当前解的一个邻域内随机产生一个新解,领域的大小随着温度的下降逐渐变小)

Tf = 0.1^10;     %最小温度限
T = 1;           %初始温度
space = 10;      %初始领域长
alpha = 0.5;     %领域长衰减系数
Tt = @(t) 0.99*t; %温度更新函数
h = @(x) x + 10.*sin(5.*x) + 7.*cos(4.*x); %定义句柄函数(直接作为目标函数)
randm = @(x0,w) (x0 - w + 2*w*rand); %定义领域随机数生成器

x_opt = randm(0,10); %产生初始解
while 1
    %产生新解(保证新解在范围内)
    while 1
        x_new = randm(x_opt,space);
        if (x_new >= -10) && (x_new <= 10)
            break
        end
    end
    %计算delta_f和判断是否接受
    df = h(x_new) - h(x_opt);
    if df < 0
        x_opt = x_new;
    elseif exp(-df/T) > rand
        x_opt = x_new;
    end
    %更新温度
    T = Tt(T);
    %判断是否终止
    if T < Tf
        break
    end
end
x_opt

这个神奇的函数h = @(x) x + 10.*sin(5.*x) + 7.*cos(4.*x)的图像是:

picture

代码输出:

代码输出

猜你喜欢

转载自blog.csdn.net/weixin_42528077/article/details/82708978
今日推荐