遗传算法是一种基于概率的鲁棒性很强的随机化全局搜索技术,其搜索过程具有一定的方向性,能够有效克服未成熟收敛。1975年由美国的J.Holland教授提出,之后DeJong将其用于最优化问题。遗传算法是一种借鉴生物界自然选择和遗传机制的高度并行、随机、自适应的全局优化概率搜索算法。具有直接对结构对象进行操作,不存在求导和函数连续性限定等特点;具有内在的隐并行性,和更好的全局寻优能力。遗传算法采用了概率化的寻优方法,能够自动获取和指导优化的搜索空间,自适应地调整搜索方向,无需确定的规则。正因如此,遗传算法已被人们广泛地应用于组合优化、机器学习、信号处理、自适应控制和人工生命等领域,国内外都非常重视遗传算法的理论和应用研究,并取得了令人瞩目的进展,遗传算法的应用成果已渗入到许多领域。

下面将举两个函数例子来解释如何利用遗传算法解决实际的函数优化问题。

1. 目标函数

本次目的是寻找这两个函数的最小值,其中n=2。首先通过Matlab画出了两个函数的三维图像,便于更加直观的观察出函数值的分布。

从图中可以看出:尽管目标函数表达式各不相同,但它们的三维图都有一个共同点,就是存在多个局部最优解,整个算法就是经过多次迭代得到最优解,整个过程要跳出局部最优解得到最后的全局最优解。

2.算法流程

算法流程如下图所示:

解决目标函数的最优解问题所采取的遗传算法流程如图3所示,其具体的实现过程分为以下几个步骤:

Step1:随机产生初始种群,种群大小为Popsize,Length为一个染色体长度(编码长度),种群记为Population

   Step2:将二进制染色体转化为十进制数,并计算当代种群个体的适应度值。

   Step3:找出当代中的最优个体和最优适应度值,并从当代种群Population进行选择运算,该算法采用了轮盘du选择算法,选择函数为Selecfun。选择后的种群记为Sel_popul。

   Step4:对种群Sel_popul进行交叉,交叉采用的是自适应的双点交叉,然后再进行变异。

   Step5:求出变异后的最优适应度值以及对应的最优个体与Step3中的最优个体进行比较,如果变异后的最优适应度值大于Step3中的最优适应度值,则不做改变,如果变异后的最优适应度值小于Step3中的最优适应度值,则将变异后的最差适应度值对应的个体由Step3中选出的最优个体替换,即最优保存策略。

Step6:若循环次数大于最大迭代次数,输出统计结果,如收敛曲线等,整个算法终止,否则,将返回到step2

3.寻优结果

将程序重复运行10次,每次遗传迭代次数为50次,然后从10个结果中找出目标函数值最小的点及其个体的坐标作为最佳目标函数值和最优个体,然后对10个目标函数值求方差,计算10次运行结果的差异大小。具体仿真参数如表1所示,最后将得到的数据统计结果如表2所示。


由仿真结果可以看出,函数的目标函数值的方差较小,说明函数已经接近最优值,而函数的目标函数值的方差较大,说明还没有很好地收敛,所以必须要加大迭代次数使其最佳目标值更加精确。

将程序重复运行10次,每次遗传迭代次数为80次,其仿真参数如下表3所示:

从表2和表4可以看出,当迭代次数为80次时,目标函数值方差明显都有所减小,但还可进一步优化。因此,可以继续加大迭代次数从而达到更好的收敛效果。

继续增加迭代次数,观察仿真结果。仿真参数见表5,寻优结果统计见表6

将程序重复运行10次,每次遗传迭代次数为100次,其仿真统计结果如表6所示:


从表2、表4和表6可以看出,随着迭代次数的增加,目标函数值的方差均逐渐接近0,也就是说多次运行的最佳目标函数值大致相等,即运行的结果基本都在真实最优值附近。

并且,从表6可以看出,在迭代次数为100次时,目标函数的方差非常接近0,而函数的方差值则仍较大。可以预见,随着迭代次数的进一步增加,函数的方差值也将趋近于0。但是,随着迭代次数的增加,运行的时间也逐渐变长。因此,在实际使用中,应折中考虑运行效果与运行时间的关系,合理分配时间与硬件资源。

