MATLAB机器学习系列-10:遗传算法原理及其matlab遗传算法工具箱使用

分手后的思念是犯贱 2022-11-21 11:28 1490阅读 0赞

遗传算法原理

基本思想

  • 遗传算法(Genetic Algorithm,GA)是一种进化算法,其基本原理是仿效生物界中的“物竞天择、适者生存”的演化法则,它最初由美国Michigan大学的J. Holland教授于1967年提出。
  • 遗传算法是从代表问题可能潜在的解集的一个种群(population)开始的,而一个种群则由经过基因(gene)编码的一定数目的个体(individual)组成。因此,第一步需要实现从表现型到基因型的映射即编码工作。初代种群产生之后,按照适者生存和优胜劣汰的原理,逐代(generation)演化产生出越来越好的近似解,在每一代,根据问题域中个体的适应度(fitness)大小选择个体,幵借助于自然遗传学的遗传算子(genetic operators)进行组合交叉和变异,产生出代表新的解集的种群。这个过程将导致种群像自然进化一样,后生代种群比前代更加适应于环境,末代种群中的最优个体经过解码(decoding),可以作为问题近似最优解。

遗传算法有三个基本操作:选择(Selection)、交叉(Crossover)和变异(Mutation)。

  • 选择。选择的目的是为了从当前群体中选出优良的个体,使它们有机会作为父代为下一代繁衍子孙。根据各个个体的适应度值,按照一定的规则或方法从上一代群体中选择出一些优良的个体遗传到下一代种群中。选择的依据是适应性强的个体为下一代贡献一个或多个后代的概率大。
  • 交叉。通过交叉操作可以得到新一代个体,新个体组合了父辈个体的特性。将群体中的各个个体随机搭配成对,对每一个个体,以交叉概率交换它们之间的部分染色体。
  • 变异。对种群中的每一个个体,以变异概率改变某一个或多个基因座上的基因值为其他的等位基因。同生物界中一样,变异发生的概率很低,变异为新个体的产生提供了机会。

基本步骤
20201101093441928.png_pic_center

  1. 编码:GA在进行搜索之前先将解空间的解数据表示成遗传空间的基因型串结构数据,这些串结构数据的丌同组合便构成了不同的点。
  2. 初始群体的生成:随机产生N个初始串结构数据,每个串结构数据称为一个个体,N个个体构成了一个群体。GA以这N个串结构数据作为初始点开始进化。
  3. 适应度评估:适应度表明个体或解的优劣性。丌同的问题,适应性函数的定义方式也不同。
  4. 选择:选择的目的是为了从当前群体中选出优良的个体,使它们有机会作为父代为下一代繁殖子孙。遗传算法通过选择过程体现这一思想,进行选择的原则是适应性强的个体为下一代贡献一个或多个后代的概率大。选择体现了达尔文的适者生存原则。
  5. 交叉:交叉操作是遗传算法中最主要的遗传操作。通过交叉操作可以得到新一代个体,新个体组合了其父辈个体的特性。交叉体现了信息交换的思想。
  6. 变异:变异首先在群体中随机选择一个个体,对于选中的个体以一定的概率随机地改变串结构数据中某个串的值。同生物界一样, GA中变异发生的概率很低,通常取值很小。

遗传算法工具箱和常用函数介绍

  • MATLAB内嵌遗传算法工具箱: gadst
  • Sheffield大学遗传算法工具箱: gatbx
  • 北卡罗来纳大学遗传算法工具箱: gaot

本文的工具箱为gaot

重点函数
optimtool
optimtool:MATLAB自带的工具箱函数

在MATLAB里命令行里输入optimtool,会弹出如图
20201101100046605.png_pic_center
在Solver里有很多选项,包括非线性,遗传算法等各种优化

20201101100158409.png_pic_center 20201101102104915.png_pic_center

gaot工具箱的函数
initializega:初始化

20201101102326562.png_pic_center

ga
ga输入参数
20201101102612368.png_pic_center
ga输出参数
20201101102643394.png_pic_center

算例

首先我们需要将工具箱gaot添加进路径。工具箱和算例代码后面我会给出百度云链接。

20201101105417137.png_pic_center

算例1:一元函数优化

第一步:

  1. %% I. 清空环境变量
  2. clear all
  3. clc

