ROBOT & AI

首页 | 新闻 | 产品 | 竞赛 | 学苑 | 读书 | 硬件 | 软件 | 智能 | 制作 | 项目 | 资源 | 论坛
 您的位置:首页 >> 智能 >> 遗传算法 >> 正文
站内搜索:   

Perl-遗传算法

来源:www.ibm.com/developworks/cn  佚名 字体:[ ]  2007-02-07

关键词:遗传算法

实际上实现繁殖的是一个随机的8位位掩码。我们只把这个位掩码和第一个双亲的DNA(请记住,它只是一个字节)作AND运算,并且把位掩码取反后和第二个双亲的DNAAND运算。结果,我们可以从一个双亲上随机选择某些位,其余的来自另外一个双亲。

变异是通过对个体的DNA和随机生成的8位位掩码作ANDOR运算实现的。

对了,顺便说一下,最适应的DNA当然是255。您并不需要等待100,000代。当您只是在欣赏状态行时,请按Ctrl-C结束。

繁殖单词
在这个例子里,我们用的DNA32位(5个字节)的。每个字节代表一个字母或者一个空格。我们本来可以在一个字节中包含更多的信息,但是这样可能会使这个例子的本意变得模糊。每一字节的值(介于0-255之间的数值)可能对应AZ之间的一个字母(如果它的值在6590之间,便于选择同ASCII码集相匹配),或者也可能是一个空格(如果数值介于064之间,或91255之间的话)。

请关注一下下面的这个例子和清单1的例子的相似之处。dictionary的单词跟在程序的后面。

清单3.繁殖单词

words.pl source

这个例子的主要问题在于长度超过32位的DNA不好处理。开始我尝试着自己做位操作,结果不仅仅是难处理,而且速度极慢。然后,我试了一下Math::BigInt包,用在这里还是非常慢。 您可以运行清单3,程序文件为words.pl

最后,我决定使用vec()函数它的速度相当快,对于处理DNA而言,它无疑是正确的选择(本质上,DNA是个位向量,一个内建的Perl数据结构)。用“perldoc-f vec”查找更多有关vec()函数的信息。

1024个个体的适应性为0的结果也是有可能出现的。这个例子比第一个例子能更有效的预防这样的意外的原因正在于此。

修改init_population()recombine()mutate()函数以处理位向量而非字节。

dna_to_words()函数的效率不高,但并不经常调用它,所以问题不是很严重。速度慢的最主要的因素是fitness()函数试图匹配dictionary里的所有单词,以及字母表里的所有字母。

适应性是这样计算的:DNA里的每一个字母是一个2,加上那个字母在dictionary里出现的频率,再为DNA里长度为N的每个dictionary单词加上2^Ndictionary数组以及字母频率的散列只得到一次(使用closure)。您可以任意修改适应性函数和dictionary来繁殖您自己的英语单词。如上所示的适应性公式很大程度上偏向字母,要汇集成英语单词还需要一定的时间(尽管“on”“in”频繁出现)。

结束语
进化遗传算法是个非常吸引人的话题,在一篇文章中想把所有内容都讲清楚几乎是不可能的。我希望您能实践一下这些例子,并创建您自己的达尔文繁衍基础。试试第二个例子中的fitness函数,看着英文单词从原本无意义的字母和空格中出现,这真是一项非常有意思的娱乐。

上面的例子中用到的技巧涵盖了从初级到高级的范围,因此请尽量彻底理解这些内容。通常情况下仍有改进的空间。vec()函数尤为有趣。它非常适合于象DNA或者其它的数值数据之类的长的位向量。

4页 上一页 [1] [2] [3] [4] 下一页 

录入:master 点击:

[发表评论] [打印文章] [关闭窗口]  

原创文章属本站所有,转载请注明来源:Robotain.com  
相关文章

 网友评论(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

发表评论 昵称:

  

  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
最新推荐
热门文章
论坛精华
网站简介设为首页 加入收藏在线留言友情链接联系我们 - 广告服务 - 版权申明

Copyright © Robotain.com  all rights reserved  浙ICP备07003355号

版权所有 机器与智能网