楼主: fantuanxiaot
24309 258

[源码分享] [MATLAB原创]基于Matlab的遗传算法研究:以一个简答例子[欢迎探讨算法by fantuanxiaot]   [推广有奖]

回帖奖励 202 个论坛币 回复本帖可获得 2 个论坛币奖励! 每人限 2 次

已卖:1597份资源

大师

9%

还不是VIP/贵宾

-

威望
7
论坛币
-234454 个
通用积分
225.8477
学术水平
3783 点
热心指数
3819 点
信用等级
3454 点
经验
150360 点
帖子
7597
精华
32
在线时间
1329 小时
注册时间
2013-2-4
最后登录
2025-3-23

初级学术勋章 初级热心勋章 中级热心勋章 中级学术勋章 初级信用勋章 中级信用勋章 高级热心勋章 高级学术勋章 特级学术勋章 特级热心勋章 高级信用勋章 特级信用勋章

楼主
fantuanxiaot 发表于 2015-4-8 01:43:11 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

Matlab的遗传算法可以基于Matlab自带的工具箱GA ToolBox

亦可以基于谢菲尔德大学遗传算法工具箱GEAT ToolBox

如果算法研究彻底时候,可能会将R语言和C++版本自己写一遍和大家分享。

1,基于Matlab自带的工具箱GA ToolBox
直接使用即可,非常方便,效果如下:

GA_Example_Plot.jpg


本帖隐藏的内容

  1. %% 基于遗传算法的GA工具箱示例
  2. %% by fantuanxiaot
  3. function [Beta,Fval,Stop_Reason]=GA_Example
  4. % 遗传算法的参数的选择
  5. % 选择不做图的情况
  6. GA_Options=gaoptimset('Generations',100,'PlotFcns',{[]},'PopulationSize',50,'TolFun',1e-6);
  7. [Beta,Fval,Stop_Reason]=ga(@GA_Example_fun,2,GA_Options);
  8. %% 作图显示
  9. h_figure=figure('position',[1,1,800,500],'color','w');
  10. movegui(h_figure,'center');
  11. x=-1:0.02:1;
  12. y=-1:0.02:1;
  13. [X,Y]=meshgrid(x,y);
  14. Z=exp(X.^2+Y.^2);
  15. h_mesh=meshz(X,Y,Z);
  16. colormap('HSV')
  17. set(h_mesh,'linewidth',1,'edgelighting','phong')
  18. xlabel('X','FontName','华文楷体','FontSize',14);
  19. ylabel('Y','FontName','华文楷体','FontSize',14);
  20. zlabel('Z','FontName','华文楷体','FontSize',14);
  21. title('基于GA工具箱的遗传算法最优寻找','FontName','华文楷体','FontSize',16);
  22. set(gca,'fontname','华文楷体','fontsize',14)
  23. hold on
  24. plot3(Beta(1),Beta(2),GA_Example_fun(Beta),'bp','markerfacecolor','b','markersize',25)
  25. % 换一个角度
  26. view(-10,30)
  27. text(Beta(1),Beta(2),GA_Example_fun(Beta)+1.5,'最小值点','FontName','华文楷体','FontSize',20);
  28. end

  29. %% 遗传算法的目标函数
  30. %% 遗传算法的目标函数
  31. function f=GA_Example_fun(x)
  32. f=exp(x(1)^2+x(2)^2);
  33. end
复制代码


2,基于谢菲尔德大学遗传算法工具箱GEAT ToolBox下载地址:
https://bbs.pinggu.org/thread-3625763-1-1.html,效果:

GEAT_Example_Plot.jpg


