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

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

matlab vtu,谢菲尔德大学遗传算法工具介绍-matlab-编程之家

代码:

clc

clear 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

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; %%记下每一代的最优值

end

plot(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']);

结果:

matlab vtu,谢菲尔德大学遗传算法工具介绍-matlab-编程之家

matlab vtu,谢菲尔德大学遗传算法工具介绍-matlab-编程之家