当前位置:   article > 正文

模拟退火——算法思想与实例

模拟退火——算法思想与实例

系列链接

        遗传算法讲解及实例

        差分进化算法讲解及实例

        模拟退火算法讲解及实例

定义

        模拟退火算法以优化问题求解过程与物理退火过程之间的相似性为基础,优化的目标函数相金属的内能,优化问题的自变量合状态空间相金属的内能状态空间,问题的求解过程就是找一个组合状态,使目标函数值最小。利用Metopolis算法并适当地控制温度的下降过程实现模拟退火,从而达到求解全局优化问题的目的

术语

                                  

算法思想

                                          

初始化

        首先是要选定一些参数,这些参数可以再代码注释中看到,数据的初始化常使用随机初始化

产生新解

        给当前某个解加上一部分产生一个新解,通常加上的为步长乘以一个区间内的随机数,需要判断新解是否仍在可行区间内,如果超出了区间,需要重新再计算一个新解,直到满足要求为止

新解保留

        系统从当前状态1到另一种状态2,能力从E1变化到E2,判断如果E2 < E1,则接受新解,反之可以一定概率接受新解:

                                      

        这里也可以反映出,模拟退火算法可以突出局部最优,趋向于全局最优

终止条件

        一般是温度低到阈值,也可以设置其他条件,比如误差低于1e-8则结束

例题

        求函数f(x,y) = 5cos(xy) + xy + y^3 的最小值, x ∈ [ -5, 5 ] y ∈ [-5,5 ]

        函数图像如下,具有多个局部最优点

                     

下边是模拟退火算法的计算结果:最小值 -152.0904

                    

代码

脚本1 —— 画图

  1. %%%%%%%%%f(x,y)=5*cos(x*y)+x*y+y^3%%%%%%%%%
  2. clear all; %清除所有变量
  3. close all; %清图
  4. clc; %清屏
  5. x=-5:0.02:5;
  6. y=-5:0.02:5;
  7. N=size(x,2);
  8. for i=1:N
  9. for j=1:N
  10. z(i,j)=5*cos(x(i)*y(j))+x(i)*y(j)+y(j)^3;
  11. end
  12. end
  13. mesh(x,y,z)
  14. xlabel('x')
  15. ylabel('y')

脚本2 —— 适应度评价函数

  1. %%%%%%%%%%%%%%%%%%%%%%%%%%%适应度函数%%%%%%%%%%%%%%%%%%%%%%%%%
  2. function value=func2(x,y)
  3. value=5*cos(x*y)+x*y+y*y*y;

标本3 —— 模拟退火算法

  1. %%%%%%%%%%%%%%%%%%%%%%模拟退火算法解决函数极值%%%%%%%%%%%%%%%%%%%%%%
  2. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3. clear all; %清除所有变量
  4. close all; %清图
  5. clc; %清屏
  6. XMAX= 5; %搜索变量x最大值
  7. XMIN= -5; %搜索变量x最小值
  8. YMAX= 5; %搜索变量y最大值
  9. YMIN= -5; %搜索变量y最小值
  10. %%%%%%%%%%%%%%%%%%%%%%%%%%%冷却表参数%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  11. L = 100; %马可夫链长度
  12. K = 0.99; %衰减参数
  13. S = 0.02; %步长因子
  14. T=100; %初始温度
  15. YZ = 1e-8; %容差
  16. P = 0; %Metropolis过程中总接受点
  17. %%%%%%%%%%%%%%%%%%%%%%%%%%随机选点 初值设定%%%%%%%%%%%%%%%%%%%%%%%%%
  18. PreX = rand * (XMAX-XMIN)+XMIN;
  19. PreY = rand * (YMAX-YMIN)+YMIN;
  20. PreBestX = PreX;
  21. PreBestY = PreY;
  22. PreX = rand * (XMAX-XMIN)+XMIN;
  23. PreY = rand * (YMAX-YMIN)+YMIN;
  24. BestX = PreX;
  25. BestY = PreY;
  26. %%%%%%%%%%%每迭代一次退火一次(降温), 直到满足迭代条件为止%%%%%%%%%%%%
  27. deta=abs( func2( BestX,BestY)-func2 (PreBestX, PreBestY));
  28. while (deta > YZ) && (T>0.001)
  29. T=K*T;
  30. %%%%%%%%%%%%%%%%%%%%%在当前温度T下迭代次数%%%%%%%%%%%%%%%%%%%%%%
  31. for i=1:L
  32. %%%%%%%%%%%%%%%%%在此点附近随机选下一点%%%%%%%%%%%%%%%%%%%%%
  33. p=0;
  34. while p==0
  35. NextX = PreX + S* (rand * (XMAX-XMIN)+XMIN);
  36. NextY = PreY + S*( rand * (YMAX-YMIN)+YMIN);
  37. if (NextX >= XMIN && NextX <= XMAX && NextY >=...
  38. YMIN && NextY <= YMAX)
  39. p=1;
  40. end
  41. end
  42. %%%%%%%%%%%%%%%%%%%%%%%是否全局最优解%%%%%%%%%%%%%%%%%%%%%%
  43. if (func2(BestX,BestY) > func2(NextX,NextY))
  44. %%%%%%%%%%%%%%%%%%保留上一个最优解%%%%%%%%%%%%%%%%%%%%%
  45. PreBestX = BestX;
  46. PreBestY = BestY;
  47. %%%%%%%%%%%%%%%%%%%此为新的最优解%%%%%%%%%%%%%%%%%%%%%
  48. BestX=NextX;
  49. BestY=NextY;
  50. end
  51. %%%%%%%%%%%%%%%%%%%%%%%% Metropolis过程%%%%%%%%%%%%%%%%%%%
  52. if( func2(PreX,PreY) - func2(NextX,NextY) > 0 )
  53. %%%%%%%%%%%%%%%%%%%%%%%接受新解%%%%%%%%%%%%%%%%%%%%%%%%
  54. PreX=NextX;
  55. PreY=NextY;
  56. P=P+1;
  57. else
  58. changer = -1*(func2(NextX,NextY)-func2(PreX,PreY))/ T ;
  59. p1=exp(changer);
  60. %%%%%%%%%%%%%%%%%%%%%%%%接受较差的解%%%%%%%%%%%%%%%%%%%%
  61. if p1 > rand
  62. PreX=NextX;
  63. PreY=NextY;
  64. P=P+1;
  65. end
  66. end
  67. trace(P+1)=func2(BestX, BestY);
  68. end
  69. deta=abs( func2( BestX,BestY)-func2 (PreBestX, PreBestY));
  70. end
  71. disp('最小值在点:');
  72. BestX
  73. BestY
  74. disp( '最小值为:');
  75. func2(BestX, BestY)
  76. plot(trace(2:end))
  77. xlabel('迭代次数')
  78. ylabel('目标函数值')
  79. title('适应度进化曲线')

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/469609
推荐阅读
相关标签
  

闽ICP备14008679号