第七章 遗传算法应用举例

更新时间:2024-01-31 02:28:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第七章 遗传算法应用举例

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

7.1 简单一元函数优化实例

利用遗传算法计算下面函数的最大值:

f(x)?xsin(10??x)?2.0,x?[?1,2]

选择二进制编码,种群中个体数目为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); %遗传算法性能跟踪

97

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为目标函数f(x)?xsin(10??x)?2.0,x?[?1,2]的图象。

98

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

99

(((

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

f(x)??xi2, ?512?xi?512i?1n求解

minfx(,) ?51?2ix? 51这里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)

100

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返回,实际使用的交叉例程通过支持使用不同函数名字串

101

传递给recombin而改变。

为了产生一组子代,变异现在使用变异函数mut: SelCh = mut (SelCh);

子代再次由矩阵SelCh返回,函数调用中变异概率没有被指定,这个缺省值PM=0.7/Lind= 0.0017,这里Lind是个体的长度。

子代的目标函数值ObjVSel由程序段计算: ObjVSel = objfun1 (bs2rv (SelCh, FieldD));

因为使用了代沟,子代的数量比当前种群数量要小,完成使用恢复函数reins:[Chrom,ObjV]=reins (Chrom, SelCh,1,1,ObjV,ObjVSel);

这里,Chrom 和 SelCh是矩阵包含原始种群和子代结果。这两个事件的第一个被使用单个种群和采用基于适应度的恢复,基于适应度的恢复用SelCh中的个体代替Chrom 中最不适应的个体。原始种群目标函数值ObjV随后被要求作为reins的参数,另外新种群的目标函数值不用重新计算整个种群的目标函数而返回,子代的目标值ObjVSel被提供。Reins返回具有插入子代的新种群Chrom和这个种群的目标函数值ObjV。

这个遗传优化的结果包含在矩阵ObjV中,决策变量的值可能被包含在下面程序段中: Phen = bs2rv (Chrom, FieldD); 遗传算法的运行结果如下:

(1)图7.7为二维De Jong函数图形。

图7.7 二维De Jong函数图形

(2)初始种群中个体的目标函数值分布图如图7.8所示。

图7.8 初始种群中个体的目标函数值分布图

(3)经过20次遗传迭代后的结果如图7.9所示。此时minf(x)= 2.7412e+005。

102

图7.9 经过20次遗传迭代后的结果

(4)经过100次遗传迭代后的结果如图7.10所示。此时minf(x)= 6.9666e+003。

图7.10 经过100次遗传迭代后的结果

(5) 经过250次遗传迭代后的结果如图7.11所示。此时minf(x)= 409.4516。

图7.11 经过250次遗传迭代后的结果

(6)经过500次遗传迭代后的结果如图7.12所示。此时minf(x)= 4.2550。

图7.12 经过500次遗传迭代后的结果

(7) 经过250次迭代后种群目标函数均值的变化和最优解的变化如图7.13所示。minf(x)= 4.2550时20个变量的值见表7.1。

103

图7.13 经过250次迭代后种群目标函数均值的变化和最优解的变化

表7.1 目标函数取最优解时20个变量的值

-2.0015 0.1362 -0.0190 -0.0171 -0.0659 -0.1382 -0.0181 -0.0610 -0.0112 0.1274 -0.0142 0.0640 0.0474 0.0122 -0.0962 0.2524 -0.0708 0.2690 -0.1411 -0.0952 7.3 多元多峰函数的优化实例

Shubert函数为:

55??f(x1,x2)??icos[(i?1)?x1?i]??icos[(i?1)?x2?i] ?i?1i?1??10?x?10, (i?1,2)i?求

minf(x)。

图7.14为Shubert函数图像。

图7.14 Shubert函数图

下面为 Shubert函数寻优的MATLAB代码。

function z=Shubert (x,y) % Shubert函数

z= ( (1*cos ( (1+1)*x+1))+ (2*cos ( (2+1)*x+2))+ (3*cos ( (3+1)*x+3))+… (4*cos ( (4+1)*x+4))+ (5*cos ( (5+1)*x+5))).* ( (1*cos ( (1+1)*y+1))+…

(2*cos ( (2+1)*y+2))+ (3*cos ( (3+1)*y+3))+ (4*cos ( (4+1)*y+4))+ (5*cos ( (5+1)*y+5))); [x1,x2]=meshgrid (-10:.1:10);

104

Figure(1);mesh (x1,x2,Shubert (x1,x2)); % 画出Shubert函数图像 % 定义遗传算法参数

NIND = 40; % 个体数目(Number of individuals)

MAXGEN =50; % 最大遗传代数(Maximum number of generations) NVAR = 2; % 变量数目

PRECI = 25; % 变量的二进制位数(Precision of variables) GGAP =0.9; % 代沟(Generation gap) % 建立区域描述器(Build field descriptor)

FieldD = [rep ([PRECI],[1,NVAR]);rep ([-3;3],[1,NVAR]);rep ([1;0;1;1],[1,NVAR])]; Chrom = crtbp (NIND, NVAR*PRECI); % 创建初始种群 gen = 0;

trace=zeros (MAXGEN,2); % 遗传算法性能跟踪初始值 x=bs2rv (Chrom,FieldD); % 初始种群十进制转换

ObjV =Shubert (x (:,1),x (:,2)); % 计算初始种群的目标函数值 while gen < MAXGEN,

FitnV = ranking (ObjV); % 分配适应度值(Assign fitness values) SelCh = select ('sus', Chrom, FitnV, GGAP); % 选择 SelCh = recombin ('xovsp',SelCh,0.7); % 重组 SelCh = mut (SelCh); % 变异

x=bs2rv (SelCh,FieldD); % 子代十进制转换 ObjVSel =Shubert (x (:,1),x (:,2)) ; % 重插入 [Chrom ObjV]=reins (Chrom,SelCh,1,1,ObjV,ObjVSel); gen = gen+1; [Y,I]=min (ObjVSel);

Y, bs2rv (Chrom (I,:),FieldD)) ; % 输出最优解及其对应的自变量值 trace (gen,1)=min (ObjV);

trace (gen,2)=sum (ObjV)/length (ObjV); % 遗传算法性能跟踪

if (gen==50) % 迭代数为50时画出目标函数图 figure (2);

plot (ObjV);hold on; plot (ObjV,'b*');grid; end end

figure (3);clf;

plot (trace (:,1));hold on; plot (trace (:,2),'-.');grid;

legend ('解的变化','种群均值的变化') 遗传算法的显示结果如下:

(1)初始种群的目标函数值分布如图7.15所示。

105

图7.15 初始种群的目标函数值

(2)经过一次迭代后的目标函数值如图7.16所示。此时x1?-1.3900,x2?-2.9601,minf(x)=-44.5224。

图7.16 经过一次迭代后的结果

(3)经过10次迭代后的目标函数值如图7.17所示。此时x1?-1.3811,x2?0.8980,minf(x)=-186.0739。

图7.17 经过 10次迭代后的结果

(4)经过50次迭代后的目标函数值如图7.18所示。此时x1?-1.4342,x2?-0.8003,minf(x)= -186.7309。

106

图7.18 经过50次迭代后的结果

(5)经过50次迭代后,种群目标函数均值的变化和最优解的变化如图7.19所示。

图7.19 经过50次迭代后种群目标函数均值的变化和最优解的变化

7.4 收获系统最优控制

收获系统(Harvest)是一个一阶的离散方程,表达式为:

?x(k?1)?a*x(k)?u(k)?tx(0)?x(N)?s..k?1,2,,N.

这里x(0)是一个初始的状态条件,a是一个刻度常量,x(k)?R,u(k)?R? 是状态和非常控制,N是解决问题使用的步骤数。

目标函数为:

maxf(u)??u(k)

k?1N这个问题的精确优化解答可由下式确定:

max?x(0)(aN?1)2 N?1a(a?1)GA工具箱提供一个M文件实现这个函数objharv。注意,这里是一个最大化问题,工具箱例程实现是最小化问题,这个目标函数objharv,f(u)乘 –1即产生为最小化问题。这个最初条件x(0)设为100,a取为1.1。

这个问题的控制步骤N=20,因此使用的决策变量个数NVAR=20,作为每个控制输入Uk。决策变量被限制在RANG=[0,200]范围,限制最大的控制输入在任意步为200,这个区域描

107

述器FieldD描述决策变量可以使用矩阵复制函数rep构造。

这个GA的参数可用MATLAB变量来指定。

除了传统GA参数例如代沟 (GGAP) 和交叉概率 (XOVR)外,还有大量与多种群GAS有关的其它参数被定义。这里INSR = 0.9,说明每一代中只有90%产生个体被复制到种群中,SUBPOP = 8,说明8个子种群使用迁移概率为MIGR =0.2或20%,每20代(MIGGEN= 20)在子种群与当前迁移之间。每个子种群包含20个个体,NIND = 20。

脚本文件使用的函数使用MATLAB串指定。 用串SEL_F 、XOV_F、MUT_F、OBJ_F指定分别代表:选择函数名、重组函数名、变异函数名、目标函数名。

由于使用离散重组函数recdis进行子代的培育,交叉概率没有使用,XOVR = 1。 初始种群的创建使用函数crtrp,代计数器gen设置为0。

在由FieldD指定的范围内使用一致性随机挑选个体决策变量组成SUBPOP *NIND个个体。矩阵Chrom包含了所有子种群并且子种群中所有个体的目标函数值能使用MATLAB的feval命令直接计算。ObjV = feval (OBJ_F, Chrom);Feval执行函数计算获得第一个输入变量,这里是目标函数名objharv,包含在OBJ_F中,这个函数将被计算并用剩余的参数作为输入调用这个函数。这里函数调用是:

ObjV = objharv (Chrom);

由于使用实值编码,不需要将染色体转换为表现型表示。GA现在将进入代循环。 下面为收获系统最优控制的MATLAB代码。 % 定义遗传算法参数

NVAR = 20; % 变量维数 RANGE = [0; 200]; % 变量范围

GGAP = 0.8; % 代沟(Generation gap) XOVR = 1; % 交叉率 MUTR = 1/NVAR; % 变异率

MAXGEN = 500; % 最大遗传代数(Maximum number of generations) INSR = 0.9; % 插入率 SUBPOP =8; % 子种群数 MIGR = 0.2; % 迁移率

MIGGEN = 20; % 在子种群与迁移之间20代

NIND = 20; % 个体数目(Number of individuals) SEL_F = 'sus'; % 选择函数名 XOV_F ='recdis'; % 重组函数名 MUT_F ='mutbga'; % 变异函数名 OBJ_F ='objharv'; % 目标函数名

FieldDD = rep (RANGE,[1,NVAR]); % 译码矩阵 gen=0;

trace=zeros (MAXGEN,2); % 遗传算法性能跟踪 Chrom=crtrp (NIND,FieldDD); % 创建初始种群 ObjV = objharv (Chrom); % 计算目标函数值 while gen < MAXGEN, % 代循环

FitnV = ranking (ObjV,[2,1],SUBPOP); % 分配适应度值(Assign fitness values) SelCh = select (SEL_F, Chrom, FitnV, GGAP, SUBPOP); % 选择 SelCh=recombin (XOV_F, SelCh, XOVR, SUBPOP); % 重组 SelCh = mutate (MUT_F,SelCh,FieldDD,[MUTR],SUBPOP); % 变异 ObjVOff = feval (OBJ_F,SelCh); % 计算目标函数值

[Chrom, ObjV] = reins (Chrom, SelCh, SUBPOP,[1 INSR], ObjV, ObjVOff); % 替代

108

gen=gen+1; [trace (gen,1),I]=min (ObjV); trace (gen,2)=mean (ObjV); % 在子种群之间迁移个体

if (rem (gen,MIGGEN) == 0)

[Chrom, ObjV] = migrate (Chrom, SUBPOP, [MIGR, 1, 1], ObjV); end end

[Y,I]=min (ObjV); % 输出最优解及其序号,Y为最优解,I为种群的序号 figure (1);plot (Chrom (I,:)); hold on;grid;

plot (Chrom (I,:),'bo')

figure (2);plot (-trace (:,1)); hold on;

plot (-trace (:,2),'-.'); % 遗传算法性能跟踪分布图 legend ('解的变化','种群均值的变化');xlabel ('迭代次数')

由于使用多子种群,待评定要求指定必须的选择压位差,这里我们用选择压位差为2。指定子种群的个数为SUBPOP。每个子种群的个体的目标值ObjV将独立排序,适应度值结果集将由向量FitnV返回。

在每个子种群中,个体将由高级选择函数select选择独立地培育子代: SelCh = select (SEL_F, Chrom, FitnV, GGAP, SUBPOP);

Select为每个子种群调用低级选择函数SEL_F ='sus',并建立包含用于重组的所有个体对的矩阵SelCh,代沟GGAP = 0.8,意思就是0.8* 20 = 16,GGAP*NIND个个体从每个子种群中选择,SelCh包含GGAP*NIND*SUBPOP = 128个个体。

高级重组函数recombin用于重组SelCh中每个子种群中的每对个体。 SelCh = recombin (XOV_F, SelCh, XOVR, SUBPOP);

重组函数XOV_F = 'recdis'对子种群中个体对执行离散重组。由于离散重组不需要指定常规的交叉概率,这里使用变量XOVR = 1.0仅仅是为了兼容。

子代现在将变异:

SelCh = mutate (MUT_F,SelCh,FieldD,MUTR,SUBPOP);

这里GA育种器变异函数MUT_F ='mutbga'使用高级变异例程mutate调用,使用变异概率MUTR = 1/NIND = 0.05。这个GA育种器变异函数需要域描述器FieldD,以使变异还会产生超出决策变量边界的结果。

所有子代的目标值ObjVOff现在可以再用feval计算。 ObjVOff = feval (OBJ_F, SelCh);

子代现在可以插入适当的子种群中。

[Chrom,ObjV]=reins (Chrom, SelCh,SUBPOP,[1,INSR],ObjV,ObjVOff); 使用基于适应度的插入,但对reins的第四个自变量的附加扩展参数指定了插入概率INSR = 0.9。这里的意思是指每个子种群的最小适应度的10%子代不会被插入。

多种群GA的个体在种群之间以相同间隔迁移。工具箱的迁移例程用于在子种群间根据相同的迁移策略交换个体,在这个例子中,每20代(MIGGEN = 20),在子种群间发生迁移。子种群间的迁移语句为:

if (rem (gen, MIGGEN) == 0)

[Chrom, ObjV] = migrate (Chrom, SUBPOP, [MIGR, 1, 1], ObjV); end

在这里子种群中最适应的20%(MIGR = 0.2)个体被选择迁移。最邻近的子种群在它们之间

109

交换个体,均匀地重插入移民个体。返回矩阵Chrom和向量ObjV作为迁移结果反映子种群中个体的变化。

GA迭代循环直到gen = MAXGEN并随后终止。

GA搜索获得的结果被包含在矩阵ObjV中。最佳个体的目标值和索引号可用函数min搜索。例如:

[Y, I] = min (ObjV); 运行后得到:

Y = -73.2370, I =50。 注意:改变了目标函数的符号使形成最小化问题,这个结果相当于目标函数值为73.2370,给出的精确解答应为73.2376。因此这个GA优化解与精确解之间的误差在10-5以内。染色体值显示使用如下命令:

plot (Chrom (I,:));

遗传算法的显示结果如下:

(1)图7.20为初始随机种群个体分布图。

图7.20 初始种群的分布图

(2)经过50次迭代后,寻优结果如图7.21所示。此时maxf(x)?9.1760。

图7.21 经过50次迭代后的优化解

(3)经过200次迭代后,寻优结果如图7.22所示。此时maxf(x)?58.8087。

110

图7.22 经过200次迭代后的优化解

(4)经过1000次迭代后,寻优结果如图7.23所示。此时maxf(x)?68.0320。

图7.23 经过1000次迭代后的优化解

7.5 装载系统的最优问题

装载系统是一个二维的系统,表达式如下:

?x1(k?1)?x2(k)?1?x(k?1)?2*x(k)?x(k)?u(k)221?N2?目标函数为:

k?1,2,,N.

1N2f(x,u)??x1(N?1)?u(k) ?2*Nk?1理论最优解为:

13*N?11min????36*N22*N3?kk?1N?12

一个实现本目标函数的M文件objpush包含在GA工具箱软件中。

下面为装载系统的最优问题的MATLAB代码。 %定义遗传算法参数

GGAP = 0.8; % 代沟(Generation gap) XOVR = 1; % 交叉率 NVAR = 20; % 变量维数 MUTR = 1/NVAR; % 变异率

MAXGEN = 200; % 最大遗传代数(Maximum number of generations) INSR = 0.9; % 插入率 SUBPOP =12; % 子种群数 MIGR = 0.2; % 迁移率

MIGGEN = 20; % 每20代迁移个体

NIND =20; % 个体数目(Number of individuals) RANGE=[0;10]; % 变量范围 SEL_F = 'sus'; % 选择函数名 XOV_F ='recdis'; % 重组函数名 MUT_F ='mutbga'; % 变异函数名

111

OBJ_F ='objpush'; % 目标函数名 FieldDD = rep (RANGE,[1,NVAR]);

trace=zeros (MAXGEN,2); % 遗传算法性能跟踪 Chrom=crtrp (SUBPOP*NIND,FieldDD); % 创建初始种群 gen = 0; ObjV=feval (OBJ_F,Chrom);

while gen < MAXGEN, % 代循环

FitnV = ranking (ObjV,[2,0],SUBPOP); % 分配适应度值(Assign fitness values) SelCh = select (SEL_F,Chrom,FitnV, GGAP,SUBPOP); % 选择 SelCh=recombin (XOV_F, SelCh,XOVR,SUBPOP); % 重组 SelCh = mutate (MUT_F,SelCh,FieldDD,[MUTR],SUBPOP); % 变异 ObjVOff=feval (OBJ_F,SelCh); % 计算子代目标函数值

[Chrom, ObjV] = reins (Chrom, SelCh, SUBPOP,[1 INSR], ObjV, ObjVOff); % 替代 gen=gen+1;

[trace (gen,1),I]=min (ObjV); trace (gen,2)=mean (ObjV); end

[Y,I]=min (ObjV); % 最优控制向量值及其序号 subplot (211); % 最优控制向量分布图 plot (Chrom (I,:));hold on; plot (Chrom (I,:),'.');grid

subplot (212); % 遗传算法性能跟踪分布图 plot (trace (:,1));hold on; plot (trace (:,2),'-');grid legend ('解的变化','种群均值的变化') 遗传算法的显示结果如下:

(1)经过50次迭代后的优化解的目标函数值及性能跟踪如图7.24所示。此时minf?0.0369。

图7.24 经过50次迭代后的优化解的目标函数值及性能跟踪

(2) 经过100次迭代后的优化解的目标函数值及性能跟踪如图7.25所示。此时minf?-0.1425。

112

图7.25 经过100次迭代后的优化解的目标函数值及性能跟踪

(3) 经过200次迭代后的优化解的目标函数值及性能跟踪如图7.26所示。此时minf?-0.1536。

图7.26 经过200次迭代后的优化解的目标函数值及性能跟踪

为了比较,计算出理论最优解:

13?20?1120?12minf????k?-0.1544。 23?36?202?20k?1 经过200次迭代后的优化解-0.1536与理论最优解-0.1544的误差仅为0.0008。

7.6 离散二次线性系统最优控制问题

假设二阶线性系统是一维的,其表达式为:

x(k?1)?a*x(k)?b*u(k),目标函数定义为:

k?1,2,,N.

f(x,u)?q*x(n?1)??[s*x(k)2?r*u(k)2]

2k?1N 113

minf(x,u)

参数设置为:

参数名 参数值 N45 x(0) 100 s 1 r 1 q 1 a 1 b 1 一个实现本目标函数的M文件objlinq包含在GA工具箱软件中。 下面为离散二次线性系统最优控制的MATLAB代码。 % 定义遗传算法参数

GGAP = 0.8; % 代沟(Generation gap) XOVR = 1; % 交叉率 NVAR = 45; % 变量维数 MUTR = 1/NVAR; % 变异率

MAXGEN = 2000; % 最大遗传代数(Maximum number of generations) INSR = 0.9; % 插入率 SUBPOP =12; % 子代数目 MIGR = 0.2; % 迁移率

MIGGEN = 20; % 每20代迁移个体

NIND =20; % 个体数目(Number of individuals) SEL_F = 'sus'; % 选择函数名 XOV_F ='recdis'; % 重组函数名 MUT_F ='mutbga'; % 变异函数名 OBJ_F ='objlinq'; % 目标函数名 FieldDR=feval (OBJ_F,[ ],1);

Chrom=crtrp (SUBPOP*NIND,FieldDR); % 创建初始种群 gen = 0;

trace=zeros (MAXGEN,2); % 遗传算法性能跟踪 ObjV=feval (OBJ_F,Chrom); % 计算目标函数值 while gen < MAXGEN, % 代循环 trace (gen+1,1)=min (ObjV); trace (gen+1,2)=mean (ObjV);

FitnV = ranking (ObjV,[2,0],SUBPOP); % 分配适应度值(Assign fitness values) SelCh = select (SEL_F,Chrom,FitnV, GGAP,SUBPOP); % 选择 SelCh=recombin (XOV_F, SelCh,XOVR,SUBPOP); % 重组 SelCh = mutate (MUT_F,SelCh,FieldDR,[MUTR],SUBPOP) ; % 变异 ObjVOff=feval (OBJ_F,SelCh); %计算目标函数值

[Chrom, ObjV] = reins (Chrom, SelCh, SUBPOP,[1 INSR], ObjV, ObjVOff); % 替代 gen=gen+1; end

[Y,I]=min (ObjV); subplot (211); plot (Chrom (I,:)); hold on;

plot (Chrom (I,:),'.');grid % 最优控制向量分布图 legend ('最优控制向量')

subplot (212); % 遗传算法性能跟踪分布图

114

plot (trace (:,1));

hold on;plot (trace (:,2),'-.');grid

legend ('解的变化','种群均值的变化'); xlabel ('迭代次数') 遗传算法的显示结果如下:

(1)经过100次迭代后的优化解的目标函数值及性能跟踪如图7.27所示。此时minf?26503。

图7.27 经过100次迭代后的优化解的目标函数值及性能跟踪

(2) 经过1000次迭代后的优化解的目标函数值及性能跟踪如图7.28所示。此时minf?17259。

图7.28 经过1000次迭代后的优化解的目标函数值及性能跟踪

(3) 经过2000次迭代后的优化解的目标函数值及性能跟踪如图7.29所示。此时minf?16337。

图7.29 经过2000次迭代后的优化解的目标函数值及性能跟踪

115

7.7 目标分配问题

目标分配问题描述为:m个地空导弹火力单元对n批空袭目标进行目标分配。假设进行目标分配之前,各批目标的威胁程度与个火力单元对各批目标的射击有利程度已经经过评估和排序。第j批目标的威胁程度评估值为wj,第i个火力单元对第j批目标射击有利程度估计值为pij,令各火力单元对各批目标进行拦击的效益值为cij?wj?pij,其中cij表示对某批目标进行拦击我方获益大小程度。目标分配的目的是满足目标分配的基本原则,追求总体效益最佳,即求max(?cj?1nij)。

染色体采用十进制编码,染色体的长度由按目标批次编号顺序排列的火力单元分配编号组成,表示一种可能的分配方案。

下面为目标分配的最优问题的MATLAB代码。 function [eval]=targetalloc (chrom) % 目标函数 [m,n]=size (chrom);

% 射击有利程度估计值

p=[ .87 .52 .11 .78 .72 .69 .94 .72 .36 .28 .27 .74 .24 .78 .45;... .87 .52 .11 .78 .72 .69 .94 .72 .36 .28 .27 .74 .24 .78 .45;... .87 .52 .11 .78 .72 .69 .94 .72 .36 .28 .27 .74 .24 .78 .45;... .87 .52 .11 .78 .72 .69 .94 .72 .36 .28 .27 .74 .24 .78 .45;... .87 .52 .11 .78 .72 .69 .94 .72 .36 .28 .27 .74 .24 .78 .45;... .87 .52 .11 .78 .72 .69 .94 .72 .36 .28 .27 .74 .24 .78 .45;... .62 .87 .70 .22 .80 .42 .43 .90 .13 .95 .18 .19 .12 .61 .35;... .48 .20 .42 .16 .43 .58 .69 .03 .34 .72 .15 .24 .29 .30 .75 ];

w=[.47 .97 .76 .62 .48 .77 .33 .74 .54 .65 .43 .35 .63 .66 .57]; % 威胁程度评估值 for i=1:m for j=1:15

chrom (i,j)=p(chrom (i,j),j); end; end

eval=chrom*w';

% 定义遗传算法参数

NIND = 40; % 个体数目(Number of individuals)

MAXGEN =50; % 最大遗传代数(Maximum number of generations) GGAP = 0.9; % 代沟(Generation gap)

trace=zeros (MAXGEN,2); % 遗传算法性能跟踪初始值 BaseV= crtbase (15,8);

Chrom=crtbp (NIND, BaseV)+ones (NIND,15); %初始种群 gen = 0;

ObjV = taretalloc (Chrom); % 计算初始种群函数值 while gen < MAXGEN,

FitnV = ranking (-ObjV); % 分配适应度值(Assign fitness values) SelCh = select ('sus', Chrom,FitnV, GGAP); % 选择

116

SelCh = recombin ('xovsp',SelCh,0.7); % 重组 f=rep ([1; 8],[1,15]);

SelCh = mutbga (SelCh,f);SelCh=fix (SelCh); % 变异

ObjVSel = targetalloc (SelCh); % 计算子代目标函数值 [Chrom ObjV]=reins (Chrom,SelCh,1,1,ObjV,ObjVSel); % 重插入 gen = gen+1;

trace (gen,1)=max (ObjV); % 遗传算法性能跟踪 trace (gen,2)=sum (ObjV)/length (ObjV); end

[Y,I]=max (ObjV);Chrom (I,:),Y % 最优解及其目标函数值 plot (trace (:,1),'-.'); hold on; plot (trace (:,2)); grid

legend ('解的变化','种群均值的变化')

目标函数设计为function [eval]=targetalloc (chrom)。其中,chrom为染色体,在函数体中p为8个火力单元对15批目标的射击有利程度评估值。w为15批目标的威胁程度评估值。遗传算法中,个体的数量NIND被设置为40,最大遗传代数MAXGEN=50,染色体长度为15,使用代沟GGAP=0.9,使用基于适应度的重插入最适应的个体总是被连续传播到下一代。区域描述器BaseV= crtbase (15,8)描述染色体的表示和解释,染色体采用十进制编码,一个初始种群被函数crtbp创建,随后产生一个矩阵Chrom,它由NIND个长度为15的十进制串构成。程序段Chrom=crtbp (NIND, BaseV)+ones (NIND,15)中有ones (NIND,15)的目的是保证矩阵处理中的行、列序号不为零。

经过50次遗传迭代后,目标分配方案见表7.2。

表7.2 目标分配方案

目标编号 分配结果 1 3 2 7 3 7 4 2 5 7 6 4 7 6 8 7 9 1 10 7 11 5 12 3 13 8 14 1 15 8 与此方案对应的总收益值为6.4719。图7.30为经过50次迭代后的优化解的目标函数值及性能跟踪。

图7.30 经过50次迭代后的优化解的目标函数值及性能跟踪

7.8 双积分的优化问题

双积分的状态方程为:

117

???x?1?x2??x2?x1 ?y?x2??时间范围为:0?t?1。

初始条件为:x1(0)?0;终止条件为:x1(0)?0;目标函数为:minf(u)?x2(0)??1。 x2(0)?0。

?u(t)012dt

双积分问题的Simulink模型为:

Doppelintegrator 1 Inport 1/s Integrator1

1/s Integrator2 一个实现本目标函数的M文件objdopi包含在GA工具箱软件中。 下面为双积分的优化问题的MATLAB代码。 % 定义遗传算法参数

Dim=20; % 变量维数

NIND =20; % 个体数目(Number of individuals)

Preci=20; % 变量的二进制位数(Precision of variables)

MAXGEN = 100; % 最大遗传代数(Maximum number of generations) GGAP = 0.8; % 代沟(Generation gap) SEL_F = 'sus'; % 选择函数名 XOV_F ='xovsp'; % 重组函数名 MUT_F ='mut'; % 变异函数名 OBJ_F ='objdopi'; % 目标函数名

FieldDR=feval (OBJ_F,[ ],1); % 计算目标函数值 % 建立区域描述器(Build field descriptor)

FieldDD=[rep ([Preci],[1,Dim]);FieldDR;rep ([1;0;1;1],[1,Dim])]; Chrom=crtbp (NIND,Dim*Preci); % 创建初始种群 gen = 0;

Best=NaN*ones (MAXGEN,1); % 最优解初值 while gen < MAXGEN, % 最大循环次数

ObjV=feval (OBJ_F,bs2rv (Chrom,FieldDD)); % 计算目标函数值 Best (gen+1)=min (ObjV); % 最优解 plot (log10 (Best),'bo');

FitnV = ranking (ObjV); % 分配适应度值(Assign fitness values) SelCh = select (SEL_F,Chrom,FitnV, GGAP); % 选择 SelCh=recombin (XOV_F, SelCh); % 重组 SelCh = mutate (MUT_F,SelCh); % 变异 Chrom = reins (Chrom, SelCh); % 重插入 gen=gen+1;

118

end grid;

xlabel ('迭代次数');ylabel ('目标函数值(取对数)') ; (1)经过50次迭代后的运行结果如图7.31所示。

图7.31 经过50次迭代后的运行结果

(2)经过100次迭代后的运行结果如图7.32所示。

图7.32 经过100次迭代后的运行结果

7.9 雷达目标识别问题

复杂目标的高分辨雷达回波信号在时域上出现多个峰值,这些峰值对应目标径向上的多个强散射中心。但是,当空中目标的位置发生变化时,目标的强散射点相对于雷达视角发生变化,因此,从数据库中寻找与待识别目标模式相匹配的模式的工作量很大,传统的匹配方法已不能满足需要。本节利用遗传算法进行目标识别,具体步骤如下:

(1)染色体编码与解码:假设数据库中已知目标类型有m种,每种类型目标在雷达视角

?~?范围内的雷达回波信号n个序列。对于两参数目标类型i?m和雷达视角编码j?n,

设k1为参数i的二进制编码长度,k2为参数j的二进制编码长度,定义遗传算法的个体Ik基因型Gk为,Gk?011?0101?101?????101?????,则编码总长度为k1?k2。即个体Ik基因型Gk的前

k1k2k1位的十进制解码为i,后k2位的十进制解码为j。

119

(2)产生初始种群:一个个体由串长为k1?k2的随机产生的二进制串组成染色体的基因码,可以产生一定数目的个体组成种群。设置群体大小。

(3)个体适应度的检测评估:设X(i,j)为第i种目标在第j个雷达视角的高分辨雷达目标回波信号序列,对应的个体为Ik。待识别目标的高分辨雷达目标回波信号序列为X。个体

Ik的适应度函数可定义为f(Ik):

f(Ik)?X(i,j)?XX(i,j)?X(i,j)X?X

式中,X?Y为序列X和序列Y的相关系数。

(4)遗传算子:选择运算使用比例选择算子;交叉运算使用单点交叉算子;变异运算使用基本位变异算子或均匀变异算子。每个个体选择概率为

ps?f(Ik)/?f(Ik)

k?1设置遗传算法的终止进化代数、交叉概率和变异概率,对群体进行操作。

下面为雷达目标识别问题的MATLAB代码

function coef=corrcoef1(x,y) % 计算x和y的相关系数函数,x为单序列,y为复序列 [m,n]=size(y); coef=zeros(m,1); for i=1:m

coef(i)=sum(abs(conv(x,y(i,:))))/sqrt( sum(abs(conv(x,x)))*sum(abs(conv(y(i,:),y(i,:)))) ); end

function class=recognite(signal,inform) ; % 目标识别函数

% signal为待识别目标的雷达信号;inform为目标识别数据库中的模板信号 NIND = 20; % 个体数目(Number of individuals) MAXGEN =200; % 最大遗传代数(Maximum number of generations) Type=10;Angle=20; % 目标类型10bit,雷达视角20bit

PRECI = Type + Angle; % 变量的二进制位数(Precision of variables) GGAP = 0.9; % 代沟(Generation gap)

FieldD = [PRECI;1;NIND;1;0;1;1]; % 区域描述器(Build field descriptor) Chrom = crtbp(NIND, PRECI); % 创建初始种群 gen = 0;

v=bs2rv(Chrom,FieldD); % 种群十进制转换 class=round(v); % 取整

ObjV = corrcoef1(signal,inform(class,:)); % 计算相关系数 trace=zeros(MAXGEN); % 性能跟踪 while gen < MAXGEN,

FitnV = ranking(-ObjV); % 分配适应度值(Assign fitness values) SelCh = select('sus', Chrom, FitnV, GGAP); % 选择 SelCh = recombin('xovsp',SelCh,0.7); % 重组 SelCh = mut(SelCh); % 变异

120

v=bs2rv(SelCh,FieldD); class=round(v);

ObjVSel = corrcoef1(signal,inform(class,:)); % 计算目标函数相关系数 [Chrom ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel); % 重插入 gen = gen+1; trace(gen)=max(ObjV); end

% 输出最优解及其序号,并在目标函数图象中标出,Y为最优解,I为种群的序号 [Y,I]=max(ObjV);

Type=round(bs2rv(Chrom(I,1:Type),FieldD)); % 目标类型编号 Angle=round(bs2rv(Chrom(I,Type+1:Angle),FieldD)); % 雷达视角编号 plot(trace);hold on; plot(trace,'.'); grid;

实例,实验数据选自毫米波步进频率信号,带宽1GHz,调频步长2MHz。识别目标为轰炸机、歼击机和直升机的缩比模型。对三类飞机鼻锥方向?100方位角(角度间隔为10)变化范围内的雷达回波截取、去均值、归一化等预处理后,作为数据库中的数据。待识别目标的雷达回波数据为三类飞机的雷达回波加高斯白噪声。图7.33为遗传算法搜索最优解的过程。

图7.33 遗传算法搜索最优解的过程

7.10 图象分割问题

利用遗传算法进行图象分割的基本思想是:把图象中的像素按灰度值用阈值M分成两类图象,一类为目标图象C1,另一类为背景图象C2。图象C1由灰度值在0~M之间的像素组成,图象C2由灰度值在M?1~L?1(L为图象的灰度级数)之间的像素组成。

本节处理图象为256灰度级,将灰度分割阈值编码为一个8位0、1二进制码串。适应度函数选为f(M):

f(M)?W1(M)?W2(M)?[U1(M)?U2(M)]2

其中,W1(M)为目标图象C1中所包含的像素数;W2(M)为目标图象C2中所包含的像素数;

U1(M)为C1所有像素数的平均灰度值;U2(M)为C2中所有像素数的平均灰度值。

121

下面为雷达目标识别问题的MATLAB代码:

function f=target(T,M) % 适应度函数,T为待处理图象,M为阈值序列 [U,V]=size(T); W=length(M); f=zeros(W,1); for k=1:W

I=0;s1=0; J=0; s2=0; % 统计目标图象和背景图象的象素数及象素之和 for i=1:U for j=1:V

if T(i,j)<=M(k)

s1=s1+T(i,j);I=I+1; end

if T(i,j)>M(k)

s2=s2+T(i,j);J=J+1; end end end

p1=s1/I;p2=s2/J; % 计算目标图象与背景图象的象素平均值 f(k)=I*J*(p1-p2)*(p1-p2)/(256*256); % 计算适应度函数值 end

load woamn % 调用MATLAB中Woman图象灰度值 figure(1); % 画图 image(X);colormap(map);

NIND = 40; % 个体数目(Number of individuals)

MAXGEN =50; % 最大遗传代数(Maximum number of generations)

PRECI = 8; % 变量的二进制位数(Precision of variables) GGAP = 0.9; % 代沟(Generation gap)

FieldD = [8;1;256;1;0;1;1]; % 建立区域描述器(Build field descriptor) Chrom = crtbp(NIND, PRECI); % 创建初始种群 gen = 0;

phen=bs2rv(Chrom,FieldD); % 初始种群十进制转换 ObjV = target(X,phen); % 计算种群适应度值 while gen < MAXGEN, % 代沟(Generation gap)

FitnV = ranking(-ObjV); % 分配适应度值(Assign fitness values) SelCh = select('sus', Chrom, FitnV, GGAP); % 选择 SelCh = recombin('xovsp',SelCh,0.7); % 重组 SelCh = mut(SelCh); % 变异

phenSel = bs2rv(SelCh,FieldD); % 子代十进制转换 ObjVSel=target(X,phenSel);

[Chrom ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel); % 重插入 gen = gen+1; end

[Y,I]=max(ObjV);

M=bs2rv(Chrom(I,:),FieldD) ; % 估计阈值 [m,n]=size(X);

122

for i=1:m for j=1:n

if X(i,j)>M

X(i,j)=256; % 灰度值为256时是白色 end

end end

figure(2) % 画出分割后目标图象 image(X);colormap(map);

图7.34为MATLAB中的Woman图象。图7.35为经过50次迭代后的分割图象(阈值为117)。

图7.34 Woman原始图象(256?256)

图7.35 Woman分割后的图象(阈值为117)

7.11 一些测试函数对应的优化问题

下面给出工具箱提供的一些测试函数的遗传算法的运行结果(问题的MATLAB代码可参考前面例子的代码)。

7.11.1 轴并行超球体的最小值问题

一个实现本目标函数的M文件objfunla包含在GA工具箱软件中。

变量维数为Dim=10,变量的范围为-512~512。选取个体数目NIND = 40,迭代次数

123

MAXGEN取为100、200、500,代沟GGAP 取为0.9。迭代100次、200次、500次的目标函数最小值分别为3141.2、5.7440、1.3113*10?5,最小值对应的10个变量值见表7.3。目标函数的理论最小值为0。跟踪性能如图7.36、图7.37和图7.38所示。

表7.3 迭代100次、200次、500次的目标函数最小值对应的10个变量值

迭代次数 100 200 500 变量值 15.3706 -3.4136 -4.9595 0.6216 16.0913 13.7593 6.3384 0.1421 1.0708 0.2427 0.0298 -0.4663 -0.3452 0.0562 0.2026 2.8608 1.4341 备注 0.0278 -0.3081 0.2378 -0.4883 -0.4883 0.4883 -0.4883 0.4883 -0.4883 -0.4883 -0.4883 -0.4883 0.4883 ?10-3

图7.36 经过100次迭代后的优化解的目标函数值及性能跟踪

图7.37 经过200次迭代后的优化解的目标函数值及性能跟踪

图7.38 经过500次迭代后的优化解的目标函数值及性能跟踪

7.11.2 旋转超球体的最小值问题

一个实现本目标函数的M文件objfunlb包含在GA工具箱软件中。

124

变量维数为Dim=10;变量的范围为-65~65,选取NIND = 40,MAXGEN =100、500、1000; GGAP = 0.9。表7.4分别为迭代100次、500次、1000次的目标函数最小值对应的变量值,对应的最小值分别为483.2808、48.8648、24.3775。理论值为0。跟踪性能如图7.39~7.41所示。

表7.4 迭代100次、500次、1000次的目标函数最小值对应的10个变量值

迭代次数 100 500 1000 变量值 备注 8.5230 -8.0729 9.4457 -24.959 14.1763 1.6832 2.1510 -9.3494 10.389 -8.3015 3.8979 -4.1485 -3.9814 7.8619 -3.5510 -0.7377 0.5833 1.4464 -1.6146 0.6152 3.3259 -5.8697 4.9317 -2.6650 0.6560 -0.4382 0.7710 -1.0381 0.5261 0.3165 ?10-3

图7.39 经过100次迭代后的优化解的目标函数值及性能跟踪

图7.40 经过500次迭代后的优化解的目标函数值及性能跟踪

图7.41 经过1000次迭代后的优化解的目标函数值及性能跟踪

7.11.3 Rosenbrock’s valley最小值问题

125

一个实现本目标函数的M文件objfun2包含在GA工具箱软件中。

变量维数为Dim=2;变量的范围为-2~2,选取NIND = 40,GGAP = 0.9。表7.5为迭代的最优解及其对应的目标函数值。理论值为:变量为[0,0],目标函数值为0。跟踪性能如图7.42所示。

表7.5 迭代50次、100次、200次、500次和1000次的最优解及对应的目标函数值 迭代次数 变量值 目标函数值 50 100 200 500 1000 1.0000 1.0001 1.2049×10-9 0.8347 0.6959 1.1193 1.2523 0.8970 0.8040 1.0836 1.1741 0.0274 0.0142 0.0106 0.0070

图7.42 经过100次迭代后的优化解的目标函数值及性能跟踪

7.11.4 Rastrigin函数的最小值问题

一个实现本目标函数的M文件objfun6包含在GA工具箱软件中。

变量维数为Dim=20,变量的范围为-5.12~5.12,选取NIND = 40,GGAP = 0.9。目标函数理论值为0。表7.6为迭代次数及对应的目标函数最小值。迭代次数为1000时目标函数取最小值,对应的20个变量的值见表7.7,也可见图7.43。跟踪性能见图7.44。

表7.6 迭代次数及对应的最小值

迭代次数 最小值 50 100 200 33.0944 500 27.8595 1000 23.8798 66.5403 34.8589 表7.7 迭代次数为1000时20个变量的值

0.9950 -0.0000 -0.9949 0.0000 -0.9950 0.0000 0.0000 -0.9950 -0.0000 -1.9899 0.9950 -0.9949 -0.9950 0.9950 -0.0000 1.9899 0.9950 0.9950 -0.9950 -0.9950

图7.43 经过1000次迭代后的最优解

126

图7.44 经过500次迭代后的优化解的目标函数值及性能跟踪

7.11.5 Schwefel函数的最小值问题

一个实现本目标函数的M文件objfun7包含在GA工具箱软件中。

变量维数为20,变量范围为-500~500,选取NIND=40,GGAP=0.9。表7.8为迭代次数及对应的最小值。理论最小值为-8379.7。跟踪性能见图7.45,迭代次数为1000时最优解如图7.46所示。

表7.8 迭代次数及对应的最小值

迭代次数 最小值 50 -6228.4 100 -6416.4 200 -7730.0 500 -7932.6 1000 -8255.8

图7.45 经过500次迭代后的最优解及性能跟踪

图7.46 经过1000次迭代后的最优解

7.11.6 Griewangk函数的最小值问题

127

一个实现本目标函数的M文件objfun8包含在GA工具箱软件中。

变量维数为10,变量范围为-600~600,选取NIND=40;GGAP=0.9。表7.9为迭代次数及对应的最小值。理论值为0。跟踪性能如图7.47所示。迭代200次和500次后的最优解对应的变量值见表7.10。

表7.9 迭代次数及对应的最小值

迭代次数 最小值 50 2. 9075 100 1. 2277 200 0. 3920 500 0. 0369

图7.47 经过50次迭代后的最优解及性能跟踪 表7.10 迭代次数为200和500后的最优解对应的变量值

迭代次数 200 500 变量值 6.2834 -17.7767 5.4033 18.8158 0.0647 7.9153 -16.5739 -8.8228 -0.0154 -19.7668 3.1397 -0.0006 5.4331 -0.0006 -7.0078 7.6727 -0.0006 0.0006 -0.0006 -0.0006 7.11.7 不同权的总和最小值问题

一个实现本目标函数的M文件objfun9包含在GA工具箱软件中。

变量维数为10,变量取值范围为-1~1,选取NIND=40,GGAP=0.9。表7.11为迭代次数及对应的最小值。理论值为0。跟踪性能如图7.48所示,迭代次数为100和200后的最优解见表7.12。

表7.11 迭代次数及对应的最小值

迭代次数 最小值 50 1.0643e-004 100 3.0888e-005 200 1.0175e-010

图7.48 经过50次迭代后的最优解及性能跟踪

128

表7.12 100次和200次迭代后的最优解对应的变量值

迭代次数 100 200 变量值 -0.0001 0.0011 -0.0094 0.1252 -0.0033 -0.0878 -0.0537 -0.0403 0.0050 -0.1341 -0.0000 0.0001 0.0006 0.0098 0.0147 0.0104 -0.0124 -0.0174 0.0626 0.0012 7.12 多目标优化问题

下面为一个含有两个优化目标的多目标优化问题。

minmins..t2x12x2f1??44f2?x1(1?x2)?10

1?x1?41?x2?2对于该问题,利用权重系数变换法很容易求出Pareto最优解,当f1和f2的权重系数都为0.5时,经过50次迭代后结果为:x1?2.0034,x2?2.0000,f1?f2?10.0001。跟踪性能如图7.49所示。

图 7.49 经过50次迭代后的最优解及性能跟踪

下面为利用并列选择法求解多目标最优问题的MATLAB代码。 Function f1=f (x) % 第一目标函数 f1=x (:,1).*x (:,1)/4+x (:,2).*x (:,2)/4;

function f2=f (x) % 第二目标函数 f2=x (:,1).* (1-x (:,2))+10;

NIND = 100; % 个体数目(Number of individuals) MAXGEN =50; % 最大遗传代数(Maximum number of generations) NVAR = 2; % 变量个数

PRECI = 20; % 变量的二进制位数(Precision of variables) GGAP = 0.9; % 代沟(Generation gap)

trace1=[ ];trace2=[ ];trace3=[ ]; % 性能跟踪 % 建立区域描述器

FieldD = [rep ([PRECI],[1,NVAR]);[1,1;4,2]; rep ([1;0;1;1],[1,NVAR])];

129

Chrom = crtbp (NIND, NVAR*PRECI); % 初始种群

v=bs2rv (Chrom,FieldD); % 初始种群十进制转换 gen = 1; while gen < MAXGEN, [NIND,N]=size (Chrom); M=fix (NIND/2);

ObjV1 = f1 (v (1:M,:)); % 分组后第一目标函数值

FitnV1 = ranking (ObjV1); % 分配适应度值(Assign fitness values) SelCh1 = select ('sus', Chrom (1:M,:), FitnV1, GGAP); % 选择 ObjV2 = f2 (v (M+1:NIND,:)); % 分组后第二目标函数值 FitnV2 = ranking (ObjV2);

SelCh2 = select ('sus', Chrom ( (M+1):NIND,:), FitnV2, GGAP); % 选择 SelCh=[SelCh1;SelCh2]; % 合并 SelCh = recombin ('xovsp',SelCh,0.7); % 重组 Chrom = mut (SelCh); % 变异 v=bs2rv (Chrom,FieldD); trace1 (gen,1)=min (f1 (v));

trace1 (gen,2)=sum (f1 (v))/length (f1 (v)); trace2 (gen,1)=min (f2 (v));

trace2 (gen,2)=sum (f2 (v))/length (f2 (v)); trace3 (gen,1)=min (f1 (v)+f2 (v));

trace3 (gen,2)=sum (f1 (v))/length (f1 (v))+sum (f2 (v))/length (f2 (v)); gen = gen+1; end

figure (1);clf;

plot (trace1 (:,1));hold on; plot (trace1 (:,2),'-.'); plot (trace1 (:,1),'.'); plot (trace1 (:,2),'.');grid; legend ('解的变化','种群均值的变化') ; xlabel ('迭代次数');ylabel ('目标函数值'); figure (2);clf;

plot (trace2 (:,1));hold on; plot (trace2 (:,2),'-.'); plot (trace2 (:,1),'.'); plot (trace2 (:,2),'.');grid;

legend ('解的变化','种群均值的变化'); xlabel ('迭代次数');ylabel ('目标函数值'); figure (3);clf;

plot (trace3 (:,1));hold on; plot (trace3 (:,2),'-.'); plot (trace3 (:,1),'.'); plot (trace3 (:,2),'.');grid;

legend ('解的变化','种群均值的变化'); xlabel ('迭代次数');ylabel ('目标函数值'); figure (4);clf;plot (f1 (v));hold on; plot (f2 (v),'r-.');grid;

经过50次遗传迭代后的结果如图7.50~图7.53所示。

130

图7.50 经过50次迭代后第一目标函数的最优解及性能跟踪

图7.51 经过50次迭代后第二目标函数的最优解及性能跟踪

图7.52 经过50次迭代后的两目标函数和的最优解及性能跟踪

131

图7.53 经过50次迭代后种群的第一目标函数值与第二目标函数值

132

本文来源:https://www.bwwdw.com/article/hmjw.html

Top