模拟退火算法(SA)

一、算法理论

1、物理退火过程

        模拟退火算法以优化问题求解过程与物理退火过程之间的相似性为基础,优化的目标函数相当于金属的内能,优化问题的自变量组合状态空间相当于金属的内能状态空间,问题的求解过程就是找一个组合状态,使目标函数值最小。利用Metopolis算法并适当地控制温度的下降过程实现模拟退火,从而达到求解全局优化问题的目的。

        模拟退火算法的核心思想与热力学的原理极为类似。在高温下,液体的大量分子彼此之间进行着相对自由移动。如果该液体慢慢地冷却,热能原子可动性就会消失。大量原子常常能够自行排列成行,形成一个纯净的晶体,该晶体在各个方向上都被完全有序地排列在几百万倍于单个原子的距离之内。对于这个系统来说,晶体状态是能量最低状态,而所有缓慢冷却的系统都可以自然达到这个最低能量状态。若液态金属被迅速冷却,则不一定会达到这一状态,而只能达到一种只有较高能量的多晶体状态或非结晶状态。因此,这一过程的本质在于缓慢地冷却,以争取足够的时间,让大量原子在丧失可动性之前进行重新分布,这是确保能量达到低能量状态所必需的条件。简单而言,物理退火过程由以下几部分组成:加温过程、等温过程和冷却过程。

  • 加温过程

        其目的是增强粒子的热运动,使其偏离平衡位置。当温度足够高时,固体将熔解为液体,从而消除系统原先可能存在的非均匀态,使随后进行的冷却过程以某一平衡态为起点。熔解过程与系统的能量增大过程相联系,系统能量也随温度的升高而增大。

  • 等温过程

        通过物理学的知识得知,对于与周围环境交换热量而温度不变的封闭系统,系统状态的自发变化总是朝着自由能减小的方向进行;当自由能达到最小时,系统达到平衡态。

  • 冷却过程

        其目的是使粒子的热运动减弱并逐渐趋于有序,系统能量逐渐下降,从而得到低能量的晶体结构。

2、模拟退火原理

        模拟退火算法来源于固体退火原理,将固体加温至充分高,再让其徐徐冷却。加温时,固体内部粒子随温升变为无序状,内能增大;而徐徐冷却时粒子渐趋有序,在每个温度上都达到平衡态,最后在常温时达到基态,内能减为最小。模拟退火算法与金属退火过程的相似关系如表

         根据Metropolis准则,粒子在温度T时趋于平衡的概率为exp(-ΔE/T),其中E为温度T时的内能,ΔE为其改变量。用固体退火模拟组合优化问题,将内能E模拟为目标函数值,温度T演化成控制参数,即得到解组合优化问题的模拟退火算法:由初始解X0和控制参数初值T开始,对当前解重复“产生新解→计算目标函数差→接受或舍弃”的迭代,并逐步减小 T 值,算法终止时的当前解即为所得近似最优解,这是基于 Monte Carlo 迭代求解法的一种启发式随机搜索过程。退火过程由冷却进度表控制,包括控制参数的初值T0及其衰减因子K、每个T值时的迭代次数L和停止条件。

2、模拟退火算法思想

        模拟退火的主要思想是:在搜索区间随机游走(即随机选择点),再利用Metropolis抽样准则,使随机游走逐渐收敛于局部最优解。而温度是Metropolis算法中的一个重要控制参数,可以认为这个参数的大小控制了随机过程向局部或全局最优解移动的快慢。

        Metropolis 是一种有效的重点抽样法,其算法为:系统从一个能量状态变化到另一个状态时,相应的能量从E1变化到E2,其概率为

         如果E2 < E1,系统接受此状态;否则,以一个随机的概率接受或丢弃此状态。状态2被接受的概率为

         这样经过一定次数的迭代,系统会逐渐趋于一个稳定的分布状态。终点抽样时,新状态下如果向下,则则接受(局部最优);若向上(全局搜索),则以一定概率接受。模拟退火算法从某个初始解出发,经过大量解的变换后,可以求得给定控制参数值时组合优化问题的相对最优解。然后减小控制参数T的值,重复执行 Metropolis 算法,就可以在控制参数 T 趋于零时,最终求得组合优化问题的整体最优解。控制参数的值必须缓慢衰减。

        温度是Metropolis算法的一个重要控制参数,模拟退火可视为递减控制参数T时Metroplis算法的迭代。开始时T值大,可以接受较差的恶化解;随着T的减小,只能接受较好的恶化解;最后在T趋于0时,就不再接受任何恶化解了。在无限高温时,系统立即均匀分布,接受所有提出的变换。T 的衰减越小,T到达终点的时间越长;但可使马尔可夫(Markov)链减小,以使到达准平衡分布的时间变短。