4. Matlab方式实现遗传算法的主程序代码

  1. 1.       %%%%%%%%%%%%%本程序为遗传算法实现主程序%%%%%%%%%%%%%%%  

  2. 2.       %设定n=2,即优化函数为:f1 f2 中的一个  

  3. 3.       双变量时,染色体长度34。前17x,后17y  

  4. 4.       采用轮盘选择  

  5. 5.       clear; close all;  

  6. 6.         

  7. 7.       global popsize chromlength func_choose  

  8. 8.       popsize=100;                                                    %群体大小  

  9. 9.       chromlength=34;                                             %个体长度  

  10. 10.   pc=0.7;                                                                %交叉概率  

  11. 11.   pm=0.02;                                                            %变异概率  

  12. 12.   rec_time=50;                                                     %迭代次数  

  13. 13.   func_choose = 1;                                               % func_choose取值为1 2,分别代表函数f1 f2  

  14. 14.     

  15. 15.   pop=initpop(popsize,chromlength);         %随机产生初始群体  

  16. 16.   for i=1:rec_time  

  17. 17.       [objvalue]=calobjvalue(pop);                  %计算目标函数  

  18. 18.       fitvalue=calfitvalue(objvalue);                 %计算群体中每个个体的适应度  

  19. 19.       [newpop]=selection(pop,fitvalue);        %复制  

  20. 20.       [newpop]=crossover(newpop,pc);        %交叉  

  21. 21.       pm=pm+i/1000;                                          %迭代次数增加有利于跳出局部最优的情况  

  22. 22.       [newpop]=mutation(newpop,pm);        %变异  

  23. 23.       pop=newpop;  

  24. 24.       [objvalue]=calobjvalue(pop);                  %计算目标函数值  

  25. 25.       fitvalue=calfitvalue(objvalue);                %计算群体中每个个体的适应度  

  26. 26.       [bestindividual,bestfit,cx]=best(pop,fitvalue);          %找出群体中适应值最大的个体及其适应值  

  27. 27.       [worstindividual,worstfit,wx]=worst(pop,fitvalue); %找出群体中适应值最小的个体及其适应值  

  28. 28.       f(i)=bestfit;                                                    %取出历代最优解对应的适应度值放入f数列  

  29. 29.       keep(i,:)=bestindividual;                           %取出历代最优解放入keep矩阵  

  30. 30.       [fm wz]=max(f);  

  31. 31.       bestindividual=keep(wz,:);                       %取出keep矩阵中的适应度值最优的解,即史上最优解  

  32. 32.       n(i)=i;  

  33. 33.       pop5=bestindividual;  

  34. 34.       pop(wx,:)=pop5;                                          %用史上最优解替代第i次迭代中最差的个体  

  35. 35.         

  36. 36.       if func_choose == 1  

  37. 37.           x1(i)=-500+decodechrom(pop5,1,chromlength/2)*1000/(2^(chromlength/2)-1);    

  38. 38.           x2(i)=-500+decodechrom(pop5,chromlength/2+1,chromlength/2)*1000/(2^(chromlength/2)-1);   

  39. 39.       else                                                                  %默认选择f2(x)  

  40. 40.           x1(i)=-500+decodechrom(pop5,1,chromlength/2)*1000/(2^(chromlength/2)-1);      

  41. 41.           x2(i)=-500+decodechrom(pop5,chromlength/2+1,chromlength/2)*1000/(2^(chromlength/2)-1);   

  42. 42.       end  

  43. 43.         

  44. 44.       y=myfun(x1,x2);  

  45. 45.   end  

  46. 46.   [yy index]=min(y);                                          %计算函数最小值及其位置  

  47. 47.   Y=yy;  

  48. 48.   X1=x1(index);                                                   %计算最小值时x1对应的值  

  49. 49.   X2=x2(index);                                                   %计算最小值时x2对应的值  

  50. 50.     

  51. 51.   figure                                                                   %收敛曲线作图  

  52. 52.   plot(y, 'r');  

  53. 53.   title(['函数f(',num2str(func_choose),')的收敛曲线']);  

  54. 54.   xlabel('t/代数');ylabel('目标函数值');  

  55. 55.   grid on;  

  56. 56.     

  57. 57.   %%%%%%%%%%%%对于最优化得到的函数值及变量值的显示%%%%%%%%%%  

  58. 58.   disp([num2str(X1), '  ', num2str(X2), '  ', num2str(Y)]);  

 参考文献

[1]  Abdelsalam AM, El-Shorbagy MA. Optimization of windturbines siting in a wind farm using genetic algorithm based local search[J]. RenewableEnergy,2018,123(8):748755.

[2]  康彩丽. 遗传算法优化BP神经网络非线性函数拟合的研究[J].忻州师范学院学报,2019,35(05):22-25.

[3]  Moeini A, Zargarabadi MR.Geneticalgorithm optimization of film cooling effectiveness over a rotating blade[J].InternationalJournal of Thermal Sciences,2018,125(3):248-255.

[4]  王雪峰. 用于函数优化问题的实数编码遗传算法的改进及并行化实现[D].河北大学,2019.

[5]    Moussa M, Hmila M, Douik A.A novel facerecognition approach based on genetic algorithm optimization[J].Studies inInformatics&Control,2018,27(1):127134.



©著作权归作者所有:来自51CTO博客作者mob604756f3c518的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 基于密度的聚类算法——DBSCAN算法
  2. 机器学习算法之BIRCH
  3. 基于几种分类算法的帕金森数据分类
  4. 3-23(类与对象终结)
  5. EM-EKF参数估计算法
  6. “手撕”BP算法——使用MATLAB搭建简单的神经网络(附代码)
  7. 聚类分析算法对文本分类之分词和构建词袋模型
  8. 练习2-10 计算分段函数[1] (10分)
  9. 算法的秘密+

随机推荐

  1. golang语言的出现解决了什么问题
  2. golang如何创建map
  3. golang有什么用途?
  4. golang怎么截获错误
  5. golang如何导入包
  6. golang Web框架有哪些?
  7. golang的框架有哪些
  8. golang如何获取当前时间的前几天
  9. golang的函数怎么写
  10. golang实现生成不重复随机数