Matlab的遗传算法可以基于Matlab自带的工具箱GA ToolBox
亦可以基于谢菲尔德大学遗传算法工具箱GEAT ToolBox
如果算法研究彻底时候,可能会将R语言和C++版本自己写一遍和大家分享。
1,基于Matlab自带的工具箱GA ToolBox直接使用即可,非常方便,效果如下:
本帖隐藏的内容
- %% 基于遗传算法的GA工具箱示例
- %% by fantuanxiaot
- function [Beta,Fval,Stop_Reason]=GA_Example
- % 遗传算法的参数的选择
- % 选择不做图的情况
- GA_Options=gaoptimset('Generations',100,'PlotFcns',{[]},'PopulationSize',50,'TolFun',1e-6);
- [Beta,Fval,Stop_Reason]=ga(@GA_Example_fun,2,GA_Options);
- %% 作图显示
- h_figure=figure('position',[1,1,800,500],'color','w');
- movegui(h_figure,'center');
- x=-1:0.02:1;
- y=-1:0.02:1;
- [X,Y]=meshgrid(x,y);
- Z=exp(X.^2+Y.^2);
- h_mesh=meshz(X,Y,Z);
- colormap('HSV')
- set(h_mesh,'linewidth',1,'edgelighting','phong')
- xlabel('X','FontName','华文楷体','FontSize',14);
- ylabel('Y','FontName','华文楷体','FontSize',14);
- zlabel('Z','FontName','华文楷体','FontSize',14);
- title('基于GA工具箱的遗传算法最优寻找','FontName','华文楷体','FontSize',16);
- set(gca,'fontname','华文楷体','fontsize',14)
- hold on
- plot3(Beta(1),Beta(2),GA_Example_fun(Beta),'bp','markerfacecolor','b','markersize',25)
- % 换一个角度
- view(-10,30)
- text(Beta(1),Beta(2),GA_Example_fun(Beta)+1.5,'最小值点','FontName','华文楷体','FontSize',20);
- end
- %% 遗传算法的目标函数
- %% 遗传算法的目标函数
- function f=GA_Example_fun(x)
- f=exp(x(1)^2+x(2)^2);
- end
2,基于谢菲尔德大学遗传算法工具箱GEAT ToolBox下载地址:
https://bbs.pinggu.org/thread-3625763-1-1.html,效果:
本帖隐藏的内容
- %% 基于谢菲尔德大学遗传算法工具箱的运算
- %% by fantuanxiaot
- function [Optimal_X,Optimal_Y,Optimal_Z]=GEAT_Example
- % 遗传算法的一些参数设置
- % 上下界
- ub_lb=[-5 -5;5 5];
- % 各种概率和其他参数
- % 各种概率和其他参数
- % 种群
- Population=10;
- % 最大进化代数
- MaxIteration=100;
- % 选择概率
- SelectionProbability=0.9;
- % 交配概率
- CrossoverProbability=0.7;
- % 变异概率
- MutationProbability=0.02;
- % 多少变量
- NumberofIndividuals=2;
- % 准确度
- Precision=15;
- % 建立扫描区间
- FielD=[repmat(Precision,1,NumberofIndividuals);ub_lb;repmat([1;0;1;1],1,NumberofIndividuals)];
- % 初始的迭代数目
- Iteration=0;
- % 初始的种群
- Chromsome=CRTBP(Population,NumberofIndividuals*Precision);
- % X是初始的自变量种群
- X=BS2RV(Chromsome,FielD);
- % ObjV是初始的适应度
- ObjV=ObjVfun(X);
- % 最优参数的跟踪
- Trace=zeros(MaxIteration,3);
- while Iteration<MaxIteration
- % 寻找最大值
- FitV=RANKING(ObjV);
- SelCh=SELECT('SUS',Chromsome,FitV,SelectionProbability);
- SelCh=RECOMBIN('XOVSP',SelCh,CrossoverProbability);
- SelCh=MUT(SelCh,MutationProbability);
- % 子代的转换
- X=BS2RV(SelCh,FielD);
- ObjSelV=ObjVfun(X);
- [Chromsome,ObjV]=REINS(Chromsome,SelCh,1,1,ObjV,ObjSelV);
- % 得到了新的种群
- X=BS2RV(Chromsome,FielD);
- % 迭代次数加1
- Iteration=Iteration+1;
- % ObjV和X为新的种群和适应度值
- value_x=X(:,1);
- value_y=X(:,2);
- value_z=ObjV;
- [Optimal_Z,index]=min(value_z);
- Optimal_X=value_x(index);
- Optimal_Y=value_y(index);
- Trace(Iteration,:)=[Optimal_X,Optimal_Y,Optimal_Z];
- end
- %% 作图
- h_figure=figure('position',[1,1,800,500],'color','w');
- movegui(h_figure,'center');
- x=-1.5:0.05:1.5;
- y=-1.5:0.05:1.5;
- [X,Y]=meshgrid(x,y);
- Z=exp(X.^2+Y.^2);
- h_mesh=meshz(X,Y,Z);
- colormap('HSV')
- view(-20,40)
- set(h_mesh,'linewidth',1,'edgelighting','phong')
- xlabel('X','FontName','华文楷体','FontSize',14);
- ylabel('Y','FontName','华文楷体','FontSize',14);
- zlabel('Z','FontName','华文楷体','FontSize',14);
- title('基于谢菲尔德大学遗传算法工具箱的遗传算法最优寻找','FontName','华文楷体','FontSize',16);
- set(gca,'fontname','华文楷体','fontsize',14)
- hold on
- plot3(Optimal_X,Optimal_Y,Optimal_Z,'kp','markerfacecolor','k','markersize',25)
- % 换一个角度
- text(Optimal_X,Optimal_Y,Optimal_Z+1.5,'最小值点','FontName','华文楷体','FontSize',20);
- % 将跌代数分为三层查看迭代的效果
- plot3(Trace(:,1),Trace(:,2),Trace(:,3),'bo-','linewidth',1,'markersize',10,'markerfacecolor','b')
- end
- %% 示例举例函数
- %% 示例举例函数
- function ObjV=ObjVfun(X)
- ObjV=exp(X(:,1).^2+X(:,2).^2);
- end
3,自己编写的一个算法,能计算出来,但是觉得算法有缺陷,需要修改
每次输入 [Optimal_X,Optimal_Y,Optimal_Z]=GA_AgoriOne_Example 后,每次收敛的程度都不一样,这部分欢迎大家探讨。
本帖隐藏的内容
- %% 基于详细的算法来构建遗传算法
- %% by fantuanxiaot
- function [Optimal_X,Optimal_Y,Optimal_Z]=GA_AgoriOne_Example
- % [Optimal_X,Optimal_Y,Optimal_Z]=GA_Agori_Example直接输入即可
- global x1_upper
- global x1_lower
- global x2_upper
- global x2_lower
- global Precision
- global m1
- global m2
- % X1和X2的上下界
- x1_upper=2;
- x1_lower=-2;
- x2_upper=2;
- x2_lower=-2;
- % 精度的设置
- Precision=10000;
- % 构成了染色体窜
- m1=ceil(log2((x1_upper-x1_lower)*Precision));
- m2=ceil(log2((x2_upper-x2_lower)*Precision));
- M=m1+m2;
- % 种群的个数
- Population_Num=50;
- Population_1=round(rand(Population_Num,m1));
- Population_2=round(rand(Population_Num,m2));
- % 概率
- CrossOverProbability=0.8;
- MutationProbability=0.01;
- MaxIteration=100;
- for i=1:MaxIteration
- Initial_1=TransFrom_Two_To_Ten(Population_1,m1,x1_lower,x1_upper);
- Initial_2=TransFrom_Two_To_Ten(Population_2,m2,x2_lower,x2_upper);
- % 计算适应度
- f=ObjFun_Matrix([Initial_1,Initial_2]);
- % 计算最优的种群
- [Optimal_Z,index]=min(f);
- Optimal_X=Initial_1(index);
- Optimal_Y=Initial_2(index);
- % 种群的选择
- New_Population=Population_Selection(f,Population_1,Population_2);
- % 交配
- New_Population=Population_CrossOver(New_Population,CrossOverProbability);
- % 突变
- New_Population=Population_Mutation(New_Population,MutationProbability);
- Population_1=New_Population(:,1:m1);
- Population_2=New_Population(:,(m1+1):M);
- end
- end
- %% 基因的交配
- %% 基因的交配
- function New_Population=Population_CrossOver(Old_Population,CrossOverProbability)
- % 参与交配的染色体个数
- [sizeM,sizeN]=size(Old_Population);
- for i=1:sizeM
- % 随机选择两条染色体
- n1=0;
- n2=0;
- while n1==n2
- n1=ceil(rand*sizeM);
- n2=ceil(rand*sizeM);
- end
- % 如果随机的概率小于CrossOverProbability则进行交配,否则继续
- if(rand>CrossOverProbability)
- continue;
- end
- % 检测和判断
- Old_Population_n1=Old_Population(n1,:);
- Old_Population_n2=Old_Population(n2,:);
- f1_Old=Test_Population(Old_Population_n1);
- f2_Old=Test_Population(Old_Population_n2);
- % 进行交配
- % 随机生成交叉位置
- M=ceil(rand*(sizeN-1));
- Temp_Population=Old_Population_n2(M+1:end);
- Old_Population_n2(M+1:end)=Old_Population_n1(M+1:end);
- Old_Population_n1(M+1:end)=Temp_Population;
- f1_New=Test_Population(Old_Population_n1);
- f2_New=Test_Population(Old_Population_n2);
- % 重新放回原位
- if (min(f1_New,f2_New)<=min(f1_Old,f2_Old))
- Old_Population(n1,:)=Old_Population_n1;
- Old_Population(n2,:)=Old_Population_n2;
- end
- end
- New_Population=Old_Population;
- end
- %% 基因的突变
- %% 基因的突变
- function New_Population=Population_Mutation(Old_Population,MutationProbability)
- [sizeM,sizeN]=size(Old_Population);
- for i=1:sizeM
- if(rand>MutationProbability)
- continue;
- end
- % 随机选择一条染色体
- index=ceil(sizeM*rand);
- % 产生变异的点
- N=ceil(sizeN*rand);
- Old_Population_M=Old_Population(index,:);
- f_Old=Test_Population(Old_Population_M);
- if (Old_Population_M(N)==1)
- Old_Population_M(N)=0;
- elseif Old_Population_M(N)==0
- Old_Population_M(N)=1;
- end
- f_New=Test_Population(Old_Population_M);
- if(f_New<=f_Old)
- Old_Population(index,:)=Old_Population_M;
- end
- end
- New_Population=Old_Population;
- end
- %% 一个判断条件
- %% 一个判断条件
- function Test=Test_Population(Population)
- global x1_upper
- global x1_lower
- global x2_upper
- global x2_lower
- global m1
- global m2
- Population1=Population(:,1:m1);
- Population2=Population(:,(m1+1):end);
- Initial1=TransFrom_Two_To_Ten(Population1,m1,x1_lower,x1_upper);
- Initial2=TransFrom_Two_To_Ten(Population2,m2,x2_lower,x2_upper);
- Test=ObjFun_One([Initial1 Initial2]);
- end
- %% 新种群的复制
- %% 新种群的复制
- function New_Population=Population_Selection(x,Old_Population1,Old_Population2)
- %% x是适应度的值
- %% Old_Population=[Population_1 Population_2];
- x=1./x;
- % 得到了每个染色体被复制的概率
- Probability=x/sum(x);
- % 得到了每个染色体被复制的累积概率
- CumProbability=cumsum(Probability);
- New_Population1=[];
- New_Population2=[];
- for i=1:length(x)
- index=find(rand<=CumProbability);
- index=index(1);
- New_Population1=[New_Population1;Old_Population1(index,:)];
- New_Population2=[New_Population2;Old_Population2(index,:)];
- end
- % 最终得到了新的种群
- New_Population=[New_Population1 New_Population2];
- end
- %% 二进制转换为十进制
- %% 二进制转换为十进制
- function Initial=TransFrom_Two_To_Ten(x,precision_m,lower,upper)
- % precision是精度
- % x是染色体群
- % x是某一列
- [N,~]=size(x);
- Initial=zeros(N,1);
- for i=precision_m:-1:1
- Initial=Initial+x(:,i).*2^(i-1);
- end
- Initial=lower+Initial*(upper-lower)/(2^precision_m-1);
- end
- %% 向量目标函数
- %% 向量目标函数
- function f=ObjFun_Matrix(x)
- f=exp(x(:,1).^2+x(:,2).^2);
- end
- %% 目标函数
- %% 目标函数
- function f=ObjFun_One(x)
- f=exp(x(1)^2+x(2)^2);
- end

202 个论坛币


雷达卡







京公网安备 11010802022788号







