当前位置:   article > 正文

阿白数模笔记之遗传算法(genetic algorithm)MATLAB代码详解_遗传算法matlab代码

遗传算法matlab代码

目录

Preface

一.极值问题Extremum problem

1.参数初始化 Parameter initialization

 2.解码 decode

3.轮盘赌,选择淘汰Roulette, choose to eliminate

4.交叉 cross

5.变异 variation

6.完成迭代 Iteration completed

二.旅行商问题TSP

Reference article


Preface

        关于遗传算法的知识点,可以参考其他博主的文章,写的都很详尽易懂。作为数模小白,作者在这里分享关于代码的理解和每一步操作的意义。

一.极值问题Extremum problem

1.参数初始化 Parameter initialization

  1. function result = func1(x) %待求的函数
  2. fit = x+10*sin(5*x)+7*cos(4*x);
  3. result = fit;
  4. end
  1. NP = 100; %种群数量
  2. L = 20; %二进制位串长度
  3. Pc = 0.8; %交叉率
  4. Pm = 0.01; %变异率
  5. G = 100; %最大遗传代数
  6. Xs = 10; %上限
  7. Xx = 0; %下限
  8. f = rand(NP,L); %随机获得初始种群
  9. trace=zeros(1,G); %用来记录每次迭代的最优解

 2.解码 decode

  1. for k = 1:G %这是外层循环,对应的end在后面
  2. for i = 1:NP
  3. U = f(i,:); %第i行,解码
  4. m = 0;
  5. for j = 1:L
  6. m = U(j)*2^(j-1)+m;%二进制转化为10进制
  7. end
  8. x(i) = Xx+m*(Xs-Xx)/(2^L-1);%代回定义域
  9. Fit(i) = func1(x(i));
  10. end
  11. maxFit = max(Fit); %最大值,寻求的最优个体
  12. minFit = min(Fit); %最小值
  13. trace(k) = maxFit; %历代最优适应度,记录下来
  14. rr = find(Fit==maxFit);
  15. fBest = f(rr(1,1),:); %历代最优个体
  16. xBest = x(rr(1,1));
  17. Fit = (Fit-minFit)/(maxFit-minFit); %归一化适应度值

3.轮盘赌,选择淘汰Roulette, choose to eliminate

  1. sum_Fit = sum(Fit);
  2. fitvalue = Fit./sum_Fit; %返回概率矩阵
  3. fitvalue = cumsum(fitvalue);%累计和,a(j)=a(1)+a(2)+...a(j)
  4. ms = sort(rand(NP,1));%轮盘赌
  5. fiti = 1;
  6. newi = 1;
  7. while (newi <=NP) && (fiti<=NP)
  8. if (ms(newi)) < fitvalue(fiti)
  9. nf(newi,:) = f(fiti,:);%f是初始种群,储存被选中的个体
  10. newi = newi+1; %对于优秀个体(占比率较多的)多复制的可能更大
  11. else
  12. fiti = fiti+1;
  13. end
  14. end

4.交叉 cross

  1. for i = 1:2:NP
  2. p = rand;
  3. if p < Pc %进行交叉
  4. q = rand(1,L);
  5. for j = 1:L
  6. if q(j)<Pc
  7. temp = nf(i+1,j);
  8. nf(i+1,j) = nf(i,j);
  9. nf(i,j) = temp;
  10. end
  11. end
  12. end
  13. end

5.变异 variation

  1. i = 1;
  2. while i <= round(NP*Pm)
  3. h = randi([1,NP],1,1); %随机选取一个需要变异的染色体,返回1*1介于[1,NP]的伪整数矩阵
  4. for j = 1:round(L*Pm)
  5. g = randi([1,L],1,1); %随机选取需要变异的基因数
  6. nf(h,g) =~ nf(h,g);
  7. end
  8. i = i+1;
  9. end

6.完成迭代 Iteration completed

  1. f = nf;
  2. f(1,:) = fBest; %保留最优个体在新种群中
  3. end %与前面的for对应
  4. x=linspace(Xx,Xs,10000);
  5. plot(x,func1(x));legend('x+10*sin(5*x)+7*cos(4*x)','location','northwest')
  6. title('function');
  7. figure
  8. plot(trace)
  9. xlabel('Iterations')
  10. ylabel('Objective function value')
  11. title('Fitness evolution curve')

 

 从上面可以发现,GA很快就收敛到了目标值,没有陷入局部最优值,效率还是很快的

二.旅行商问题TSP

