当前位置:   article > 正文

基于Matlab的遗传算法_matlab遗传算法参数中代数是哪个

matlab遗传算法参数中代数是哪个
简介

遗传算法(Genetic Algorithm,GA)是由美国的John Holland于20世纪70年代提出的一种模拟自然进化过程的计算模型。它基于达尔文的生物进化理论,通过模拟生物进化过程中的自然选择和遗传机制,利用计算机仿真运算,将问题的求解过程转换为类似生物进化中的染色体基因的交叉、变异等过程。

遗传算法在组合优化、机器学习、信号处理、自适应控制和人工生命等领域被广泛地应用。在求解较为复杂的组合优化问题时,相对一些常规的优化算法,通常能够较快地获得较好的优化结果。

函数简介
 1.种群创建函数crtbp()

函数功能:创建任意离散离散随机种群
参数说明:Nind 为个体数量,Lind为个体长度,Chrome为种群编码,Base为基本字符向量
[Chorm,Lind,BaseV] = crtbp9(Lind,Nind,Base) ,注意Nind的数量=Basw的列数

[Chorm,Lind,BaseV] = crtbp(5,10,[2 2 2 2 2 2 2 2 2 2]);

例,创建一个种群个体为5,个体长度为8,各位的进制数[1 2 3 4 5 6 7 8]

  1. clear;
  2. [Chorm,Lind,BaseV] = crtbp(5,8,[1 2 3 4 5 6 7 8]);
2.适应度计算函数ranking()

FitnV = ranking(ObjV,RFun,SUBPOP)
参数说明
ObjV:目标值
 RFun:排序方法及压差选择 ps:压差的意义:匹配度最高值为压差
SUBPOP:ObjV子种群数量,默认为1

  1. ObjV = [1;2;3;4;5;10;9;7;8;6];
  2. %使用线性排序和压差为2估算适应度,下面的结果都是一样的
  3. FitnV = ranking(ObjV);
  4. FitnV = ranking(ObjV,[2,0]);
  5. FitnV = ranking(ObjV,[2,0],1);



使用RFun中的值来估计适应度

  1. RFun = [1,11,22,33,44,55,88,99,66,111];
  2. FitnV = ranking(ObjV,RFun);

目标值的匹配度就是直接选择RFun里的,默认目标值最小对应的匹配值最大

3.选择函数 select()


select(SEL_F,Chrom,FItnV,GGAP,SUBPOP)
参数说明
SEL_F类型为字符串,代表低级选择函数,如'sus','rws'
GGAP 是指“Generational Gap”(代际差距)。
代际差距描述了在每一代中,有多少新的个体应该被产生来替换当前的种群。
 这是一个控制种群更新速率的参数。
例如,如果GGAP设置为0.9,这意味着在每一代中,90%的当前种群将被新的个体所替代。
这些新的个体通常是通过交叉、变异等操作产生的。

  1. Chrom = [1 11 21;2 12 22;3 13 23; 4 14 24;5 15 25;6 16 26; 7 17 27 ;8 18 28];
  2. FitnV = [1.5;1.35;1.21;1.07;0.92;0.78;0.64;0.5];
  3. GGAP = 0.9;
  4. SleCh = select('sus',Chrom,FitnV,GGAP);%注意这里的SleCh个体数量为70


交叉算子函数recombin(REC_F,Chrom,RecOpt,SUBPOP)
REC_F低级重组函数,例如'recdis','xovsp'
RecOpt为交叉概率的任选参数

  1. clear;clc
  2. Chrom = crtbp(5,10);
  3. NewChrom = recombin('xovsp',Chrom);


mut变异算子函数
mut(OldChrom,Pm.BaseV)
Pm为变异概率,BaseV若省略则为二进制

  1. clear;clc
  2. OldChrom = crtbp(5,10);
  3. NewChrom = mut(OldChrom,0.7);
4.重插入函数 reins()


若GGAP的数量小于1,经过select()函数则,子种群个体数量=GGAP.*原种群个体数量,则重插入函数会补全个体的数量
[Chrom,ObjVCh] = reins(Chrom,SelCH,insopt,ObjVCh,ObjVSel)
SelCH为子种群,ObjVCh,ObjVSel 分别代表父代的目标值,子代目标值
insopt为一个二维向量,第一个值子代插入父代的方法,0代表均匀插入;1代表基于匹配度的插入,子代会优先插入匹配度低的父代,默认为0
第二个值代表子种群中被子代个体插入的概率默认为1.0

  1. clear();clc
  2. Chrom = crtbp(5,10);
  3. SelCh = crtbp(2,10);
  4. Chrom = reins(Chrom,SelCh);
5.bs2rv()将2进制转换成10进制


Chrom = bs2rv(Chrom,FielD)
FieldD译码矩阵
FieldD(len;lb;ub;code;scale;lbin;ubin)
len为种群个体长度;lu,ub,代表种群的上界与下界;code为编码方式1为2进制,0为格雷编码
scale为刻度,0为算数刻度,1为对数刻度;lbin,ubin代表是否包含边界

  1. clear;clc
  2. Chrom = crtbp(4,8);
  3. FieldD = [size(Chrom,2);-1;10;1;0;1;1];
  4. value = bs2rv(Chrom,FieldD);