第二步:定义问题
我们需要找到
x = 0:0.01:9;
y = x + 10sin(5x)+7cos(4x);的最大值

  1. %% II. 绘制函数曲线
  2. figure
  3. plot(x, y)
  4. xlabel('自变量')
  5. ylabel('因变量')
  6. title('y = x + 10*sin(5*x) + 7*cos(4*x)')

20201101133840550.png_pic_center

第三步:产生初始种群
种群规模:50,范围是[0-9]
fitness.m 适应度函数如下,因为本文是求最大值,所有适应度函数和目标函数一致

function [sol, fitnessVal] = fitness(sol, options)
x = sol(1);
fitnessVal = x + 10sin(5x)+7cos(4x);
end

如果是求最小值,用1除以最大适应度函数,或者-1*最大适应度函数

function [sol, fitnessVal] = fitness(sol, options)
x = sol(1);
fitnessVal = 1/(x + 10sin(5x)+7cos(4x));
end

  1. %% III. 初始化种群
  2. initPop = initializega(50,[0 9],'fitness');

得到的initPop维度50*2
50表示有50个个体
20201101134457154.png_pic_center
第一列表示个体x,第二列表示适应度函数值
20201101134642309.png_pic_center

第四步:优化

  1. %% IV. 遗传算法优化
  2. [x endPop bpop trace] = ga([0 9],'fitness',[],initPop,[1e-6 1 1],'maxGenTerm',25,...
  3. 'normGeomSelect',0.08,'arithXover',2,'nonUnifMutation',[2 25 3]);

20201101135111746.png_pic_center

第五步:结果绘图

  1. %% V. 输出最优解并绘制最优点
  2. x
  3. hold on
  4. plot (endPop(:,1),endPop(:,2),'ro')
  5. %% VI. 绘制迭代进化曲线
  6. figure(2)
  7. plot(trace(:,1),trace(:,3),'b:')
  8. hold on
  9. plot(trace(:,1),trace(:,2),'r-')
  10. xlabel('Generation'); ylabel('Fittness');
  11. legend('Mean Fitness', 'Best Fitness')

20201101135341927.png_pic_center 25代 20201101135413972.png_pic_center

算例2:BP神经网络初始权值和阈值优化
20201101140028981.png_pic_center

gadecod.m

  1. function[W1,B1,W2,B2,val]=gadecod(x)
  2. global p
  3. global t
  4. global R
  5. global S2
  6. global S1
  7. % R*S1个编码为W1
  8. for i=1:S1
  9. for k=1:R
  10. W1(i,k)=x(R*(i-1)+k);
  11. end
  12. end
  13. % 接着的S1*S2个编码(即第R*S1个后的编码)为W2
  14. for i=1:S2
  15. for k=1:S1
  16. W2(i,k)=x(S1*(i-1)+k+R*S1);
  17. end
  18. end
  19. % 接着的S1个编码(即第R*SI+SI*S2个后的编码)为B1
  20. for i=1:S1
  21. B1(i,1)=x((R*S1+S1*S2)+i);
  22. end
  23. %接着的S2个编码(即第R*SI+SI*S2+S1个后的编码)为B2
  24. for i=1:S2
  25. B2(i,1)=x((R*S1+S1*S2+S1)+i);
  26. end
  27. % 计算S1S2层的输出
  28. A1=tansig(W1*p,B1);
  29. A2=purelin(W2*A1,B2);
  30. % 计算误差平方和
  31. SE=sumsqr(t-A2);
  32. % 遗传算法的适应值
  33. val=1/SE;

gabpEval.m

  1. function[sol,val]=gabpEval(sol,options)
  2. global S
  3. for i=1:S
  4. x(i)=sol(i);
  5. end;
  6. [W1,B1,W2,B2,val]=gadecod(x);