二、算法特点

        适用范围广,求得全局最优解的可靠性高,算法简单,便于实现;该算法的搜索策略有利于避免搜索过程因陷入局部最优解的缺陷,有利于提高求得全局最优解的可靠性。模拟退火算法具有十分强的鲁棒性,这是因为比起普通的优化搜索方法,它采用许多独特的方法和技术。

1、以一定的概率接受恶化解

        模拟退火算法在搜索策略上不仅引入了适当的随机因素,而且还引入了物理系统退火过程的自然机理。这种自然机理的引入,使模拟退火算法在迭代过程中不仅接受使目标函数值变“好”的点,而且还能够以一定的概率接受使目标函数值变“差”的点。迭代过程中出现的状态是随机产生的,并且不强求后一状态一定优于前一状态,接受概率随着温度的下降而逐渐减小。很多传统的优化算法往往是确定性的,从一个搜索点到另一个搜索点的转移有确定的转移方法和转移关系,这种确定性往往可能使得搜索点远达不到最优点,因而限制了算法的应用范围。而模拟退火算法以一种概率的方式来进行搜索,增加了搜索过程的灵活性。

2、引进算法控制参数

        引进类似于退火温度的算法控制参数,它将优化过程分成若干阶段,并决定各个阶段下随机状态的取舍标准,接受函数由Metropolis算法给出一个简单的数学模型。模拟退火算法有两个重要的步骤:一是在每个控制参数下,由前迭代点出发,产生邻近的随机状态,由控制参数确定的接受准则决定此新状态的取舍,并由此形成一定长度的随机Markov链;二是缓慢降低控制参数,提高接受准则,直至控制参数趋于零,状态链稳定于优化问题的最优状态,从而提高模拟退火算法全局最优解的可靠性。

3、对目标函数要求少

        传统搜索算法不仅需要利用目标函数值,而且往往需要目标函数的导数值等其他一些辅助信息才能确定搜索方向;当这些信息不存在时,算法就失效了。而模拟退火算法不需要其他的辅助信息,而只是定义邻域结构,在其邻域结构内选取相邻解,再用目标函数进行评估。

三、模拟退火算法的改进方向

        在确保一定要求的优化质量基础上,提高模拟退火算法的搜索效率,是对模拟退火算法改进的主要内容。有如下可行的方案:选择合适的初始状态;设计合适的状态产生函数,使其根据搜索进程的需要表现出状态的全空间分散性或局部区域性;设计高效的退火过程;改进对温度的控制方式;采用并行搜索结构;设计合适的算法终止准则;等等。

        此外,对模拟退火算法的改进,也可通过增加某些环节来实现。主要的改进方式有:
(1)增加记忆功能。为避免搜索过程中由于执行概率接受环节而遗失当前遇到的最优解,可通过增加存储环节,将到目前为止的最好状态存储下来。
(2)增加升温或重升温过程。在算法进程的适当时机,将温度适当提高,从而可激活各状态的接受概率,以调整搜索进程中的当前状态,避兔算法在局部极小解处停滞不前。
(3)对每一当前状态,采用多次搜索策略,以概率接受区域内的最优状态,而不是标准模拟退火算法的单次比较方式。
(4)与其他搜索机制的算法(如遗传算法、免疫算法等)相结合。可以综合其他算法的优点,提高运行效率和求解质量。

