基本原理:
遗传算法是一种典型的启发式算法,属于非数值算法范畴。它是模拟达尔文的自然选择学说和自然界的生物进化过程的一种计算模型。它是采用简单的编码技术来表示各种复杂的结构,并通过对一组编码表示进行简单的遗传操作和优胜劣汰的自然选择来指导学习和确定搜索的方向。遗传算法的操作对象是一群二进制串(称为染色体、个体),即种群,每一个染色体都对应问题的一个解。从初始种群出发,采用基于适应度函数的选择策略在当前种群中选择个体,使用杂交和变异来产生下一代种群。如此模仿生命的进化进行不断演化,直到满足期望的终止条件。
运算流程:
Step 1:对遗传算法的运行参数进行赋值。参数包括种群规模、变量个数、交叉概率、变异概
率以及遗传运算的终止进化代数。
Step 2:建立区域描述器。根据轨道交通与常规公交运营协调模型的求解变量的约束条件,设置变量的取值范围。
Step 3:在Step 2的变量取值范围内,随机产生初始群体,代入适应度函数计算其适应度值。
Step 4:执行比例选择算子进行选择操作。
Step 5:按交叉概率对交叉算子执行交叉操作。
Step 6:按变异概率执行离散变异操作。
Step 7:计算Step 6得到局部最优解中每个个体的适应值,并执行最优个体保存策略。
Step 8:判断是否满足遗传运算的终止进化代数,不满足则返回Step 4,满足则输出运算结果。
运用遗传算法工具箱:
运用基于Matlab的遗传算法工具箱非常方便,遗传算法工具箱里包括了我们需要的各种函数库。目前,基于Matlab的遗传算法工具箱也很多,比较流行的有英国设菲尔德大学开发的遗传算法工具箱GATBX、GAOT以及Math Works公司推出的GADS。实际上,GADS就是大家所看到的Matlab中自带的工具箱。我在网上看到有问为什么遗传算法函数不能调用的问题,其实,主要就是因为用的工具箱不同。因为,有些人用的是GATBX带有的函数,但MATLAB自带的遗传算法工具箱是GADS,GADS当然没有GATBX里的函数,因此运行程序时会报错,当你用MATLAB来编写遗传算法代码时,要根据你所安装的工具箱来编写代码。
以GATBX为例,运用GATBX时,要将GATBX解压到Matlab下的toolbox文件夹里,同时,set path将GATBX文件夹加入到路径当中。
例子:
这块内容主要包括两方面工作:1、将模型用程序写出来(.M文件),即目标函数,若目标函数非负,即可直接将目标函数作为适应度函数。2、设置遗传算法的运行参数。包括:种群规模、变量个数、区域描述器、交叉概率、变异概率以及遗传运算的终止进化代数等等。
求解模型: f(x)=x*sin(10*pi*x)+2.0,x的范围在【-1,2】
根据上面的求解模型,可以写出模型的.M文件如下,即适应度函数
function z=shang(x)
z=x.*sin(10*pi*x)+2.0;
然后写入遗传算法的参数:
figure(1);
fplot(‘variable.*sin(10*pi*variable)+2.0’,[-1,2]); %画出函数曲线
NIND=40; %个体数目(Number of individuals)
MAXGEN=25; %最大遗传代数(Maximum number of generations)
PRECI=20; %变量的二进制位数(Precision of variables)
GGAP=0.9; %代沟(Generation gap)
trace=zeros(2, MAXGEN); %寻优结果的初始值
FieldD=[20;-1;2;1;0;1;1]; %区域描述器(Build field descriptor)
Chrom=crtbp(NIND, PRECI); %初始种群
gen=0; %代计数器
variable=bs2rv(Chrom, FieldD); %计算初始种群的十进制转换
ObjV=shang(variable); %计算目标函数值
while gen<MAXGEN
FitnV=ranking(-ObjV); %分配适应度值(Assign fitness values)
SelCh=select(‘sus’, Chrom, FitnV, GGAP); %选择
SelCh=recombin(‘xovsp’, SelCh, 0.7); %重组
SelCh=mut(SelCh); %变异
variable=bs2rv(SelCh, FieldD); %子代个体的十进制转换
ObjVSel=shang(variable); %计算子代的目标函数值
[Chrom ObjV]=reins(Chrom, SelCh, 1, 1, ObjV, ObjVSel); %重插入子代的新种群
variable=bs2rv(Chrom, FieldD);
gen=gen+1; %代计数器增加
%输出最优解及其序号,并在目标函数图像中标出,Y为最优解,I为种群的序号
[Y, I]=max(ObjV);hold on;
plot(variable(I), Y, ‘bo’);
trace(1, gen)=max(ObjV); %遗传算法性能跟踪
trace(2, gen)=sum(ObjV)/length(ObjV);
end
variable=bs2rv(Chrom, FieldD); %最优个体的十进制转换
hold on, grid;
plot(variable,ObjV,’b*’);
figure(2);
plot(trace(1,:));
hold on;
plot(trace(2,:),’-.’);grid
legend(‘解的变化’,’种群均值的变化’)