ga_bp.m

  1. %% I. 清除环境变量
  2. clear all
  3. clc
  4. %% II. 声明全局变量
  5. global p % 训练集输入数据
  6. global t % 训练集输出数据
  7. global R % 输入神经元个数
  8. global S2 % 输出神经元个数
  9. global S1 % 隐层神经元个数
  10. global S % 编码长度
  11. S1 = 10;
  12. %% III. 导入数据
  13. %%
  14. % 1. 训练数据
  15. p = [0.01 0.01 0.00 0.90 0.05 0.00;
  16. 0.00 0.00 0.00 0.40 0.50 0.00;
  17. 0.80 0.00 0.10 0.00 0.00 0.00;
  18. 0.00 0.20 0.10 0.00 0.00 0.10]';
  19. t = [1.00 0.00 0.00 0.00;
  20. 0.00 1.00 0.00 0.00;
  21. 0.00 0.00 1.00 0.00;
  22. 0.00 0.00 0.00 1.00]';
  23. %%
  24. % 2. 测试数据
  25. P_test = [0.05 0 0.9 0.12 0.02 0.02;
  26. 0 0 0.9 0.05 0.05 0.05;
  27. 0.01 0.02 0.45 0.22 0.04 0.06;
  28. 0 0 0.4 0.5 0.1 0;
  29. 0 0.1 0 0 0 0]';
  30. %% IV. BP神经网络
  31. %%
  32. % 1. 网络创建
  33. net = newff(minmax(p),[S1,4],{ 'tansig','purelin'},'trainlm');
  34. %%
  35. % 2. 设置训练参数
  36. net.trainParam.show = 10;
  37. net.trainParam.epochs = 2000;
  38. net.trainParam.goal = 1.0e-3;
  39. net.trainParam.lr = 0.1;
  40. %%
  41. % 3. 网络训练
  42. [net,tr] = train(net,p,t);
  43. %%
  44. % 4. 仿真测试
  45. s_bp = sim(net,P_test) % BP神经网络的仿真结果
  46. %% V. GA-BP神经网络
  47. R = size(p,1);
  48. S2 = size(t,1);
  49. S = R*S1 + S1*S2 + S1 + S2;
  50. aa = ones(S,1)*[-1,1];
  51. %% VI. 遗传算法优化
  52. %%
  53. % 1. 初始化种群
  54. popu = 50; % 种群规模
  55. initPpp = initializega(popu,aa,'gabpEval',[],[1e-6 1]); % 初始化种群
  56. %%
  57. % 2. 迭代优化
  58. gen = 100; % 遗传代数
  59. % 调用GAOT工具箱,其中目标函数定义为gabpEval
  60. [x,endPop,bPop,trace] = ga(aa,'gabpEval',[],initPpp,[1e-6 1 1],'maxGenTerm',gen,...
  61. 'normGeomSelect',[0.09],['arithXover'],[2],'nonUnifMutation',[2 gen 3]);
  62. %%
  63. % 3. 绘均方误差变化曲线
  64. figure(1)
  65. plot(trace(:,1),1./trace(:,3),'r-');
  66. hold on
  67. plot(trace(:,1),1./trace(:,2),'b-');
  68. xlabel('Generation');
  69. ylabel('Sum-Squared Error');
  70. %%
  71. % 4. 绘制适应度函数变化
  72. figure(2)
  73. plot(trace(:,1),trace(:,3),'r-');
  74. hold on
  75. plot(trace(:,1),trace(:,2),'b-');
  76. xlabel('Generation');
  77. ylabel('Fittness');
  78. %% VII. 解码最优解并赋值
  79. %%
  80. % 1. 解码最优解
  81. [W1,B1,W2,B2,val] = gadecod(x);
  82. %%
  83. % 2. 赋值给神经网络
  84. net.IW{ 1,1} = W1;
  85. net.LW{ 2,1} = W2;
  86. net.b{ 1} = B1;
  87. net.b{ 2} = B2;
  88. %% VIII. 利用新的权值和阈值进行训练
  89. net = train(net,p,t);
  90. %% IX. 仿真测试
  91. s_ga = sim(net,P_test) %遗传优化后的仿真结果

代码和goat见百度云

  1. 链接:https://pan.baidu.com/s/1exuNVSaGp_GUAH3py3M14g
  2. 提取码:6jp1
  3. 复制这段内容后打开百度网盘手机App,操作更方便哦

MATLAB 和遗传算法非我所长,所以我也云里雾里,这篇为我所学笔记。
等我那天开窍啦,我就完全懂啦。
在这里插入图片描述

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,1490人围观)

还没有评论,来说两句吧...

相关阅读

    相关 遗传算法MATLAB

    遗传算法与MATLAB (一)遗传算法:遗传算法是模拟达尔文生物进化论的自然选择和遗传机理的生物进化过程的计算模型,是一种模拟自然进化过程搜索最优解的方法。 (二)应