四、模拟退火算法流程

模拟退火算法新解的产生和接受可分为如下三个步骤:
(1)由一个产生函数从当前解产生一个位于解空间的新解;为便于后续的计算和接受,减少算法耗时,通常选择由当前解经过简单变换即可产生新解的方法。注意,产生新解的变换方法决定了当前新解的邻域结构,因而对冷却进度表的选取有一定的影响。
(2)判断新解是否被接受,判断的依据是一个接受准则,最常用的接受准则是 Metropolis 准则:若 ΔE<0,则接受 X′作为新的当前解 X;否则,以概率exp(-ΔE/T)接受X′作为新的当前解X。
(3)当新解被确定接受时,用新解代替当前解,这只需将当前解中对应于产生新解时的变换部分予以实现,同时修正目标函数值即可。此时,当前解实现了一次迭代,可在此基础上开始下一轮试验。若当新解被判定为舍弃,则在原当前解的基础上继续下一轮试验。模拟退火算法求得的解与初始解状态(算法迭代的起点)无关,具有渐近收敛性,已在理论上被证明是一种以概率l 收敛于全局最优解的优化算法。模拟退火算法可以分解为解空间、目标函数和初始解三部分。该算法具体流程如下:

(1)初始化:设置初始温度T0(充分大)、初始解状态X0(是算法迭代的起点)、每个T值的迭代次数L;
(2)对k=1,…,L做第(3)至第(6)步;
(3)产生新解X′;
(4)计算增量ΔE=E(X′)-E(X),其中E(X)为评价函数;
(5)若 ΔE<0,则接受 X′作为新的当前解,否则以概率exp(-ΔE/T)接受 X′作为新的当前解;
(6)如果满足终止条件,则输出当前解作为最优解,结束程序;
(7)T逐渐减小,且T→0,然后转第(2)步。模拟退火算法流程如图

五、关键参数说明

        为了得到最优解,该算法通常要求较高的初温以及足够多次的抽样,这使算法的优化时间往往过长。从算法结构知,新的状态产生函数、初温、退温函数、Markov 链长度和算法停止准则,是直接影响算法优化结果的主要环节。

关键参数取值原因
状态产生函数一般情况下状态产生函数由两部分组成,即产生候选解
的方式和产生候选解的概率分布。候选解的产生方式由问题的性质决定,通常在当前状态的邻域结构内以一定概率产生。
初温温度T在算法中具有决定性的作用,它直接控制着退火的走向。由随机移动的接受准则可知:初温越大,获得高质量解的几率就越大,且Metropolis的接收率约为 1。然而,初温过高会使计算时间增加。
为此,可以均匀抽样一组状态,以各状态目标值的方差为初温。
退温函数退温函数即温度更新函数,用于在外循环中修改温度值。目前,
最常用的温度更新函数为指数退温函数,即T(n+1)=K×T(n),其中0<K<1是一个非常接近于1的常数。
Markov链长度 L 的选取一般L取100~1000Markov链长度是在等温条件下进行迭代优化的次数,其选取原则是在衰减参数T的衰减函数已选定的前提下,L应选得在控制参数的每一取值上都能恢复准平衡。
算法停止准则

算法停止准则用于决定算法何时结束。可以简单地设置温度终值Tf,当T=Tf时算法终止。然而,模拟火算法的收敛性理论中要求Tf趋向于零,这其实是不实际的。常用的停止准则包:设置终止温度的阈值,设置迭代次数阈值,或者当搜索到的最优值连续保持不变时停止搜索。

六、MATLAB仿真实例

%%%%%%%%%f(x,y)=5*cos(x*y)+x*y+y^3适应值计算%%%%%%%%%
clear all;              %清除所有变量
close all;              %清图
clc;                    %清屏
x=-5:0.02:5;
y=-5:0.02:5;
N=size(x,2);
for i=1:N
    for j=1:N
         z(i,j)=5*cos(x(i)*y(j))+x(i)*y(j)+y(j)^3;
    end
