图8.42 排序与顶级尺度变换各代个体之间距离变化之比较
8.3.3.3 选择
选择函数根据个体由适应度尺度变换函数得到的尺度值,为下一代选择父辈。当一个个体为多个子辈贡献它的基因时,它就可能多次被选做父辈。默认的选择函数为Stochastic uniform(随机均匀函数)——在每一父辈画出一条与选择线对应的直线,长度与它的尺度值成比例。算法以等步长在线上移动。在每一步,算法从落入线上的部分分配父辈。
一个比较确定的选择函数是Remainder,由下列两步运行:
首先,函数按照尺度值的整数部分为每个个体选择父辈。例如,假设一个个体的尺度值是2.3,函数选择这个个体两次作为父辈。
其次,在随机均匀选择时,选择函数利用尺度值的小数部分选择剩余的父辈。函数落入选择线内,即长度与个体尺度值的小数部分成比例,在线上按等步长移动来选择父辈。注意,如果尺度值的小数部分都等于0,就象顶级尺度变换一样,选择是完全确定的。 8.3.3.4 复制参数
复制参数控制遗传算法怎样生成下一代。这些参数有:
elite count(优良计数)— 在当前种群中,具有最佳适应度值的个体遗传到下一代的个体数。这些个体称为优良子辈(elite children)。elite count的默认值为2。
当优良计数至少为1时,最佳适应度值可能从一代到下一代减少。这是人们希望的,因为遗传算法使适应度函数最小化。设置elite count为一个大数,可以使得最适应个体控制种群,但可能减小搜索的有效性。
Crossover fraction(交叉概率)— 下一代个体的一小部分,它不是elite children(优良子辈),而是由交叉产生的部分。参见“8.3.3.7 设置交叉概率”一节。 8.3.3.5 变异与交叉
遗传算法运用当前代的个体生成子代个体,构成下一代。除了elite children外,算法还生成下列子代个体:
173
? 从当前代中选择两个个体,交换两个个体的某个或某些位(基因),结合后形成交叉子个体。
? 随机改变当前代的单个个体形成变异子个体。
这两个过程是遗传算法的主要过程。交叉能够使遗传算法从不同的个体中提取更好的基因,结合到具有优势的子个体中。变异增加了种群的多样性,因而增大了算法生成更高适应度值的个体的可能性。没有变异,算法只能产生由初始种群结合基因的子集构成的个体。
算法生成的子个体类型如下:
? Elite count,在“Reproduction”文本框,指定elite children的数目。
? Crossover fraction,在Reproduction文本框,指定种群中交叉子个体的概率,它不同于elite children。例如,假设Population size(种群尺度)为20, Elite count为 2,Crossover fraction为 0.8,则下一代子个体类型如下:
? 有2个优良子辈。
? 除优良子辈以外,还有18个个体。所以计算 0.8*18 = 14.4取整得14,得到14个交叉
子个体。
? 还有4个个体,它们不是elite children,而是变异子个体。 8.3.3.6 设置变异大小
遗传算法应用变异函数(Mutation function)字段中指定的函数进行变异操作。默认的变异函数为高斯函数Gaussian,它把一个从高斯分布选择的随机数,即mutation,加到父辈向量的每一个项上。典型情况下,与分布的标准差成比例的变异大小,在每一后代中都是减小的。通过参数尺度(Scale)和压缩(Shrink),可以控制每一代变异的平均数量。
Scale控制第一代变异的标准差。标准差是Scale乘以初始种群的范围——该范围是使用者由Initial range参数指定的。
压缩(Shrink)控制变异的平均数量的减少率。标准差线性减小,以便标准差等于1 – Shrink乘以它在第一代的值。例如,假设Shrink缺省值为1,则变异数在最后一步减小到0。通过选择绘图函数Distance(距离)和Range能够观察到变异的效果。Rastrigin函数的遗传算法的运行结果如图8.43所示。
图8.43 压缩值为1时Rastrigin函数的距离和范围
图8.45的上部图形显示每一代各点之间的平均距离。当变异数减小时,个体之间的平均距离也减小,在最后一代大约减小到0。图8.45下部图形中的垂直线表示每一代适应度值由最小
174
到最大的范围以及适应度值的平均值。当变异数减小时,适应度值的范围也减小。这些图形显示减少变异数,也就减小了子辈的多样性。
作为比较,图8.44显示当Shrink取为0.5时的Distance和Range的图形。
图8.44 压缩值为0.5时Rastrigin函数的距离与范围
当Shrink设置为0.5时,最后一代的平均变异数减小了一半。同样,个体之间的平均距离也大约减小了一半。 8.3.3.7 设置交叉概率
在Reproduction选项中,由Crossover fraction文本框指定每一种群的一部分,它们不是elite children,而是组成的交叉子个体。取交叉概率等于1,意味着所有子个体都是交叉子个体;取交叉概率等于0,意味着所有子个体都是变异子个体。下面的例子说明,这两个极端设置,都不是有效的函数优化策略。
在这个例子中,定义适应度函数为:
f(x1,x2,,xn)?x1?x2??xn
即点的适应度函数值为所有点的坐标的绝对值之和。
通过设置Fitness function 为@(x) sum(abs(x)),就可以定义为一个无名函数。 运行这个例子时,有关参数设置如下:
? 设置Fitness function为 @(x) sum(abs(x))。 ? 设置Number of variables为10。 ? 设置Initial range为[-1; 1]。
? 在Plots窗格,选择Best fitness和Distance。 首先设置Crossover fraction为缺省值0.8,运行算法,得到最佳适应度值大约为0.2,如图8.45所示。
175
图8.45 交叉概率为0.8时函数的适应度值与平均距离
(1)无变异的交叉
为了观察没有变异时遗传算法怎样运行,设置Crossover fraction为1.0,并单击Start按钮,得到的最佳适应度值约等于1.3,如图8.46所示。
最佳个体在第8代产生 所有个体都是相同的
图8.46 无变异的交叉下函数的适应度值与平均距离
在这种情况下,算法选择初始种群中的个体基因,并把它们重新结合起来。因为没有变
176