当前位置:文档之家› 第七章 遗传算法应用举例

第七章 遗传算法应用举例

97 第七章 遗传算法应用举例 遗传算法提供了一种求解非线性、多模型、多目标等复杂系统优化问题的通用框架,它不依赖于问题具体的领域。随着对遗传算法技术的不断研究,人们对遗传算法的实际应用越来越重视,它已经广泛地应用于函数优化、组合优化、自动控制、机器人学、图象处理、人工生命、遗传编码、机器学习等科技领域。遗传算法已经在求解旅行商问题、背包问题、装箱问题、图形划分问题等多方面的应用取得了成功。本章通过一些例子,介绍如何利用第五章提供的遗传算法通用函数,编写MATLAB程序,解决实际问题。

7.1 简单一元函数优化实例 利用遗传算法计算下面函数的最大值: ()sin(10)2.0[1,2]fxxxx, 选择二进制编码,种群中个体数目为40,每个种群的长度为20,使用代沟为0.9,最大遗传代数为25。 下面为一元函数优化问题的MATLAB代码。 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); %遗传算法性能跟踪 98

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 ('解的变化','种群均值的变化') 使用基于适应度的重插入确保四个最适应的个体总是被连续传播到下一代。这样在每一代中有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]fxxxx,的图象。 99

图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。 100

图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函数的表达式为

求解 min()512512ifxx, 这里n是定义问题维数的一个值。这个例子中选取n=20。 由De Jong函数的表达式可以看出,De Jong函数是一个简单的平方和函数,只有一个极小点(0,0,…,0),理论最小值为f(0,0,…,0)=0。 程序的主要变量:个体的数量NIND为40,最大遗传代数为MAXGEN=300,变量维数为NVAR=20,每个变量使用20位表示,即PRECI = 20,使用代沟GGAP=0.9。 下面为求解De Jong函数最小值的MATLAB代码。 % 定义遗传算法参数 NIND = 40; % 个体数目(Number of individuals) MAXGEN =500; % 最大遗传代数(Maximum number of generations)

21()512512, niiifxxx 101

NVAR = 20; % 变量的维数 PRECI = 20; % 变量的二进制位数(Precision of variables) GGAP = 0.9; % 代沟(Generation gap) trace=zeros (MAXGEN,2); % 建立区域描述器(Build field descriptor) FieldD = [rep ([PRECI],[1,NVAR]);rep ([-512;512],[1,NVAR]);rep ([1;0;1;1],[1,NVAR])]; Chrom = crtbp (NIND, NVAR*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); end plot (trace (:,1));hold on; plot (trace (:,2),'-.');grid; legend ('种群均值的变化','解的变化') 区域描述器的构建采用矩阵复制函数rep建立矩阵FieldD,描述染色体的表示和解释。 一个初始种群被函数crtbp创建,随后产生一个矩阵Chrom,它由NIND个均匀分布长度为NVAR*PRECI的二进制串构成。 使用函数objfun1重新计算目标函数,初始种群中的所有个体的目标函数值由下面程序段计算: ObjV = objfun1(bs2rv (Chrom, FieldD)); 函数bs2rv根据域描述器FieldD转换矩阵Chrom的二进制串为实值,返回一实值表现型的矩阵。这个bs2rv返回值矩阵通过直接作为目标函数objfun1的输入变量,目标函数结果被返回在矩阵ObjV中。 这个例子中基于排序的适应度分配计算由下面程序段实现: FitnV = ranking (ObjV); 对这个等级评定算法的缺省设置是选择等差2,使用线性评估,给最适应个体的适应度值为2和最差个体的适应度值为0。适应度值结果被向量FitnV返回。 使用高级函数选择调用低级函数随机遍历抽样例程sus,程序段为: SelCh = select (’sus’, Chrom, FitnV, GGAP); 后面的选择中,SelCh包含来自原始染色体的GGAP *NIND个个体,这些个体将使用高级函数recombin进行重组,程序段为: SelCh = recombin ('xovsp', SelCh, 0.7); 函数recombin使个体通过SelCh被选择再生产,并使用单点交叉例程函数xovsp,使用交叉概率Px =0.7执行并叉。个体作为矩阵SelCh的输入被排序,以便使奇数位置的个体与它相邻的个体进行交叉,如果SelCh个体的数量是奇数个,则最后一个个体不进行交叉而返回。交叉后产生的子代被同一个矩阵SelCh返回,实际使用的交叉例程通过支持使用不同函数名字串

相关主题