实例一:一元函数求最小值

  1. %% GA:Single parameter
  2. %date:2023.10.15
  3. clc;clear;
  4. close all;
  5. % 绘图
  6. figure(1)
  7. hold on;
  8. lb = 1;%X的变量下限
  9. ub = 2;%X的变量上限
  10. fplot( @(X)(sin(10.*pi.*X)./X),[lb,ub]);
  11. xlabel('自变量X')
  12. ylabel('函数值Y')
  13. %定义遗传算法参数
  14. NIND=40;%种群数量
  15. MAXGEN=30;%最大遗传代数
  16. PRECI=20;%个体长度
  17. GGAP=0.95;%代沟
  18. px=0.7;%交叉概率
  19. pm=0.01;%变异概率
  20. trace=zeros(2,MAXGEN);%起始值
  21. FieldD=[PRECI;lb;ub;1;0;1;1];
  22. Chrom=crtbp(NIND,PRECI);
  23. %优化
  24. gen=0;%代计数器,迭代次数
  25. X=bs2rv(Chrom,FieldD);%2进制 ---> 10进制
  26. ObjV = sin(10*pi.*X)./X;
  27. while gen < MAXGEN
  28. FitV=ranking(ObjV);%分配适应度
  29. SelCh = select('sus',Chrom,FitV,GGAP);%自然选择
  30. SelCh=recombin('xovsp',SelCh,px);%基因重组
  31. SelCh=mut(SelCh,pm);%基因变异
  32. X=bs2rv(SelCh,FieldD);%2进制 ---> 10进制
  33. ObjVSel=sin(10.*pi.*X)./X;%计算子代目标值
  34. [Chrom,ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel);
  35. X=bs2rv(Chrom,FieldD);
  36. gen=gen+1;%迭代加一次
  37. [Y,I] = min(ObjV);%获取最优值,Y为最优解,I为个体序号
  38. trace(1,gen)=X(I);
  39. trace(2,gen)=Y;
  40. end
  41. plot(trace(1,:),trace(2,:),'bo');%每代最优解
  42. grid on;
  43. plot(X,ObjV,'b*');%最后一代种群
  44. %画进化图
  45. figure(2)
  46. plot(1:MAXGEN,trace(2,:));
  47. grid on;
  48. xlabel("遗传代数")
  49. ylabel("解的变换")
  50. title("进化过程")
  51. bestY=trace(2,end);
  52. bestX=trace(1,end);
  53. fprintf(['最优解:\nX=',num2str(bestX),'\nY=',num2str(bestY),'\n'])

运行结果:

 最优解:
X=1.1491
Y=-0.8699

ps:遗传算法为启发式算法,每次得到的值都不一样,但是在种群数量足够的情况下,最终值都相差不大。

实列二:多元函数求最大值

  1. %% GA_multiparameter
  2. %date:2023.10.17
  3. clc;clear;
  4. close all;
  5. %绘制函数图
  6. figure(1)
  7. lb_x=-2;ub_x=2;
  8. lb_y=-2;ub_y=2;
  9. fun = @(x,y) x.*cos(2.*pi.*y)+y.*sin(2.*pi.*x);
  10. fmesh(fun,[lb_x,ub_x,lb_y,ub_y])
  11. xlabel('X Axis Label')
  12. ylabel('Y Axis Label')
  13. zlabel('Z Axis Label')
  14. hold on;
  15. %view(3) 默认三维视角,view(az,el)
  16. view(45,45)%感觉这个视角舒服一些
  17. %定义遗传算法参数
  18. NIND=40;%种群数量
  19. MAXGEN=50;%最大遗传代数
  20. PRECI=20;%个体长度
  21. GGAP=0.95;%代沟
  22. px=0.7;%交叉概率
  23. pm=0.01;%变异概率
  24. trace=zeros(3,MAXGEN);
  25. FieldD=[PRECI PRECI;lb_x lb_y;ub_x ub_y;1 1;0 0;1 1;1 1];
  26. Chrom = crtbp(NIND,PRECI.*2);
  27. %%优化
  28. gen=0;
  29. XY = bs2rv(Chrom,FieldD);
  30. X = XY(:,1);Y = XY(:,2);
  31. ObjV=Y.*sin(2.*pi.*X)+X.*cos(2.*pi.*Y);
  32. while gen < MAXGEN
  33. FitnV=ranking(-ObjV);%这里求的是目标函数的最小值,这个算法默认求最小值
  34. SelCh=select('sus',Chrom,FitnV,GGAP);%选择
  35. SelCh=recombin('xovsp',SelCh,px);%重组
  36. SelCh=mut(SelCh,pm);%变异
  37. XY=bs2rv(SelCh,FieldD);
  38. X = XY(:,1);Y = XY(:,2);
  39. ObjVSel=Y.*sin(2.*pi.*X)+X.*cos(2.*pi.*Y);
  40. [Chrom,ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel);
  41. XY=bs2rv(Chrom,FieldD);
  42. disp([num2str(gen),'代'])
  43. gen = gen + 1;
  44. [Y,I]=max(ObjV);
  45. trace(1:2,gen)=XY(I,:);
  46. trace(3,gen)=Y;
  47. end
  48. plot3(trace(1,:),trace(2,:),trace(3,:),'bo')%绘制三维数据点,每一代的最优点
  49. grid on;
  50. plot3(XY(:,1),XY(:,2),ObjV,'bo')%画出最后一代的种群
  51. hold off;
  52. %%画进化图
  53. figure(2)
  54. plot(1:MAXGEN,trace(3,:));
  55. grid on;
  56. xlabel("遗传代数")
  57. ylabel("进化过程")
  58. title("进化过程")
  59. bestZ = trace(3,end);
  60. bestY = trace(2,end);
  61. bestX = trace(1,end);
  62. fprintf(['最优解:\nX=',num2str(bestX),'\nY=',num2str(bestY),'\n','最优解:\nY=',num2str(bestZ)])

运行结果:

 最优解:
X=-1.7667
Y=1.5143
最优解:
Z=3.2655

ps:遗传算法为启发式算法,每次得到的值都不一样,但是在种群数量足够的情况下,最终值都相差不大。

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

闽ICP备14008679号