模拟退火算法MATLAB

转载自:https://blog.csdn.net/pangel18/article/details/52349840

模拟退火用于处理最优化问题,可以求出当目标函数取得最小值时的决策变量的值。

在编写程序时需要根据具体问题设计算法,算法描述为:

(1)解空间(初始解)

(2)目标函数

(3)新解的产生
① 2 变换法

② 3 变换法

(4)代价函数差

(5)接受准则

(6)降温

(7)结束条件

下面MATLAB程序用于求解非线性规划:

min f(x)=x1^2+x2^2+8

st.

x1^2-x2>=0

-x1-x2^2+2=0

x1,x2>=0

[cpp]  view plain  copy
  1. clear  
  2. clc  
  3.   
  4. %生成初始解  
  5. sol_new2=1;%(1)解空间(初始解)  
  6. sol_new1=2-sol_new2^2;  
  7. sol_current1 = sol_new1;   
  8. sol_best1 = sol_new1;  
  9. sol_current2 = sol_new2;   
  10. sol_best2 = sol_new2;  
  11. E_current = inf;  
  12. E_best = inf;  
  13.   
  14. rand('state',sum(clock)); %初始化随机数发生器  
  15. t=90; %初始温度  
  16. tf=89.9; %结束温度  
  17. a = 0.99; %温度下降比例  
  18.   
  19. while t>=tf%(7)结束条件  
  20.     for r=1:1000 %退火次数  
  21.           
  22.         %产生随机扰动(3)新解的产生  
  23.         sol_new2=sol_new2+rand*0.2;  
  24.         sol_new1=2-sol_new2^2;  
  25.           
  26.         %检查是否满足约束  
  27.         if sol_new1^2-sol_new2>=0 && -sol_new1-sol_new2^2+2==0 && sol_new1>=0 &&sol_new2>=0  
  28.         else  
  29.             sol_new2=rand*2;  
  30.             sol_new1=2-sol_new2^2;  
  31.             continue;  
  32.         end  
  33.           
  34.         %退火过程  
  35.         E_new=sol_new1^2+sol_new2^2+8;%(2)目标函数  
  36.         if E_new<E_current%(5)接受准则  
  37.                 E_current=E_new;  
  38.                 sol_current1=sol_new1;  
  39.                 sol_current2=sol_new2;  
  40.                 if E_new<E_best  
  41.                     %把冷却过程中最好的解保存下来  
  42.                     E_best=E_new;  
  43.                     sol_best1=sol_new1;  
  44.                     sol_best2=sol_new2;  
  45.                 end  
  46.         else  
  47.                 if rand<exp(-(E_new-E_current)/t)%(4)代价函数差  
  48.                     E_current=E_new;  
  49.                     sol_current1=sol_new1;  
  50.                     sol_current2=sol_new2;  
  51.                 else  
  52.                     sol_new1=sol_current1;  
  53.                     sol_new2=sol_current2;  
  54.                 end  
  55.         end  
  56.         plot(r,E_best,'*')  
  57.         hold on  
  58.     end  
  59.     t=t*a;%(6)降温  
  60. end  
  61.   
  62. disp('最优解为:')  
  63. disp(sol_best1)  
  64. disp(sol_best2)  
  65. disp('目标表达式的最小值等于:')  
  66. disp(E_best)  

[cpp]  view plain  copy
  1. 最优解为:  
  2.     1.0038  
  3.   
  4.     0.9981  
  5.   
  6. 目标表达式的最小值等于:  
  7.    10.0038  

司守奎的算法大全给出了利用模拟退火求解TSP问题的MATLAB算法:

[cpp]  view plain  copy
  1. clc,clear  
  2. load sj.txt %加载敌方100 个目标的数据,数据按照表格中的位置保存在纯文本  
  3. 文件sj.txt 中  
  4. x=sj(:,1:2:8);x=x(:);  
  5. y=sj(:,2:2:8);y=y(:);  
  6. sj=[x y];  
  7. d1=[70,40];  
  8. sj=[d1;sj;d1];  
  9. sj=sj*pi/180;  
  10. %距离矩阵d  
  11. d=zeros(102);  
  12. for i=1:101  
  13. for j=i+1:102  
  14. temp=cos(sj(i,1)-sj(j,1))*cos(sj(i,2))*cos(sj(j,2))+sin(sj(i,2))*sin(sj(j,2));  
  15. d(i,j)=6370*acos(temp);  
  16. end  
  17. end  
  18. d=d+d';  
  19. S0=[];Sum=inf;  
  20. rand('state',sum(clock));  
  21. for j=1:1000  
  22. S=[1 1+randperm(100),102];  
  23. temp=0;  
  24. -276-  
  25. for i=1:101  
  26. temp=temp+d(S(i),S(i+1));  
  27. end  
  28. if temp<Sum  
  29. S0=S;Sum=temp;  
  30. end  
  31. end  
  32. e=0.1^30;L=20000;at=0.999;T=1;  
  33. %退火过程  
  34. for k=1:L  
  35. %产生新解  
  36. c=2+floor(100*rand(1,2));  
  37. c=sort(c);  
  38. c1=c(1);c2=c(2);  
  39. %计算代价函数值  
  40. 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));  
  41. %接受准则  
  42. if df<0  
  43. S0=[S0(1:c1-1),S0(c2:-1:c1),S0(c2+1:102)];  
  44. Sum=Sum+df;  
  45. elseif exp(-df/T)>rand(1)  
  46. S0=[S0(1:c1-1),S0(c2:-1:c1),S0(c2+1:102)];  
  47. Sum=Sum+df;  
  48. end  
  49. T=T*at;  
  50. if T<e  
  51. break;  
  52. end  
  53. end  
  54. % 输出巡航路径及路径长度  
  55. S0,Sum  

猜你喜欢

转载自blog.csdn.net/xuxinrk/article/details/80231794