1 模拟退火算法的应用背景
模拟退火算法提出于1982年。Kirkpatrick等人首先意识到固体退火过程与优化问题之间存在着类似性;Metropolis等人对固体在恒定温度下达到热平衡过程的模拟也给他们以启迪。通过把Metropolis 算法引入到优化过程中,最终得到一种对 Metropolis 算法进行迭代的优化算法,这种算法类似固体退火过程,称之为“模拟退火算法”。
模拟退火算法是一种适合求解大规模组合优化问题的随机搜索算法。目前,模拟退火算法在求解 TSP,VLSI 电路设计等组合优化问题上取得了令人满意的结果。将模拟退火算法同其它的计算智能方法相结合,应用到各类复杂系统的建模和优化问题中也得到了越来越多的重视,已经逐渐成为一种重要的发展方向。
2 模拟退火算法介绍
在这里插入图片描述
3
在这里插入图片描述
在这里插入图片描述
3 模拟退火算法的参数
模拟退火是一种优化算法,它本身是不能独立存在的,需要有一个应用场合,其中温度就是模拟退火需要优化的参数,如果它应用到了聚类分析中,那么就是说聚类分析中有某个或者某几个参数需要优化,而这个参数,或者参数集就是温度所代表的。它可以是某项指标,某项关联度,某个距离等等。

  1. %% 基于模拟退火算法优化BP神经网络的汇率预测
  2. clear all
  3. clc
  4. warning off
  5. %% 导入数据
  6. load exchange_rate.mat
  7. x = [];
  8. y = [];
  9. tr_len = 800;
  10. num_input = 10;
  11. for i = 1:length(X)-num_input
  12. x = [x; X(i:i+num_input-1)];
  13. y = [y; X(i+num_input)];
  14. end
  15. %训练集——800个样本
  16. input_train = x(1:tr_len, :)\';
  17. output_train = y(1:tr_len)\';
  18. %测试集——52个样本
  19. input_test = x(tr_len+1:end, :)\';
  20. output_test = y(tr_len+1:end)\';
  21. %% BP网络设置
  22. %节点个数
  23. [inputnum,N]=size(input_train);%输入节点数量
  24. outputnum=size(output_train,1);%输出节点数量
  25. hiddennum=5;
  26. %选连样本输入输出数据归一化
  27. [inputn,inputps]=mapminmax(input_train,0,1);
  28. %构建网络
  29. net=newff(inputn,output_train,hiddennum);
  30. %% SA算法参数初始化
  31. nvar=inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum;
  32. [outputn outputps]=mapminmax(output_train,0,1);% 归一化到【0 1】之间
  33. %% SA算法主程序
  34. lb=-1*ones(nvar,1); % 参数取值下界
  35. ub=ones(nvar,1); % 参数取值上界
  36. % 冷却表参数
  37. MarkovLength=10; % 马可夫链长度
  38. DecayScale=0.85; % 衰减参数
  39. StepFactor=0.2; % Metropolis步长因子
  40. Temperature0=8; % 初始温度
  41. Temperatureend=3; % 最终温度
  42. Boltzmann_con=1; % Boltzmann常数
  43. AcceptPoints=0.0; % Metropolis过程中总接受点
  44. % 随机初始化参数
  45. range=ub-lb;
  46. Par_cur=rand(size(lb)).*range+lb; % Par_cur表示当前解
  47. Par_best_cur=Par_cur; % Par_best_cur表示当前最优解
  48. Par_best=rand(size(lb)).*range+lb; % Par_best表示冷却中的最好解
  49. % 每迭代一次退火(降温)一次,直到满足迭代条件为止
  50. t=Temperature0;
  51. itr_num=0; % 记录迭代次数
  52. while t>Temperatureend
  53. itr_num=itr_num+1;
  54. itr_num
  55. t=DecayScale*t; % 温度更新(降温)
  56. for i=1:MarkovLength
  57. % 在此当前参数点附近随机选下一点
  58. p=0;
  59. while p==0
  60. Par_new=Par_cur+StepFactor.*range.*(rand(size(lb))-0.5);
  61. % 防止越界
  62. if sum(Par_new>ub)+sum(Par_new<lb)==0
  63. p=1;
  64. end
  65. end
  66. % 检验当前解是否为全局最优解
  67. if (objfun_BP(Par_best,inputnum,hiddennum,outputnum,net,inputn,outputn)>...
  68. objfun_BP(Par_new,inputnum,hiddennum,outputnum,net,inputn,outputn))
  69. % 保留上一个最优解
  70. Par_best_cur=Par_best;
  71. % 此为新的最优解
  72. Par_best=Par_new;
  73. end
  74. % Metropolis过程
  75. if (objfun_BP(Par_cur,inputnum,hiddennum,outputnum,net,inputn,outputn)-...
  76. objfun_BP(Par_new,inputnum,hiddennum,outputnum,net,inputn,outputn)>0)
  77. % 接受新解
  78. Par_cur=Par_new;
  79. AcceptPoints=AcceptPoints+1;
  80. else
  81. changer=-1*(objfun_BP(Par_new,inputnum,hiddennum,outputnum,net,inputn,outputn)...
  82. -objfun_BP(Par_cur,inputnum,hiddennum,outputnum,net,inputn,outputn))/Boltzmann_con*Temperature0;
  83. p1=exp(changer);
  84. if p1>rand
  85. Par_cur=Par_new;
  86. AcceptPoints=AcceptPoints+1;
  87. end
  88. end
  89. end
  90. end
  91. %% 结果显示
  92. x=Par_best\';
  93. %% 把最优初始阀值权值赋予网络预测
  94. % %用遗传算法优化的BP网络进行值预测
  95. w1=x(1:inputnum*hiddennum);
  96. B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
  97. w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
  98. B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);
  99. net.iw{1,1}=reshape(w1,hiddennum,inputnum);
  100. net.lw{2,1}=reshape(w2,outputnum,hiddennum);
  101. net.b{1}=reshape(B1,hiddennum,1);
  102. net.b{2}=B2;
  103. %% BP网络训练
  104. %网络进化参数
  105. net.trainParam.epochs=100;
  106. net.trainParam.lr=0.1;
  107. net.trainParam.mc = 0.8;%动量系数,[0 1]之间
  108. net.trainParam.goal=0.001;
  109. %网络训练
  110. net=train(net,inputn,outputn);
  111. %网络训练
  112. net=train(net,inputn,outputn);
  113. %% BP训练集预测
  114. BP_sim=sim(net,inputn);
  115. %网络输出反归一化
  116. T_sim=mapminmax(\'reverse\',BP_sim,outputps);
  117. %
  118. figure
  119. plot(1:length(output_train),output_train,\'b-\',\'linewidth\',1)
  120. hold on
  121. plot(1:length(T_sim),T_sim,\'r-.\',\'linewidth\',1)
  122. axis tight
  123. xlabel(\'训练样本\',\'FontSize\',12);
  124. ylabel(\'汇率\',\'FontSize\',12);
  125. legend(\'实际值\',\'预测值\');
  126. string={\'SA-BP预测\'}
  127. title(string);
  128. % %% 测试数据归一化
  129. inputn_test=mapminmax(\'apply\',input_test,inputps);
  130. % %预测输出
  131. an=sim(net,inputn_test);
  132. BPsim=mapminmax(\'reverse\',an,outputps);
  133. figure
  134. plot(1:length(output_test), output_test,\'b-\',\'linewidth\',1)
  135. hold on

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

版本:2014a

版权声明:本文为matlabxiao原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/matlabxiao/p/15051421.html