关于遗传算法,网上已经有很多相关的入门级介绍了,这里稍微推荐几个:
关于遗传算法的代码网上有很多,http://www.pudn.com/search_db.asp?keyword=%D2%C5%B4%AB%CB%E3%B7%A8,不过更多的都是用Matlab以及常见的c语言编写的,用Python的并不多,而且pudn网站是需要提供代码注册的,本人也并未注册,于是处于自己的喜好,用Python对此进行了实现。
(建议看完上述的基本介绍再往下看实现方法,一些基本属于下面不多做解释)
代码部分可见https://coding.net/u/zealseeker/p/geneticAlgorithm/git,虽然一直在用csdn的代码托管,不过最近发现coding.net也是个很不错的托管代码地方,而且它有WebIDE,可以在线编辑以及调试,所以就尝试了一番。
改代码分两个类,基因类和染色体类(我用基因组geneome表示),基因类包含基因的序列(一般我们用0或1表示)以及长度,适应值函数(评价改基因的好坏标准)以及与之相关的基因突变率。上述的对遗传算法介绍里都仅仅讲了怎么突变,却没怎么提该不该突变。一般现实中基因突变是有一定概率的,所以我预设了一下突变概率函数,mutaterate,而且该函数取决于最优适应值函数以及最低适应值函数,尽管这种概率设定不见得合乎生理,不过为了更快速得到结果加上本身我们也当然希望尽可能让不好的基因多突变,所以这样设定。用户也可以将consider_rate设为False,那么就必然突变。
而基因组类就包含了遗传的几个常见过程,交叉重组、突变(其实就是让每个候选基因进行单点突变)以及选择(即决定怎么样基因被保留),这里面本人也设定了两种方案,一种是大多数博文提到的赌盘选择法,但是本人发现对于适应值函数差异并不大的情况,用赌盘选择法效果并不好,比如10分于12分对应比例即45%与55%,10分被保留的概率仍然很大,相比之下我们可能会特别想追求12分,于是本人加了一种看似并不合理的方法,即只保留适应值函数高的基因(被遗传到下一代)。
在test.py的预设模块中进行测试发现,如果用随机模型(赌盘选择)法,即使遗传100次,也就只有500-600的打分(满分10*75=750),比如下面这种情况,可见随机性还较大
[0, 0, 1, 1, 1, 1, 1, 1, 0, 0] 38
[1, 1, 1, 1, 1, 0, 0, 1, 1, 1] 57
[1, 0, 0, 0, 1, 1, 1, 1, 1, 0] 21
[1, 1, 1, 0, 0, 0, 0, 0, 0, 0] 56
[0, 1, 1, 1, 0, 0, 0, 0, 0, 0] 59
[0, 1, 1, 1, 0, 0, 0, 0, 0, 0] 59
[1, 1, 1, 1, 0, 1, 0, 0, 0, 0] 56
[0, 1, 1, 1, 0, 0, 0, 0, 0, 0] 59
[1, 1, 1, 1, 1, 1, 0, 0, 0, 1] 61
[1, 1, 1, 0, 0, 0, 0, 0, 0, 0] 56
522
而如果使用适应值最优的遗传方法,那么10次遗传后则有600-750之间,100次以后大多数都是750分。
这可能跟基因的长度太短有关,这里就不多做测试了,主要还是以学习了解为主。可能将来能够用上,如果当适应值打分函数换成别的需要的找最优化的函数或算法后,则理论上就能找到接近最高的序列