模拟退火算法原理与算法包

 模拟退火算法的原理
http://www.cnblogs.com/heaad/archive/2010/12/20/1911614.html#!comments这篇博文讲的蛮好的,在这就不再累述了,只对具体算法中的基本概念进行较详细的解释

基本概念

  1. 目标函数
     目标函数即为待优化的函数,与固体退火过程中的内能类比。在调用函数simulannealbnd来使用现成的工具包时,需要将目标函数编写为M文件或inline函数
     需要注意的是,SAT是以求最小值为目标进行优化的。如果要求最大值,乘个-1就好了
  2. 温度
     当前解 x 类比固体退火过程中的温度 T 。温度一方面决定SA以多大的概率接受新解,另一方面,它也限制SA产生新解与当前解之间的距离,也即SA的搜索范围
     以多大概率接受新解在后面的Meteopolis准则中会有具体介绍,而限制SA的搜索范围这点可以这么理解:
     模拟退火算法是模拟固体的退火过程,实际过程中温度越高,单位时间内内能下降的就越快,对应的温度变化也就越大,而温度越低,单位时间内内能下降的就越慢,对应的温度变化也就越大。所以温度限制了SA的搜索范围

  3. 退火进度表
     退火进度表是指温度随着算法迭代的下降速度,退火过程越缓慢,SA找到全局最优解的机会就越大,对应的运行时间也会增加。退货进度表包括初始温度和温度更新函数等参数

  4. Meteopolis准则
     以 xi xi+1 代表旧解和新解,则SA接受新解的概率为

    P=1, f(xi+1)<f(xi)e[f(xi+1)f(xi)T], f(xi+1)f(xi)

     可以看出,开始温度较高,SA接受较差解的概率也相对较高,这使得SA有更大的机会跳出局部最优解,而随着退火过程的进行,温度整体呈下降趋势,SA接受较差解的概率变小

算法流程

  1. T=T0 ,随机生成一个对应的初始解 x0 ,并计算相应的目标函数 f(x0)
  2. T 等于冷却进度表中的下一个值 Ti
  3. 根据当前解 xi 进行扰动,产生一个新解 xj ,而后计算 Δf ,判断新解是否被接受
  4. 在温度 Ti 下,进行 Lk 次扰动和接受过程,即重复过程3和4
  5. 判断T是否已经达到 Tf ,若否,回到第2步

 所以它等于是个嵌套循环,类似于

for(float T=T_0;Tfor(int i=1;i<=L_k;i++)   //进行L_k次循环
        {
                //不断根据扰动过程更新x_i
    }
}

工具包使用

clear
clc

ObjectiveFunction = @my_first_SA;   % Function handle to the objective function
X0 = [2.5 2.5];   % Starting point
lb = [-5 -5];     % Lower bound
ub = [5 5];       % Upper bound

options = saoptimset('MaxIter',500,'StallIterLim',500,'TolFun',1e-100,'AnnealingFcn',@annealingfast,'InitialTemperature',100,'TemperatureFcn',@temperatureexp,'ReannealInterval',500,'PlotFcns',{@saplotbestx, @saplotbestf, @saplotx, @saplotf,@saplottemperature});

[x,fval] = simulannealbnd(ObjectiveFunction,X0,lb,ub,options);

 教程里只说了MaxIter代表最大迭代次数,InitialTemperature代表初始温度StallIterLim,TolFun,ReannealInterval这三个参数没有相应的解释,只说让StallIterLim等于最大迭代次数,并让TolFun取一个很小的值就可以保证迭代到500次时一定停止
 猜一下的话,难道TolFun是指终止温度?可能是根据初始温度与终止温度,根据给的迭代次数和温度变化函数,来确定那个退火进度表0 0

你可能感兴趣的:(智能算法)