遗传算法与寒武纪生命大爆发

大概把遗传算法寻路的小程序做完了,10×15的矩阵,给定起点与终点,采用遗传算法寻路,路径无要求,能走通即可

经典遗传算法的过程是:

1.随机生成染色体
2.世代开始,对于每条染色体计算适应度
3.轮盘法选择出新的两条染色体
4.以一定概率杂交
5.再以一定概率变异
6.得到新的基因组,完成一个世代
7.一直重复世代至到可以到达的路径(即适应度为1的染色体)

然后一运行,悲剧了,完全靠运气啊!实际测试,运气最好的时候只要30ms,经历97个世代,最差的时候居然达到10s,大部分还是500ms以上

总该优化下吧,开启任务管理器,发现程序运行的时候cpu4个核心只有一个在满负荷运作,其他都在打酱油

恩 那就来多线程吧

多个基因组同时进化,每一个世代淘汰掉适应度最差的基因组,然后从其他基因组里循环用轮盘法组成一个新的基因组,加入

结果更崩溃了,最好要300ms,一般都在500ms内,但是最坏情况居然到了20s,应该是发生了传说中的‘早熟’,实在是无奈,也不愿修改了,想想其他的方法把

生命大爆发

不错,就是类似那个寒武纪生命大爆发(不太了解?猛击这里),一个种群达到某个世代时,如果还没进化出噬石真象,那么在接下来的若干个世代里就要疯狂变异,我以100代为限,如果到了100代还不能找到结果,那么变异率变成100倍,直到110代,变异率恢复正常

发现效果相当好!接近60%的计算在200代内就完成(基本上都在150ms以内),与此同时,不能很快完成的普遍都跑到了上千世代

再进一步 生命的重新演化

如果当前世代超出了我们的忍受范围,不妨抛弃这个基因组,开始新的进化历险记

我给它140代的变异缓冲时间,一旦超过250代(这个数字绝对没有其他含义),恩,BYE-BYE,新的进化开始

果然,现在基本都控制在1s内了,实验50次,最坏情况重新演化了6次,总耗时1302ms,而80%的计算都在350ms内完成(最多需要一次重新演化)

与最早的结果对比,成效显著!

只是突然一惊,在进化路上,等待我们人类的是最终的结果,还是?

  1. There are no trackbacks for this post yet.

填写留言

注意: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。使用'@all ',将会将评论发送给之前所有其它评论者。请务必注意user必须和评论者名相匹配(大小写一致)。