本帖隐藏的内容

  1. %%  基于谢菲尔德大学遗传算法工具箱的运算
  2. %%  by fantuanxiaot
  3. function [Optimal_X,Optimal_Y,Optimal_Z]=GEAT_Example
  4. %  遗传算法的一些参数设置
  5. %  上下界
  6. ub_lb=[-5 -5;5 5];
  7. %  各种概率和其他参数
  8. %  各种概率和其他参数
  9. %  种群
  10. Population=10;
  11. %  最大进化代数
  12. MaxIteration=100;
  13. %  选择概率
  14. SelectionProbability=0.9;
  15. %  交配概率
  16. CrossoverProbability=0.7;
  17. %  变异概率
  18. MutationProbability=0.02;
  19. %  多少变量
  20. NumberofIndividuals=2;
  21. %  准确度
  22. Precision=15;
  23. %  建立扫描区间
  24. FielD=[repmat(Precision,1,NumberofIndividuals);ub_lb;repmat([1;0;1;1],1,NumberofIndividuals)];
  25. %  初始的迭代数目
  26. Iteration=0;
  27. %  初始的种群
  28. Chromsome=CRTBP(Population,NumberofIndividuals*Precision);
  29. %  X是初始的自变量种群
  30. X=BS2RV(Chromsome,FielD);
  31. %  ObjV是初始的适应度
  32. ObjV=ObjVfun(X);
  33. %  最优参数的跟踪
  34. Trace=zeros(MaxIteration,3);
  35. while Iteration<MaxIteration
  36.     %  寻找最大值
  37.     FitV=RANKING(ObjV);
  38.     SelCh=SELECT('SUS',Chromsome,FitV,SelectionProbability);
  39.     SelCh=RECOMBIN('XOVSP',SelCh,CrossoverProbability);
  40.     SelCh=MUT(SelCh,MutationProbability);
  41.     %  子代的转换
  42.     X=BS2RV(SelCh,FielD);
  43.     ObjSelV=ObjVfun(X);
  44.     [Chromsome,ObjV]=REINS(Chromsome,SelCh,1,1,ObjV,ObjSelV);
  45.     %  得到了新的种群
  46.     X=BS2RV(Chromsome,FielD);
  47.     %  迭代次数加1
  48.     Iteration=Iteration+1;
  49.     %  ObjV和X为新的种群和适应度值
  50.     value_x=X(:,1);
  51.     value_y=X(:,2);
  52.     value_z=ObjV;
  53.     [Optimal_Z,index]=min(value_z);
  54.     Optimal_X=value_x(index);
  55.     Optimal_Y=value_y(index);
  56.     Trace(Iteration,:)=[Optimal_X,Optimal_Y,Optimal_Z];
  57. end
  58. %%  作图
  59. h_figure=figure('position',[1,1,800,500],'color','w');
  60. movegui(h_figure,'center');
  61. x=-1.5:0.05:1.5;
  62. y=-1.5:0.05:1.5;
  63. [X,Y]=meshgrid(x,y);
  64. Z=exp(X.^2+Y.^2);
  65. h_mesh=meshz(X,Y,Z);
  66. colormap('HSV')
  67. view(-20,40)
  68. set(h_mesh,'linewidth',1,'edgelighting','phong')
  69. xlabel('X','FontName','华文楷体','FontSize',14);
  70. ylabel('Y','FontName','华文楷体','FontSize',14);
  71. zlabel('Z','FontName','华文楷体','FontSize',14);
  72. title('基于谢菲尔德大学遗传算法工具箱的遗传算法最优寻找','FontName','华文楷体','FontSize',16);
  73. set(gca,'fontname','华文楷体','fontsize',14)
  74. hold on
  75. plot3(Optimal_X,Optimal_Y,Optimal_Z,'kp','markerfacecolor','k','markersize',25)
  76. %  换一个角度
  77. text(Optimal_X,Optimal_Y,Optimal_Z+1.5,'最小值点','FontName','华文楷体','FontSize',20);
  78. %  将跌代数分为三层查看迭代的效果
  79. plot3(Trace(:,1),Trace(:,2),Trace(:,3),'bo-','linewidth',1,'markersize',10,'markerfacecolor','b')
  80. end
  81. %%  示例举例函数
  82. %%  示例举例函数
  83. function ObjV=ObjVfun(X)
  84. ObjV=exp(X(:,1).^2+X(:,2).^2);
  85. end
复制代码


3,自己编写的一个算法,能计算出来,但是觉得算法有缺陷,需要修改
每次输入 [Optimal_X,Optimal_Y,Optimal_Z]=GA_AgoriOne_Example 后,每次收敛的程度都不一样,这部分欢迎大家探讨。

