论文摘要
算法识别,也被认为是程序理解,是一项重要但困难的工作。在过去的几十年中,不断有人提出各种方法来进行算法识别的工作,绝大多数的方法都是模板化的。基于模板的识别工作其实就是一个匹配人为定义的各种模板的过程。为了某一种特定的算法,需要事先在模板库中设定好这个算法的识别模板。这种方法在识别算法的工作中,获得了不错的效果,有较高的识别准确率。但同时,基于模板化的识别方法也给此项工作带来了局限性:当一个算法有多种实现版本的情况下,人们一般需要在模板库中定义这个算法的多个实现模板,以达到识别的效果。但往往,针对有些算法,我们很难事先去确定它们的实现版本的数量,这样我们也无法事先在模板库中完全定义好它们的模板。当有一个未定义算法模板的程序需要进行算法识别时,往往给不了任何的答案。本文结合了国家自然科学基金项目:“网络知识互联结构自主发育模型研究”,针对上述问题,我们认为程序设计中的算法也是一种特定的知识,如何使这些特定的知识不通过人为事先定义的方法就能识别,摆脱人为过多干预是我们的一个研究目标。类似于算法识别这样的人工智能任务,与其他人工智能任务有相似点,即受过专业训练的人能够轻松完成,而机器却需要在这些专业人士的干预下勉强完成这些工作。这种任务被称作为“泥泞的”任务。近十年来,通过模仿人类智能发育思想的自主式机器发育思想在机器人和人工智能领域取得到了一定的成功,得到了越来越多的关注,同时也给我们的算法识别工作带来了新的思路。我们希望传统意义上那些模板并不是由人为事先设定的,而是通过我们的发育程序,根据接收到的输入信息以及与周围环境的交互中不断的发育出来的。这样就可以避免我们提到的模板定义不完全这个问题。本文将按如下步骤展开:首先,我们将度量各个程序代码之间的差异性。程序代码,通常被认为是非向量化的变量。我们把程序代码树转化为语法解析树,计算之间的树编辑距离,将得到其相异度矩阵。其次,有了这个相异度矩阵,我们就可以通过自组织图的对离散、非向量化的数据变量进行聚类算法把在输入空间中有代表性的程序代码聚类在一张自组织图上,通过这张自组织图中的神经元结点,即程序代码,和输入的程序代码之间的距离来映射出输入程序代码的向量,我们称它们为向量化的程序代码模板。最后,自主心智发育思想框架下的神经网络:叶分量分析法将被用做来对这些的数字化程序代码向量进行发育,而两层的叶分量分析法所组成多层在位学习网络将能达到识别的作用。这样的网络达到能够识别一个算法的多种实现的要求。基于以上理论与方法,讨论本课题组开发的识别程序对一定量的简单算法的程序代码识别工作的识别率达到93.4%。并且对未来的程序设计算法识别的工作做出一些展望。