MATLAB遗传算法学习 Sheffield的gatbx (1)

爱⌒轻易说出口 提交于 2019-12-20 10:02:14

【推荐】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]);%画出目标函数图

%定义遗传算法参数

NIND = 40;%个体数目

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('解的变化', '种群均值的变化');

 

未完待续

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!