数学建模--模拟退火算法

模拟退火

文章目录

      • 模拟退火
          • 算法简介
          • 算法应用

参考资料:司守奎《数学建模算法与应用》

算法简介

模拟退火算法得益于材料统计力学的研究成果。统计力学表明材料中粒子的不同结构对应于粒子的不同能量水平。在高温条件下,粒子的能量较高,可以自由运动和重新排列。在低温条件下,粒子能量较低。如果从高温开始,非常缓慢地降温(这个过程被称为退火),粒子就可以在每个温度下达到热平衡。当系统完全被冷却时,最终形成处于低能状态的晶体。

数学建模--模拟退火算法_第1张图片

为什么E(j)>E(i)的情况下还要继续呢

因为有时候我们找到的可能只是局部最优解,而不是全局最优解,所以还需要继续下去
数学建模--模拟退火算法_第2张图片
如图所示,例如我们要寻找最小值,如果在此刻停止的话,找到的只是局部最小值,而不是全局的

三个注意点

  1. 理论上,降温过程要足够缓慢,要使得在每一温度下达到热平衡。但在计算机实现中,如果降温速度过缓,所得到的解的性能会较为令人满意,但是算法会太慢,相对于简单的搜索算法不具有明显优势。如果降温速度过快,很可能最终得不到全局最优解。因此使用时要综合考虑解的性能和算法速度,在两者之间采取一种折衷

  2. 要确定在每一温度下状态转换的结束准则。实际操作可以考虑当连续m次的转换过程没有使状态发生变化时结束该温度下的状态转换。最终温度的确定可以提前定为一个较小的值 T e T{_e} Te,或连续几个温度下转换过程没有使状态发生变化算法就结束。

  3. 选择初始温度和确定某个可行解的邻域的方法也要恰当

算法应用

已知100个目标的经度、纬度如2.1所示。我方有一个基地,经度和纬度为(70,40)。假设我方飞机的速度为1000公里/小时。我方派一架飞机从基地出发,侦察完所有目标,再返回原来的基地。在每一目标点的侦察时间不计,求该架飞机所花费的时间(假设我方飞机巡航时间可以充分长)

这是一个旅行商问题。给我方基地编号为1,目标依次编号为2,3,…,101,最后我方基地再重复编号为102(这样便于程序中计算)

clc, clear, close all
sj0=load('data12_1.txt');
x=sj0(:,1:2:8); x=x(:);
y=sj0(:,2:2:8); y=y(:);
sj=[x y]; d1=[70,40];  %d1是起始点
xy=[d1;sj;d1]; sj=xy*pi/180; %角度化成弧度
d=zeros(102); %距离矩阵d初始化
%计算两地的实际距离
for i=1:101
   for j=i+1:102
       d(i,j)=6370*acos(cos(sj(i,1)-sj(j,1))*cos(sj(i,2))*...
           cos(sj(j,2))+sin(sj(i,2))*sin(sj(j,2)));
   end
end
d=d+d'; %上面循环求得的是下三角矩阵,要把它补全(i到j和j到i的距离是一样的)
path=[];long=inf; %巡航路径及长度初始化正无穷
for j=1:1000  %求较好的初始解,randperm是随机全排列
    path0=[1 1+randperm(100),102]; temp=0;
    for i=1:101
        temp=temp+d(path0(i),path0(i+1));
    end
    if temp<long
        path=path0; long=temp;
    end
end
e=0.1^30;L=20000;at=0.999;T=1;%%e是退出条件,L是最多循环次数,at是降温系数,T是初始温度
for k=1:L  %退火过程
    c=2+floor(100*rand(1,2));  %产生新解,两个随机数范围是[2,101]
    c=sort(c); c1=c(1);c2=c(2); %排序,小的在前,大的在后
    %计算代价函数值的增量
    df=d(path(c1-1),path(c2))+d(path(c1),path(c2+1))-...
        d(path(c1-1),path(c1))-d(path(c2),path(c2+1));
    if df<0 %接受准则
        path=[path(1:c1-1),path(c2:-1:c1),path(c2+1:102)]; 
        long=long+df;
    elseif exp(-df/T)>=rand  %这里用到了T
        path=[path(1:c1-1),path(c2:-1:c1),path(c2+1:102)]; 
        long=long+df;
    end
    T=T*at; %温度变化
    if T<e
        break;
    end
end
path; long; % 输出巡航路径及路径长度
xx=xy(path,1); yy=xy(path,2);
plot(xx,yy,'-*') %画出巡航路径


数学建模--模拟退火算法_第3张图片

可以多运行几次,比较结果,求得最优解

你可能感兴趣的:(数学建模,模拟退火算法,算法)