遗传算法在复杂问题求解、机器学习以及一些进化问题中经常会用到,应用领域非常广泛,比如非线性动态系统中的预测和数据分析、设计神经网络的结构和权重、基因编程、机器人路线规划、策略制定、寻找蛋白质分子的形状、进化作图和谱曲等。
遗传算法因为使用多个个体用于状态空间的搜索,所以有一个很大的好处——并行性,不容易陷入局部极值。另外,它也比较容易实现,如果已经有了遗传算法,只需要写几个用于解决问题的新的染色体;如果使用相同的编码方式,只需要修改适应度函数。遗传算法应用的难点主要在于选择编码方式和适应度函数上。
下面通过一些例子来说明遗传算法的具体用法。
例5.2 已知二元函数表达式如下:
x,y的取值区间都为[-10,10],用遗传算法求函数的最大值。
解 (1)编码。
先考虑用二进制编码法,假设求解精度为小数点后6位,也就是要将[-10,10]区间除以20后再除以106,那么二进制位数需要达到25位(225-1=33 554 431),用0 0000 0000 0000 0000 0000 0000到1 1111 1111 1111 1111 1111 1111来代表[-10,10]区间的所有取值。因为有x,y两个变量,所以染色体编码为50位,前25位代表x,后25位代表y。
将编码还原为[-10,10]区间的实数值的方法为
Python参考代码为:
其中,interval是用列表表示的区间,interval=[-10,10];chromosome Length为编码长度;chromosome为染色体编码。
(2)适应度函数。
不难判断,f(x,y)≥0,所以按照式(5.2),直接使用f(x,y)作为适应度函数。(www.xing528.com)
(3)评估方法。
对将种群中每个染色体代入函数所求得的值进行累加,然后用每个个体的值除以累加的和,得到的值就可以看作是每个染色体被选中的概率,这时就可以用轮盘赌选择策略选择两个染色体进行重组了。参考代码如下:
(4)重组。
采用单点重组方式,其实现参考代码如下:
在实际使用时,需要对染色体里的x部分和y部分分别进行重组和突变。
(5)突变。
随机选择某一位,对其取反。
(6)参数设置。
参数的设置可以根据程序调试的实际情况进行调整,本例中设置如下:
种群大小populationSize=50,染色体编码长度chromosome Length=25,重组概率crossover Rate=0.8,突变概率mutation Rate=0.05。
完整代码请参考本书附带程序p5_2/p5_2_GA01.py,Plot TheFunction.py用于绘制函数图形。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。