关于代码的解释上面已给出,下面分享TSP问题的代码,稍难的已给出注释。另可参考阿白数模笔记之蚁群算法(1):TSP问题,遍历全球244个国家和地区的最短路径和

  1. function [out]=distance(d)
  2. m=size(d,1);
  3. out=zeros(m,m);
  4. for i=1:m
  5. for j=i:m
  6. a=d(i,:);
  7. b=d(j,:);
  8. out(i,j)= ((a-b)*(a-b)')^0.5; % 计算最短直线距离
  9. out(j,i)=out(i,j);
  10. end
  11. end
  12. end
  1. tic
  2. clc;clear
  3. load('data2.mat')%C 31个地区的坐标
  4. N = size(C,1); %TSP 问题的规模,即城市数目
  5. D =distance(C); %任意两个城市距离间隔矩阵
  6. NP = 200; %种群规模
  7. G = 5000; %最大遗传代数
  8. % f = zeros(NP,N); %用于存储种群
  9. F = []; %种群更新中间存储
  10. for i = 1:NP
  11. f(i,:) = randperm(N); %p = randperm(n) 返回行向量,其中包含从 1 到 n 没有重复元素的整数随机排列。
  12. end
  13. R = f(1,:); %存储最优种群
  14. len = zeros(NP,1); %存储路径长度
  15. fitness = zeros(NP,1); %存储归一化适应值
  16. gen = 0;
  17. while gen < G
  18. %%%%%%%%%%%%%%%计算路径长度%%%%%%%%%%%%%%%%
  19. for i = 1:NP
  20. len(i,1) = D(f(i,N),f(i,1));
  21. for j = 1:(N-1)
  22. len(i,1) = len(i,1)+D(f(i,j),f(i,j+1));
  23. end
  24. end
  25. maxlen = max(len); %最长路径
  26. minlen = min(len); %最短路径
  27. %%%%%%%%%%%%%%%更新最短路径%%%%%%%%%%%%%%%
  28. rr = find(len==minlen);
  29. R = f(rr(1,1),:);
  30. %%%%%%%%%%%%%%计算归一化适应值%%%%%%%%%%%%%%
  31. for i = 1:length(len)
  32. fitness(i,1) = (1-((len(i,1)-minlen)/(maxlen-minlen+0.001)));
  33. end
  34. %%%%%%%%%%%%%%%%%选择操作%%%%%%%%%%%%%%%%
  35. nn = 0;
  36. for i = 1:NP
  37. if fitness(i,1) >= rand
  38. nn = nn+1;
  39. F(nn,:) = f(i,:);
  40. end
  41. end
  42. [aa,bb] = size(F);
  43. while aa < NP
  44. nnper = randperm(nn);
  45. A = F(nnper(1),:);
  46. B = F(nnper(2),:);
  47. %%%%%%%%%%%%%%%交叉操作%%%%%%%%%%%%%%%
  48. W = ceil(N/10); %交叉点个数
  49. p = unidrnd(N-W+1); %随机选择交叉范围,从 p 到 p+W,
  50. %r = unidrnd(n) 从由最大值 n 指定的离散均匀分布中生成随机数。
  51. for i = 1:W
  52. x = find(A==B(1,p+i-1));
  53. y = find(B==A(1,p+i-1));
  54. temp = A(1,p+i-1);
  55. A(1,p+i-1) = B(1,p+i-1);
  56. B(1,p+i-1) = temp;
  57. temp = A(1,x);
  58. A(1,x) = B(1,y);
  59. B(1,y) = temp;
  60. end
  61. %%%%%%%%%%%%%%%%%变异操作%%%%%%%%%%%%%
  62. %但迭代到后面为防止重要基因丢失,变异概率应随着迭代进行而降低
  63. for k=1:floor((G-gen)/G*0.2*N)+1
  64. p1 = floor(1+N*rand());
  65. %Y = floor(X) 将 X 的每个元素四舍五入到小于或等于该元素的最接近整数。
  66. p2 = floor(1+N*rand());
  67. while p1==p2
  68. p1 = floor(1+N*rand());
  69. p2 = floor(1+N*rand());
  70. end
  71. tmp = A(p1);
  72. A(p1) = A(p2);
  73. A(p2) = tmp;
  74. tmp = B(p1);
  75. B(p1) = B(p2);
  76. B(p2) = tmp;
  77. F = [F;A;B];
  78. [aa,bb] = size(F);
  79. end
  80. end
  81. if aa > NP
  82. F = F(1:NP,:); %保持种群规模为 NP
  83. end
  84. f = F; %更新种群
  85. f(1,:) = R; %保留每代最优个体
  86. clear F;
  87. gen = gen+1;
  88. Rlength(gen) = minlen;
  89. for i = 1:N-1
  90. plot([C(R(i),1),C(R(i+1),1)],[C(R(i),2),C(R(i+1),2)],'bo-');
  91. hold on
  92. end
  93. plot([C(R(N),1),C(R(1),1)],[C(R(N),2),C(R(1),2)],'ro-');
  94. title(['Minimum distance:',num2str(minlen)]);
  95. hold off
  96. end
  97. figure
  98. plot(Rlength)
  99. xlabel('Iterations')
  100. ylabel('Objective function value')
  101. title('Fitness evolution curve')
  102. toc
  103. 历时 233.815222 秒。

Reference article

 [1]遗传算法小结及算法实例(附Matlab代码) 

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

闽ICP备14008679号