本帖隐藏的内容

  1. %%  基于详细的算法来构建遗传算法
  2. %%  by fantuanxiaot
  3. function [Optimal_X,Optimal_Y,Optimal_Z]=GA_AgoriOne_Example
  4. %  [Optimal_X,Optimal_Y,Optimal_Z]=GA_Agori_Example直接输入即可
  5. global x1_upper
  6. global x1_lower
  7. global x2_upper
  8. global x2_lower
  9. global Precision
  10. global m1
  11. global m2
  12. %  X1和X2的上下界
  13. x1_upper=2;
  14. x1_lower=-2;
  15. x2_upper=2;
  16. x2_lower=-2;
  17. %  精度的设置
  18. Precision=10000;
  19. %  构成了染色体窜
  20. m1=ceil(log2((x1_upper-x1_lower)*Precision));
  21. m2=ceil(log2((x2_upper-x2_lower)*Precision));
  22. M=m1+m2;
  23. %  种群的个数
  24. Population_Num=50;
  25. Population_1=round(rand(Population_Num,m1));
  26. Population_2=round(rand(Population_Num,m2));
  27. %  概率
  28. CrossOverProbability=0.8;
  29. MutationProbability=0.01;
  30. MaxIteration=100;
  31. for i=1:MaxIteration
  32.     Initial_1=TransFrom_Two_To_Ten(Population_1,m1,x1_lower,x1_upper);
  33.     Initial_2=TransFrom_Two_To_Ten(Population_2,m2,x2_lower,x2_upper);
  34.     %  计算适应度
  35.     f=ObjFun_Matrix([Initial_1,Initial_2]);
  36.     %  计算最优的种群
  37.     [Optimal_Z,index]=min(f);
  38.     Optimal_X=Initial_1(index);
  39.     Optimal_Y=Initial_2(index);
  40.     %  种群的选择
  41.     New_Population=Population_Selection(f,Population_1,Population_2);
  42.     %  交配
  43.     New_Population=Population_CrossOver(New_Population,CrossOverProbability);
  44.     %  突变
  45.     New_Population=Population_Mutation(New_Population,MutationProbability);
  46.     Population_1=New_Population(:,1:m1);
  47.     Population_2=New_Population(:,(m1+1):M);
  48. end
  49. end


  50. %%  基因的交配
  51. %%  基因的交配
  52. function New_Population=Population_CrossOver(Old_Population,CrossOverProbability)
  53. %  参与交配的染色体个数
  54. [sizeM,sizeN]=size(Old_Population);
  55. for i=1:sizeM
  56.     %  随机选择两条染色体
  57.     n1=0;
  58.     n2=0;
  59.     while n1==n2
  60.         n1=ceil(rand*sizeM);
  61.         n2=ceil(rand*sizeM);
  62.     end
  63.     %  如果随机的概率小于CrossOverProbability则进行交配,否则继续
  64.     if(rand>CrossOverProbability)
  65.         continue;
  66.     end
  67.     %  检测和判断
  68.     Old_Population_n1=Old_Population(n1,:);
  69.     Old_Population_n2=Old_Population(n2,:);
  70.     f1_Old=Test_Population(Old_Population_n1);
  71.     f2_Old=Test_Population(Old_Population_n2);
  72.     %  进行交配
  73.     %  随机生成交叉位置
  74.     M=ceil(rand*(sizeN-1));
  75.     Temp_Population=Old_Population_n2(M+1:end);
  76.     Old_Population_n2(M+1:end)=Old_Population_n1(M+1:end);
  77.     Old_Population_n1(M+1:end)=Temp_Population;
  78.     f1_New=Test_Population(Old_Population_n1);
  79.     f2_New=Test_Population(Old_Population_n2);
  80.     %  重新放回原位
  81.     if (min(f1_New,f2_New)<=min(f1_Old,f2_Old))
  82.         Old_Population(n1,:)=Old_Population_n1;
  83.         Old_Population(n2,:)=Old_Population_n2;
  84.     end
  85. end
  86. New_Population=Old_Population;
  87. end

  88. %%  基因的突变
  89. %%  基因的突变
  90. function New_Population=Population_Mutation(Old_Population,MutationProbability)
  91. [sizeM,sizeN]=size(Old_Population);
  92. for i=1:sizeM
  93.     if(rand>MutationProbability)
  94.         continue;
  95.     end
  96.     %  随机选择一条染色体
  97.     index=ceil(sizeM*rand);
  98.     %  产生变异的点
  99.     N=ceil(sizeN*rand);
  100.     Old_Population_M=Old_Population(index,:);
  101.     f_Old=Test_Population(Old_Population_M);
  102.     if (Old_Population_M(N)==1)
  103.         Old_Population_M(N)=0;
  104.     elseif Old_Population_M(N)==0
  105.         Old_Population_M(N)=1;
  106.     end
  107.     f_New=Test_Population(Old_Population_M);
  108.     if(f_New<=f_Old)
  109.         Old_Population(index,:)=Old_Population_M;
  110.     end
  111. end
  112. New_Population=Old_Population;
  113. end

  114. %%  一个判断条件
  115. %%  一个判断条件
  116. function Test=Test_Population(Population)
  117. global x1_upper
  118. global x1_lower
  119. global x2_upper
  120. global x2_lower
  121. global m1
  122. global m2
  123. Population1=Population(:,1:m1);
  124. Population2=Population(:,(m1+1):end);
  125. Initial1=TransFrom_Two_To_Ten(Population1,m1,x1_lower,x1_upper);
  126. Initial2=TransFrom_Two_To_Ten(Population2,m2,x2_lower,x2_upper);
  127. Test=ObjFun_One([Initial1 Initial2]);
  128. end

  129. %%  新种群的复制
  130. %%  新种群的复制
  131. function New_Population=Population_Selection(x,Old_Population1,Old_Population2)
  132. %%  x是适应度的值
  133. %%  Old_Population=[Population_1 Population_2];
  134. x=1./x;
  135. %  得到了每个染色体被复制的概率
  136. Probability=x/sum(x);
  137. %  得到了每个染色体被复制的累积概率
  138. CumProbability=cumsum(Probability);
  139. New_Population1=[];
  140. New_Population2=[];
  141. for i=1:length(x)
  142.     index=find(rand<=CumProbability);
  143.     index=index(1);
  144.     New_Population1=[New_Population1;Old_Population1(index,:)];
  145.     New_Population2=[New_Population2;Old_Population2(index,:)];
  146. end
  147. %  最终得到了新的种群
  148. New_Population=[New_Population1 New_Population2];
  149. end

  150. %%  二进制转换为十进制
  151. %%  二进制转换为十进制
  152. function Initial=TransFrom_Two_To_Ten(x,precision_m,lower,upper)
  153. %  precision是精度
  154. %  x是染色体群
  155. %  x是某一列
  156. [N,~]=size(x);
  157. Initial=zeros(N,1);
  158. for i=precision_m:-1:1
  159.     Initial=Initial+x(:,i).*2^(i-1);
  160. end
  161. Initial=lower+Initial*(upper-lower)/(2^precision_m-1);
  162. end

  163. %%  向量目标函数
  164. %%  向量目标函数
  165. function f=ObjFun_Matrix(x)
  166. f=exp(x(:,1).^2+x(:,2).^2);
  167. end

  168. %%  目标函数
  169. %%  目标函数
  170. function f=ObjFun_One(x)
  171. f=exp(x(1)^2+x(2)^2);
  172. end
