您的位置:首页 >> 操作系统 >> Linux >> 正文
Linux RSS
 

功能丰富的Perl:Perl用于实现遗传算法

http://www.rdxx.com 03年09月04日 08:35 互连网 我要投稿

关键词: 遗传算法 , 功能 , Perl , 算法

  如果您的机器上已经安装了 Perl 5.005 或者更高的版本,您可以运行一下文章中的例子。您的系统最好应该是安装了最近的(2000 年或者更迟些)主流的 UNIX(LinuxSolaris,BSD),但其它种类的操作系统可能也可以。文中的例子可能可以在更老的版本的 Perl、UNIX 以及其它操作系统下运行,但是如果不行的话,读者应当把它看作是一次练习来解决。
  
  历史
  进入 20 世纪以来,在速度和影响范围方面遗传学的发展只有电子学和计算机科学能与之相比。遗传算法是 20 世纪出现的最令人感兴趣的算法之一,这一说法是恰当的。
  
  遗传算法(以及普遍意义上的进化算法)出现在 20 世纪 60 年代早期,并在计算机科学的确定性和非确定性算法之间占据了一席之位。本质上,遗传算法具有如同您所希望的那样的确定性,意味着用户可以决定重复次数和结束条件。它模拟达尔文的自然选择,还有变异,把“适应性”(正如适用于个体的公式所决定的那样)作为主要因素选择生存繁衍和变异的个体。
  
  其它的进化算法试图模拟拉马克的进化论,在他看来,行为是一种生存的机制,可以在两代之间传递,甚至有一些进化程序是出于某种目的而自然出现的。以上这些都不在本文的论述范围之内。
  
  Perl 用于实现遗传算法的主要缺点在于速度慢。由于遗传算法的计算需要,用 C 语言或其它低级的预编译语言来实现效率会更高。本文展示的 Perl 例程不如其 C 语言的等价程序快,但是可以使您明白遗传算法是如何工作的,况且,对于一些问题来说,已经够快了。
  
  那么什么是遗传算法呢?
  遗传算法是如此简单,任何人只要用高中时学过的生物术语就可以理解。以一群个体为例,它们都有自己的 DNA。然后衡量每一个个体的适应性(把它看作是适用于个体的 DNA 的官能来衡量),并且使那些更适应的个体更有可能繁衍。而最不适应的个体将会被灭绝。每个幸存者都会有机会繁衍(重要的是任何幸存者都可能会繁衍,如果不太适应的话,仅仅是降低了可能性)。合并双亲的 DNA,对合并后的 DNA 应用随机变异以模拟繁衍。理论上说来,新的个体是和双亲一样适应的,由于变异或增或减会有些微小的变化。然后循环会周而复始。
  
  显然,有许多变化的因素在影响遗传算法,包括人群大小、代(算法的迭代)、合并方法、适应性函数,适应性将如何影响繁衍的可能性,以及发生了多少变异。
  
  该算法也存在一些缺陷。如果把应用于 DNA 的适应性官能看成是一系列的二进制位,效果最好。换句话说,如果 DNA 是一系列二进制的选项,是还是不是。蓝眼睛?黑眼睛?红头发?黑头发?合并双亲的 DNA 和随后的变异应当不允许特定的一些位组合出现,因为得出的 DNA 可能不再是最初的问题的有效解答。请记住,所谓“DNA”仅仅是适应性公式纯数学的一种解答。该公式中用到的一些值可能是无效的 — 例如,除数为零。
  
  另外,遗传算法不受时间限制。由您来挑选代的数目。您可以确定某个目标 — 比方说,“找一个适应性为 0.99999 的个体”,找到后停止。但是,结果是算法永远也不会结束,因为它没找到那个个体。如果您制定了不切实际的目标,或者代的数目太小,就会出现问题。尝试、出错,以及深入的思考是解决这个问题的最佳途径。
  
  适应性公式返回的是介于 0 和 1 之间的一个浮点数。您也可以使用其它的范围的数,但是我的经验告诉我,浮点数是最有效的。比如,如果出于优选的考虑,您希望适应性是一个 7 位的整型数,您想要的范围就是 0 到 32767 之间。
  
  当然,把优选推迟到您认为有需要的时候,这是一个好主意,那么您在开始的时候,最起码得有一个简单的适应性公式。适应性公式是遗传算法中最常用的函数,(它将要被调用的次数是(人群大小)x(代的数目)次),所以您应当尽可能的使它简单、快速。

9 7 3 1 2 3 4 8 :


 
 
标签: 遗传算法 , 功能 , Perl , 算法 打印本文
 
 
  热点搜索
 
 
 



Valid XHTML 1.0 Transitional
Copyright ©2005 - 2008 Rdxx.Com,All Rights Reserved
收藏本页
收藏本站