谢菲尔德大学遗传算法工具介绍-matlab

来源:互联网 发布:php httpclient 类库 编辑:程序博客网 时间:2024/06/10 04:56

1.简介

遗传算法(genetic algorithm,GA)是一种仿效生物学界“物竞天择,适者生存”的演化法则变化而来。遗传算法中,通过八问题参数编码成染色体,利用迭代的方进行选择、交叉以及变异等运算来交换种群中染色体的信息,最终生成符合优化目标的染色体。

染色体对应着数据或者数组,一般是一维的串结构数据表示,串上各个位置对应基因的取值。而基因组成的串就是染色体,或者说是基因型个体。种群中个体数目称为群体大小,也称为种群规模,各个个体对环境的适应程度就是适应度。

二:遗传算法基本步骤

1.编码

2.初始种群的生成

3.适应度评估

4.选择

5.交叉

6.变异

三:matlab工具介绍

1.crtbp

创建种群:[chrom,Lind,BaseV] = crtbp(Nid,Lind,Base)

创建大小为NindXLind大小的种群,个体各位的进制数为base:

 [Chrom,Lind,BaseV] = crtbp(5,8,[2 3 4 5 6 7 8 9])
Chrom =
     0     1     3     4     5     2     2     2
      1     2     1     2     1     1     6     6
      1     1     2     0     4     1     4     6
      0     1     2     0     1     4     4     3
      0     0     3     1     5     3     7     5
Lind =
      8
BaseV =
      2     3     4     5     6     7     8     9

2.ranking,适应度计算函数

FitnV = ranking(ObjV)

按照个体的目标值ObjV(列向量)由小到大顺序对个体进行排序,并返回个体适应值FitV的列向量

FitnV = ranking(ObjV,RFun)

(1)若RFun是一个在[1,2]区间内的标量,则采用线性顺序排序,这个标量指定选择的压差

(2)若RFun是一个具有两个参数的向量,则

RFun(2):指定排序方法,0为线性排序,1为非线性排序

RFun(1):

对于线性排序,标量指定的选择压差RFun(1)必须为【1,2】之间;对于非线性排序,RFun(1)必须在[1,length(ObjV)-2]之间。如果为NAN,默认为2.

FitnV = ranking(ObjV,RFun,SUBPOP)

前两个参数与上面的一致,不过最后一个参数指定子种群个数,默认为1.

etc:

ObjV=[1;2;3;4;5;6;7;8;9;8;7;6]

FitnV=ranking(ObjV)

RFun = [3;5;7;10;14;18;25;30;40;50;60;70]

等等等很多函数。

四:例子学习

使用遗传算法计算以下函数的最小值:

f(x)= (sin⁡(10πx))/x

选择二进制编码,具体参数设置如下:


代码:

clcclear all,close all%%画出函数图figure(1);hold on;%%函数自变量范围Ib = 1,Ub = 2;ezplot('sin(10*pi*X)/X',[Ib,Ub]);xlabel('自变量/X')ylabel('函数值/Y')%%定义遗传算法参数NIND= 40;  %%种群大小MAXGEN = 50;  %%最大遗传代数PRECI = 20;  %%个体长度GGAP = 0.95;  %%代沟px = 0.7;  %%交叉概率pm = 0.01;  %%变异概率trace = zeros(2,MAXGEN);  %%寻找最优结果初始值FieldD = [PRECI;Ib;Ub;1;0;1;1];  %%区域描述器Chrom = crtbp(NIND,PRECI);  %%创建任意离散随机种群%%优化gen = 0;  %%代计数器X = bs2rv(Chrom,FieldD);  %%初始种群的十进制数转换ObjV = sin(10*pi*X)./X;  %%计算目标函数值while gen<MAXGEN    FitnV = ranking(ObjV);  %%分配适应度值    SelCh = select('sus',Chrom,FitnV,GGAP);  %%选择    selCh = recombin('xovsp',SelCh,px);  %%重组    SelCh = mut(SelCh,pm);  %%变异    X = bs2rv(SelCh,FieldD);  %%子代个体的十进制转换    ObjVSel = sin(10*pi*X)./X;  %%计算子代的目标函数值    [Chrom,ObjV] = reins(Chrom,SelCh,1,1,ObjV,ObjVSel);  %%重新插入子代到父代,得到新的种群    X = bs2rv(Chrom,FieldD);    gen = gen + 1;  %%子代计数器增加    %获取每一代的最优解及其序列号,Y为最优解,I为个体序号    [Y,I] = min(ObjV);      trace(1,gen) = X(I);  %%记下每一代的最优值    trace(2,gen) = Y;   %%记下每一代的最优值endplot(trace(1,:),trace(2,:),'bo');  %%画出每一代的最优点grid on;plot(X,ObjV,'b*');  %%画出最后一代种群hold off;%%画进画图figure(2);plot(1:MAXGEN,trace(2,:));grid on;xlabel('遗传代数')ylabel('解得变化');title('进化过程');bestY = trace(2,end);bestX = trace(1,end);fprintf(['最优解:\nX=',num2str(bestX),'\nY=',num2str(bestY),'\n']);
结果:



原创粉丝点击