复制代码



二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:fantuanxiaot MATLAB matla atlab 遗传算法 大学 position 谢菲尔德 center figure

已有 8 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
niuniuyiwan + 60 + 5 + 5 + 5 精彩帖子
chengzhifu2013 + 3 + 3 + 3 原创好帖,果断收藏!
chenyi112982 + 5 + 5 又见新作!加油小T!
oink-oink + 5 + 5 + 5 精彩帖子
huolin1990 + 1 精彩帖子
离歌レ笑 + 50 + 2 + 2 精彩帖子
jerker + 60 + 60 + 3 + 3 + 3 源码原创,精彩岂容错过
zbin7451f + 100 + 5 + 5 + 5 对论坛有贡献

总评分: 经验 + 220  论坛币 + 113  学术水平 + 28  热心指数 + 29  信用等级 + 18   查看全部评分

本帖被以下文库推荐

沙发
sunyiping 发表于 2015-4-8 01:48:25

回帖奖励 +3 个论坛币

学习学习。

藤椅
fjrong 在职认证  发表于 2015-4-8 01:50:54

回帖奖励 +3 个论坛币

板凳
hzj010102 发表于 2015-4-8 01:51:18

回帖奖励 +3 个论坛币

报纸
fjrong 在职认证  发表于 2015-4-8 01:51:26

回帖奖励 +3 个论坛币

地板
hzj010102 发表于 2015-4-8 01:52:21

回帖奖励 +3 个论坛币

7
tttrrrtr 发表于 2015-4-8 01:52:47

回帖奖励 +3 个论坛币

8
tttrrrtr 发表于 2015-4-8 01:53:25

回帖奖励 +3 个论坛币

9
chongliw 发表于 2015-4-8 01:55:29

回帖奖励 +3 个论坛币

10
chongliw 发表于 2015-4-8 01:57:52

回帖奖励 +3 个论坛币

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群
GMT+8, 2025-12-30 11:07