【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
入门matlab遗传算法的时候,如果你找来一本书,例如雷英杰的《matlab遗传算法工具箱及其应用》,先看概念,看数学原理,看懂了,看例子,再开始写程序,将是一个“漫长”的过程。个人认为最快的方法是从例子开始,先简单粗略地扫过几个重要的概念、算法流程图,然后找一本书,跟着书敲出例子,在命令窗口下一行一行地看每一句代码出来什么结果。
matlab遗传算法方面好像没有什么好书,中文的书好像最流行《matlab遗传算法工具箱及其应用》,我看的就是这一本。书中的第一个例子是一元函数和优化,因为是扫描版,只能自己慢慢敲,贴在这里,需要的直接复制粘贴吧
注意你复制粘贴后,可能引号、逗号会变成中文格式,在matlab中显示为红色,你要改一下。
Figure(1);%(注:原文F大写,应该小写figure(1),下面的figure(2)也一样。)
fplot(‘variable .* sin(10 * pi * variable) + 2.0’,[-1, 2]);%画出目标函数图
%定义遗传算法参数
MAXGEN = 25;%最大遗传代数
PRECI = 20;%变量的二进制位数(注:也就是精度)
GGAP = 0.9;%代沟
trace = zeros(2, MAXGEN);%寻优结果,初始值
FieldD = [20; -1;2;1;0;1;1];%区域描述器
Chrom = crtbp(NIND,PRECI);%初始种群
gen = 0;%代计数器
variable = bs2rv(Chrom,FieldD);%初始种群转成十进制数
ObjV = variable .* sin(10 * pi * variable) + 2.0;%目标函数值
while gen <= MAXGEN,
FitnV = ranking(-ObjV);%分配适应度值
%(注:函数ranking的功能是:基于排序的适应度值分配,根据个体的目标值由小到大的顺序对它们进行排序,并返回一包含对应个体适应度值FitnV的列向量。
压差是指:分配的个体适应度值的差距,最好的和最坏的,他对原来的函数值没有影响,只是根据原来的函数值来分配一个体现个体优劣的一个值。)
SelCh = select('sus',Chrom,FitnV,GGAP);%选择
SelCh = recombin('xovsp',SelCh,0.7);%重组,即交叉
SelCh = mut(SelCh); %变异
variable = bs2rv(SelCh,FieldD);%子代十进制转换
ObjVSel = variable .* sin(10 * pi * variable) + 2.0;%子代目标函数值
[Chrom ObjV] = reins(Chrom, SelCh, 1, 1, ObjV, ObjVSel);%重插入子代新种群
gen = gen + 1; %(注:matlab不支持gen += 1)
[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('解的变化', '种群均值的变化');
未完待续
来源:oschina
链接:https://my.oschina.net/u/1180521/blog/156010