数学建模(4)——模拟退火

来源:互联网 发布:豆人网络战争前线 编辑:程序博客网 时间:2024/05/21 22:34

以寻找最小值的优化问题为例
例题题目查看

%此处代码为获得距离矩阵d后得到初始解部分d=d+d'; S0=[];Sum=inf; rand('state',sum(clock)); for j=1:1000     %先使用 Monte Carlo 方法求得一个较好的初始解    S=[1 1+randperm(100),102];         temp=0;    for i=1:101                 temp=temp+d(S(i),S(i+1));         end    if temp<Sum                 S0=S;Sum=temp;         endend
%退火过程 e=0.1^30;%终止温度L=20000;at=0.999;%降温系数T=1; for k=1:L    %产生新解     %2变换法    c=2+floor(100*rand(1,2)); %产生2个1~100间的随机数    c=sort(c);     c1=c(1);      c2=c(2);      %计算代价函数值       df=d(S0(c1-1),S0(c2))+d(S0(c1),S0(c2+1))-d(S0(c1-1),S0(c1))-d(S0(c2),S0(c2+1));    %df为路径差       if df<0   %接受新路径        S0=[S0(1:c1-1),S0(c2:-1:c1),S0(c2+1:102)];                 Sum=Sum+df;       elseif exp(-df/T)>rand(1)   %以概率接受新的路        S0=[S0(1:c1-1),S0(c2:-1:c1),S0(c2+1:102)];           Sum=Sum+df;       end    T=T*at;    %降温    if T<e      %结束条件          break;        endend% 输出巡航路径及路径长度 S0,Sum

思路解释

思路描述