当前位置:   article > 正文

Matlab 模拟退火算法模型代码

退火算法 matlab代码

o_%E7%A8%BF%E5%AE%9A%E8%AE%BE%E8%AE%A1%E5%AF%BC%E5%87%BA-20190912-220526.png

  1. function [best_solution,best_fit,iter] = mySa(solution,a,t0,tf,Markov)
  2. % 模拟退化算法
  3. % ===== 输入 ======%
  4. % solution 初始解
  5. % a 温度衰减系数 0.99
  6. % t0 初始温度 120
  7. % tf 最终温度 1
  8. % Markov 马尔科夫链长度 10000
  9. % ====== 输出 =====%
  10. % best_solution 最优解
  11. % best_fit 最优解目标值
  12. % iter 迭代次数
  13. n = length(solution);
  14. t = t0;
  15. solution_new = solution; % 初始解赋给最新的解
  16. best_fit = Inf; % 初始化最优适应度(最差的适应度)
  17. fit = Inf; % 初始化当前的适应度
  18. best_solution = solution; % 最优解
  19. iter = 1;
  20. % -----------------------迭代过程------------------------------------%
  21. while t >= tf
  22. for j = 1:Markov
  23. % -----------------------产生新解过程------------------------------------%
  24. %进行扰动,产生新的序列solution_new;
  25. if (rand < 0.7) % 概率小于0.7 采取交换两个数位置的方式产生新解
  26. ind1 = 0; ind2 = 0;
  27. while(ind1 == ind2 && ind1 >= ind2)
  28. ind1 = ceil(rand*n);
  29. ind2 = ceil(rand*n);
  30. end
  31. temp = solution_new(ind1);
  32. solution_new(ind1) = solution_new(ind2);
  33. solution_new(ind2) = temp;
  34. else % 概率大于等于0.7 采取成组交换连续三个数位置的方式产生新解
  35. ind = zeros(3,1);
  36. L_ind = length(unique(ind));
  37. while (L_ind < 3)
  38. ind = ceil([rand*n rand*n rand*n]);
  39. L_ind = length(unique(ind));
  40. end
  41. ind0 = sort(ind);
  42. a1 = ind0(1); b1 = ind0(2); c1 = ind0(3);
  43. solution0 = solution_new;
  44. solution0(a1:a1+c1-b1-1) = solution_new(b1+1:c1);
  45. solution0(a1+c1-b1:c1) = solution_new(a1:b1);
  46. solution_new = solution0;
  47. end
  48. % -----------------------计算适应度过程------------------------------------ %
  49. %计算适应度fit_new
  50. fit_new = myFitCal(solution_new);
  51. % -----------------------解的更新过程------------------------------------ %
  52. if fit_new < fit
  53. fit = fit_new;
  54. solution = solution_new;
  55. %对最优路线和距离更新
  56. if fit_new < best_fit
  57. iter = iter + 1;
  58. best_fit = fit_new;
  59. best_solution = solution_new;
  60. end
  61. else
  62. if rand < exp(-(fit_new-fit)/t)
  63. solution = solution_new;
  64. fit = fit_new;
  65. end
  66. end
  67. solution_new = solution;
  68. end
  69. t = t*a; %降温
  70. end

转载于:https://www.cnblogs.com/gshang/p/11515394.html

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号