第七章 遗传算法应用举例遗传算法提供了一种求解非线性、多模型、多目标等复杂系统优化问题的通用框架,它不依赖于问题具体的领域。
随着对遗传算法技术的不断研究,人们对遗传算法的实际应用越来越重视,它已经广泛地应用于函数优化、组合优化、自动控制、机器人学、图象处理、人工生命、遗传编码、机器学习等科技领域。
遗传算法已经在求解旅行商问题、背包问题、装箱问题、图形划分问题等多方面的应用取得了成功。
本章通过一些例子,介绍如何利用第五章提供的遗传算法通用函数,编写MATLAB 程序,解决实际问题。
7.1 简单一元函数优化实例利用遗传算法计算下面函数的最大值:()sin(10) 2.0[1,2]f x x x x π=⋅+∈-,选择二进制编码,种群中个体数目为40,每个种群的长度为20,使用代沟为0.9,最大遗传代数为25。
下面为一元函数优化问题的MA TLAB 代码。
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 = variable.*sin (10*pi*variable)+2.0; % 计算目标函数值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 =variable.*sin(10*pi*variable)+2.0; % 计算子代的目标函数值[Chrom ObjV]=reins(Chrom,SelCh,1,1,ObjV ,ObjVSel); % 重插入子代的新种群 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);endvariable=bs2rv (Chrom,FieldD); %最优个体的十进制转换hold on,grid;plot (variable',ObjV','b*');figure (2);plot (trace (1,:)');hold on;plot (trace (2,:)','-.');grid;legend ('解的变化','种群均值的变化')使用基于适应度的重插入确保四个最适应的个体总是被连续传播到下一代。
这样在每一代中有36(NIND*GGAP )个新个体产生。
区域描述器FieldD 描述染色体的表示和解释,每个格雷码采用20位二进制,变量区间为[-1,2]。
程序段Chrom = crtbp (NIND, PRECI)表示一个初始种群Chrom 被函数crtbp 创建,它是由NIND 个均匀分布长度为PRECI 的二进制串矩阵构成。
基于排序的适应度分配计算由程序段FitnV = ranking (-ObjV)实现。
对这个等级评定算法的缺省设置是选择等差为2和使用线性评估,给最适应个体的适应度值为2,最差个体的适应度值为0,这里的评定算法假设目标函数是最小化的,所以ObjV 乘了一个负号,使目标函数为最大化。
适应度值结果被向量FitnV 返回。
选择层使用高级函数选择调用低级函数随机遍历抽样例程sus ,SelCh 包含来自原始染色体的GGAP *NIND 个个体,这些个体将使用高级函数recombin 进行重组,recombin 使个体通过SelCh 被选择再生产,并使用单点交叉例程xovsp ,使用交叉概率Px =0.7执行并叉。
交叉后产生的子代被同一个矩阵SelCh 返回,实际使用的交叉例程通过支持使用不同函数名字串传递给recombin 而改变。
为了产生一组子代,变异使用变异函数mut 。
子代再次由矩阵SelCh 返回,变异概率缺省值PM=0.7/Lind= 0.0017,这里Lind 是假定的个体长度。
再次使用bs2rv ,将个体的二进制编码转换为十进制编码,计算子代的目标函数值ObjVSel 。
由于使用了代沟,所以子代的数量比当前种群数量要小,因此需要使用恢复函数reins 。
这里Chrom 和 SelCh 是矩阵,包含原始种群和子代结果。
这两个事件的第一个被使用单个种群和采用基于适应度的恢复,基于适应度的恢复用SelCh 中的个体代替Chrom 中最不适应的个体。
新种群中的个体是由原始种群中的优良个体和子代中新产生的个体组成。
原始种群中个体的目标函数值ObjV 随后又作为函数reins 的输入参数,子代中个体的目标函数值由ObjVSel 提供。
Reins 返回具有插入子代的新种群Chrom 和该种群中个体的目标函数值ObjV 。
每次迭代后的最优解和解的均值存放在trace 中。
这个遗传优化的结果包含在矩阵ObjV 中。
决策变量的值为variable (I)。
画出迭代后个体的目标函数值分布图和遗传算法性能跟踪图。
遗传算法的运行结果如下:(1)图7.1为目标函数()sin(10) 2.0[1,2]f x x x x π=⋅+∈-,的图象。
图7.1 目标函数图像(2)图7.2为目标函数的图像和初始随机种群个体分布图。
图7.2 初始种群分布图(3)经过1次遗传迭代后,寻优结果如图7.3所示。
x=1.6357,f(x)=3.4729。
图7.3 一次遗传迭代后的结果(4)经过10次遗传迭代后,寻优结果如图7.4所示。
x= 1.8518,f(x)=3.8489。
图7.4 经过10次遗传迭代后的结果(5)经过25次遗传迭代后,寻优结果如图7.5所示。
x =1.8505,f (x )=3.8503。
图7.5 经过25次遗传迭代后的结果(6)经过25次迭代后最优解的变化和种群均值的变化见图7.6。
图7.6 经过25次迭代后最优解的变化和种群均值的变化7.2 多元单峰函数的优化实例目标函数是De Jong 函数,是一个连续、凸起的单峰函数,它的M 文件objfun1包含在GA 工具箱软件中。
De Jong 函数的表达式为求解m i n ()51251i f x x -≤≤, 这里n 是定义问题维数的一个值。
这个例子中选取n =20。
由De Jong 函数的表达式可以看出,De Jong 函数是一个简单的平方和函数,只有一个极小点(0,0,…,0),理论最小值为f (0,0,…,0)=0。
程序的主要变量:个体的数量NIND 为40,最大遗传代数为MAXGEN=300,变量维数为NV AR=20,每个变量使用20位表示,即PRECI = 20,使用代沟GGAP=0.9。
下面为求解De Jong 函数最小值的MATLAB 代码。
% 定义遗传算法参数NIND = 40; % 个体数目(Number of individuals)MAXGEN =500; % 最大遗传代数(Maximum number of generations)21()512512==-≤≤∑, ni i i f x x xNV AR = 20; % 变量的维数PRECI = 20; % 变量的二进制位数(Precision of variables)GGAP = 0.9; % 代沟(Generation gap)trace=zeros (MAXGEN,2);% 建立区域描述器(Build field descriptor)FieldD = [rep ([PRECI],[1,NV AR]);rep ([-512;512],[1,NV AR]);rep ([1;0;1;1],[1,NV AR])];Chrom = crtbp (NIND, NV AR*PRECI); % 创建初始种群gen = 0; % 代计数器ObjV = objfun1(bs2rv (Chrom,FieldD)); % 计算初始种群个体的目标函数值while gen < MAXGEN, % 迭代FitnV = ranking (ObjV); % 分配适应度值(Assign fitness values)SelCh = select ('sus', Chrom, FitnV, GGAP); % 选择SelCh = recombin ('xovsp',SelCh,0.7); % 重组SelCh = mut (SelCh); % 变异ObjVSel = objfun1 (bs2rv (SelCh,FieldD)); %计算子代目标函数值[Chrom ObjV]=reins (Chrom,SelCh,1,1,ObjV,ObjVSel); % 重插入gen = gen+1; % 代计数器增加% 输出最优解及其对应的20个自变量的十进制值,Y为最优解,I为种群的序号trace (gen,1)=min (ObjV); % 遗传算法性能跟踪trace (gen,2)=sum (ObjV)/length (ObjV);endplot (trace (:,1));hold on;plot (trace (:,2),'-.');grid;legend ('种群均值的变化','解的变化')区域描述器的构建采用矩阵复制函数rep建立矩阵FieldD,描述染色体的表示和解释。