end
mesh(x,y,z)
xlabel('x')
ylabel('y')
%%%%%%%%%%%%%%%%%%%%%%模拟退火算法解决函数极值%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all;                      %清除所有变量
close all;                      %清图
clc;                            %清屏
XMAX= 5;                        %搜索变量x最大值
XMIN= -5;                       %搜索变量x最小值
YMAX= 5;                        %搜索变量y最大值
YMIN= -5;                       %搜索变量y最小值
%%%%%%%%%%%%%%%%%%%%%%%%%%%冷却表参数%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
L = 100;                        %马可夫链长度
K = 0.99;                       %衰减参数
S = 0.02;                       %步长因子
T=100;                          %初始温度
YZ = 1e-8;                      %容差
P = 0;                          %Metropolis过程中总接受点
%%%%%%%%%%%%%%%%%%%%%%%%%%随机选点 初值设定%%%%%%%%%%%%%%%%%%%%%%%%%
PreX =  rand * (XMAX-XMIN)+XMIN;
PreY =  rand * (YMAX-YMIN)+YMIN; 
PreBestX = PreX;
PreBestY = PreY;
PreX =  rand * (XMAX-XMIN)+XMIN;
PreY =  rand * (YMAX-YMIN)+YMIN; 
BestX = PreX;
BestY = PreY;
%%%%%%%%%%%每迭代一次退火一次(降温), 直到满足迭代条件为止%%%%%%%%%%%%
deta=abs( func2( BestX,BestY)-func2 (PreBestX, PreBestY));
while (deta > YZ) && (T>0.001)
    T=K*T; 
    %%%%%%%%%%%%%%%%%%%%%在当前温度T下迭代次数%%%%%%%%%%%%%%%%%%%%%%
    for i=1:L  
        %%%%%%%%%%%%%%%%%在此点附近随机选下一点%%%%%%%%%%%%%%%%%%%%%
        p=0;
        while p==0
            NextX = PreX + S* (rand * (XMAX-XMIN)+XMIN);
            NextY = PreY + S*( rand * (YMAX-YMIN)+YMIN);
            if (NextX >= XMIN && NextX <= XMAX && NextY >=...
                    YMIN && NextY <= YMAX)
                p=1;
            end
        end
        %%%%%%%%%%%%%%%%%%%%%%%是否全局最优解%%%%%%%%%%%%%%%%%%%%%%
        if (func2(BestX,BestY) > func2(NextX,NextY))
            %%%%%%%%%%%%%%%%%%保留上一个最优解%%%%%%%%%%%%%%%%%%%%%
            PreBestX = BestX;
            PreBestY = BestY;
            %%%%%%%%%%%%%%%%%%%此为新的最优解%%%%%%%%%%%%%%%%%%%%%
            BestX=NextX;
            BestY=NextY;
        end
        %%%%%%%%%%%%%%%%%%%%%%%% Metropolis过程%%%%%%%%%%%%%%%%%%%
        if( func2(PreX,PreY) - func2(NextX,NextY) > 0 )
            %%%%%%%%%%%%%%%%%%%%%%%接受新解%%%%%%%%%%%%%%%%%%%%%%%%
            PreX=NextX;
            PreY=NextY;
            P=P+1;
        else
            changer = -1*(func2(NextX,NextY)-func2(PreX,PreY))/ T ;
            p1=exp(changer);
            %%%%%%%%%%%%%%%%%%%%%%%%接受较差的解%%%%%%%%%%%%%%%%%%%%
            if p1 > rand        
                PreX=NextX;
                PreY=NextY;
                P=P+1;         
            end
        end
        trace(P+1)=func2(BestX, BestY);
    end
    deta=abs( func2( BestX,BestY)-func2 (PreBestX, PreBestY));
end
disp('最小值在点:');
BestX
BestY
disp( '最小值为:');
func2(BestX, BestY)
plot(trace(2:end))
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')

源自《智能优化算法及其MATLAB实例(第2版)》

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值