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
选择二进制编码,具体参数设置如下:
代码:
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<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; %%记下每一代的最优值
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']);
结果: