模拟退火算法

来源:互联网 发布:滨海网络电视台 编辑:程序博客网 时间:2024/06/07 02:28

模拟退火算法

模拟退火简单解释:

   为了找出地球上最高的山,一群兔子们开始想办法用酒把自己灌醉,它们随机地跳了很长时间。在这期间,它们可能走向高处,也可能踏入平地。但是,随着时间的流逝,它们渐渐清醒,并朝着最高的方向跳去,最后就到达了珠穆朗玛峰。   所谓的退火是指将固体加热到足够高的温度,使分子呈现随机排列状态,然后逐步降温使之冷却,最后分子在以低能状态排列,固体达到某种稳定状态。

重要理解:

假设材料在状态之下的能量为,那么材料在温度时从状态进入状态就遵循如下规律:

如果,则状态转移以如下的概率被接受:
其中,是物理学中的玻尔兹曼常数,是材料温度。

算法关键参数和操作的设定:

   从算法的流程上看,模拟退火算法包括三函数、两准则,即状态产生函数、状态接受函数、温度更新函数、内循环终止准则和外循环终止准则,这些环节的设计将决定模拟退火算法的优化性能。此外,初温的选择对模拟退火算法性能也有很大的影响。

状态产生函数:

   原则:设计状态产生函数(领域函数)的出发点应该是尽可能保证产生的候选解遍布全部的解空间。通常,状态产生函数由两部分组成,即产生候选解的方式和候选解吃剩的概率分布。   方法:在当前状态下的领域结构内以一定的概率方式(均匀分布、正态分布、指数分布等)产生

状态接受函数:

   原则:函数一般以概率的方式给出,不同接受函数的差别主要在于接受概率的形式不同。设计状态接受概率,应该遵循以下原则:

1)在固定温度下,接受使目标函数下降的候选解的概率要大于使目标函数上升的候选解的概率;
2)随温度的下降,接受目标函数上升的解的概率要逐渐减少;
3)当温度趋于零时,只能接受目标函数下降的解。方法:状态接受函数的引入是模拟退火算法实现全局搜索的最关键的因素,模拟退火算法中通常用作为状态接受函数。

初始温度、温度更新函数、内循环终止准则和外循环终止准则通常被称为退火历程。

初始温度:

    原则:通过理论分析可以得到初温的解析式,但解决实际问题难以得到精确的参数;实际应用往往要让初温充分大。实验表明:初温越大,获得高质量解的机率越大,但花费较多的计算时间。

方法:
(1)均匀抽样一组状态,以各状态目标值的方差为初温;
(2)随机产生一组状态,确定两两状态间的最大目标差值,根据差值,利用一定的函数确定初温,譬如 ,其中为初始接受函数;
(3)利用经验公式。

温度更新函数:

 温度更新函数,即温度下降方式,用于在啊外循环中修改温度值。

内循环终止准则:

常用的Metropolis抽样准则:
1)检验目标函数的均值是否稳定;
2)连续若干步的目标值变化较小;
3)按一定步数抽样。

外循环终止准则:

 1)设置终止温度的阈值; 2)设置外循环迭代次数; 3)算法搜索到的最优值连续若干步保持不变; 4)概率分析方法。

以下是实例程序:

1.main.m 文件  2.zuobiao=[0.37 0.75 0.45 0.76 0.71 0.07 0.42 0.59 0.32 0.6 0.3 0.67 0.62 0.67 0.20 ...  3.0.35 0.27 0.94 0.82 0.37 0.61 0.42 0.6 0.39 0.53 0.4 0.63 0.5 0.98 0.68;  4.0.91 0.87 0.85 0.75 0.72 0.74 0.71 0.69 0.64 0.64 0.59 0.59 0.55 0.55 0.5.. 5.0.45 0.43 0.42 0.38 0.27 0.26 0.25 0.23 0.19 0.19 0.13 0.08 0.04 0.02 0.85] 6.plot(zuobiao(1,:),zuobiao(2,:),'g*'),hold on  7.plot(zuobiao(1,:),zuobiao(2,:))  8.length=max(size(zuobiao));  9.%求初始距离..  10.  11.zhixu=randperm(length);  %随机生成一个路线经过点的顺序  12.temp=zuobiao(1,:);  13.newzuobiao(1,:)=temp(zhixu);  14.temp=zuobiao(2,:);  15.newzuobiao(2,:)=temp(zhixu);  16.newzuobiao;  17.f=juli(newzuobiao);  18.   19.%参数定义区--------------------------------------  20.%初始温度为10000  21.tmax=100;  22.tmin=0.001;  23.%温度下降速率  24.down=0.95;  25.    26.%退火算法的函数..  27.figure  28.t=tmax;  29.while t>tmin    30.    for n=1:500  31.        newzuobiao=newpath(zuobiao,length);  32.        newf=juli(newzuobiao);  33.        if newf<f  34.           zuobiao=newzuobiao;  35.           f=newf;  36.        elseif   rand<exp(-(newf-f)/t)  37.           zuobiao=newzuobiao;  38.           f=newf;  39.        end  40.    end  41.    huatu=[zuobiao,zuobiao(:,1)];  42.    plot(huatu(1,:),huatu(2,:)),hold on  43.    plot(huatu(1,:),huatu(2,:),'ro'),hold off  44.    pause(0.00001);  45.    t=t*down;  46.    f;  47.end  48.newpath.m 文件(随机的交换两个点的坐标)  49.function zuobiao=newpath(zuobiao,length)  50.%随机交换两个点的坐标..  51.a=ceil(rand(1,2)*length);  52.qian=a(1);  53.hou=a(2);  54.temp=zuobiao(:,qian);  55.zuobiao(:,qian)=zuobiao(:,hou);  56.zuobiao(:,hou)=temp; 57. 58.juli.m 文件(计算按某种方式围成的圈的总路程)  59.function lucheng=juli(zuobiao)  60.length=max(size(zuobiao));  61.s=0;  62.for i=2:length  63.    s=s+sqrt(sum((zuobiao(:,i)-zuobiao(:,i-1)).^2));  64.end  65.if length~=2  66.    s=s+sqrt(sum((zuobiao(:,1)-zuobiao(:,length)).^2));  67.end  68.    lucheng=s;  

程序运行结果如下:
这里写图片描述

0 0
原创粉丝点击