武汉大学软件工程国家重点实验室 康立山 陈毓屏 李元香
自动程序设计是计算机科学的中心目标之一。早在1959年,Arthur Samuel就指出,自动
程序设计涉及的问题是怎样使计算机去做所需做的事,而无须精确地告诉它怎样去做。30多
年来,人们一直在为实现自动程序设计而奋斗。
1992年,美国Stanford大学的J.Koza出版了专著《遗传程序设计(Genetic Programming
:On the Programming of Computers by Means of Natural Selection)》,介绍用自然选择
的方法进行计算机程序设计。1994年,他又出版了《遗传程序设计(二):可重用程序的自动发
现(Genetic Programming II:Automatic Discovery of Reusable Programs)》,开创了用遗
传算法实现程序设计自动化的新局面,为程序设计自动化带来了一线曙光。
遗传程序设计已引起计算机科学与技术界的关注,并有许多应用。
一、遗传程序设计
遗传程序设计是学习和借鉴大自然的演化规律、特别是生物的演化规律来解决各种计算
问题的自动程序设计的方法学。为了阐述什么是自动程序设计,我们先引入程序结构(Progr
am Structure,PS)的概念。
1976年,N.Wirth曾用下面的公式来表示计算机程序:算法+数据结构=程序(Algorithms+
Data Structures=Programs)。因此,一个计算机程序可以用一个S(表达式)或一棵树来表示
。例如,计算f(x)=(x+0.1×sin2x)/cos 的程序的表达式为:(2x×sin0.1×x+xcos/)。
从程序树结构表示可以看出,一个计算机程序是由两种基本程序集合的元素复合而成的
。一个是运算集合,如树中的非叶节点:+、-、×、/(算术运算)与cos、sin(函数运算),它们
用来描述一个算法;另一个是数据集合,如树中的叶节点:2、0.1、x(INTEGER、REAL),它们用
来组成数据结构。
我们把一种程序设计语言的运算集合(包括其内部函数及子程序库)记作O,把它的数据集
合(包括数据结构)记作D。任何一种程序设计语言都必须提供其运算集合O与数据集合D。程
序设计语言越高级,所提供的运算集合与数据集合的内容越丰富,且运算集合与数据集合的复
合映射形成的程序成份也越复杂。从程序树来看这种复合映射的例子,+、-、×、/都是二元
运算,即(a+b)、(a-b)、(a×b)与(a/b)。
我们把一种程序设计语言的程序结构定义为它的运算集合与数据集合的复合体,即PS=O
οD。由于D中可包含逻辑型与字符型等数据,O中可包含(ifthen)与while等操作,所以程序结
构包含了该语言的全部基本程序成份,反映了该语言的全部功能。一个问题的程序结构由该
问题的数据结构及求解问题的算法来决定,它通常是PS的一个子集合。也就是说,一个问题的
求解程序只使用该语言的部分功能。
Koza选择Lisp作为GP的程序设计语言。有了程序结构的概念,在前文介绍的演化算法的
基础上,即可讨论自动程序设计(Automatic Programming,AP)。可以用下面的公式来概括自
动程序设计的思想:EA+PS=AP(演化算法+程序结构=自动程序设计)。
Holland的标准遗传算法中的遗传群体是由一些二进制字符串组成的;而GP或AP的遗传群
体是由一些计算机程序组成的,即由PS的元素形成的程序树组成。AP从以PS的元素随机地构
成计算机程序的原生软体开始,应用畜牧学原理繁殖一个新的(常常是改进了的)计算机程序
群体。这种繁殖应用达尔文的"适者生存、不适者淘汰"的原理,以一种领域无关的方式(EA)
进行,即模拟大自然中的遗传操作:复制、杂交(有性重组)与变异。杂交运算用来创造有效的
子代程序(由PS的元素组成);变异运算用来创造新的程序,并防止过早收敛。所以,AP就是把
PS的高级语言符号表示与EA的智能算法(一种以适应性驱动的、具有自适应、自组织、自学
习与自优化特征的高效随机搜索算法)结合起来,即AP=EA+PS。一个求解(或近似求解)给定问
题的计算机程序往往就从这个过程中产生。
下面给出GP繁殖求解问题的计算机程序的步骤:
(1)用问题的运算(∈O)与数据(∈D)随机地复合(即用PS的元素)产生一个初始计算机程
序群体。
(2)迭代地实施下述步骤,直到满足终止条件。
(1)执行群体中的每个程序,并根据其适应性给它指定一个适应值。
(2)应用下述三种遗传算子创建一个新的计算机程序群体(这些算子作用在那些根据其适
应概率从已有群体中选出来的个体上)。
·繁殖:复制一个已有的计算机程序到新群体中。
·杂交:从两个已有程序中随机地选其部分进行重组,创造两个新的程序加到新群体中。
·变异:随机改变一个现存程序的随机选取部分,创造一个新程序加到新群体中。
(3)从计算机程序群体中识别最好的程序,作为这次运行GP的结果,它可能是问题的一个
解或近似解。
上述过程是实现自动程序设计的基本框架,对不同的问题,它们的差别可以很大。首先,
对不同的问题,其运算集合与数据集合不同。Koza分别称之为问题的函数集合F与端点集合T
,一般有F O与T D。一般说来,问题的程序结构越简单,即|F|与|T|越小,问题的程序空间
越小,GP求解也就相对容易一些。
程序空间的完备性建立在程序结构的完备性理论的基础上。一个问题的程序结构一般是
该程序语言的程序结构的一个子集。这方面有许多理论问题需要进一步研究。
驱动程序不断演化的动力是根据适应函数给群体中的每个计算机程序评分,即计算其适
应值。它通常由一组训练数据(输入,输出)来测试。成功率高的个体,其适应值也高。针对不
同问题选取合理的适应函数是使AP获得成功的一项关键技术。
为了提高自动程序设计的效率,Koza引入了一种关键技术:自动定义函数,以实现可重用
程序的自动发现。
二、遗传程序设计的并行处理
并行计算技术的发展为自动化程序设计提供了物质基础。遗传程序设计的内在并行性为
高效地利用并行计算最新成就来实现程序设计自动化提供了可能。自动程序设计是以计算智
能来取代人的智能。应用EA进行自动程序设计的代价是计算机资源的高消费。
现在来分析前面描述的用GP繁殖计算机程序的算法的并行性。算法的控制参数如下:
·计算机程序群体的规模N(即群体所含程序个数)。
·遗传算子的分布概率:繁殖概率Pr,杂交概率Pc与变异概率Pm。
·演化的代数g。
算法的并行度取决于问题的群体规模N。算法的粒度取决于程序长度、程序测试集的大
小、程序评估方法及遗传算子的计算复杂性等。
算法的性质除依赖于并行度与粒度外,也依赖于遗传算子的分布概率Pr、Pc与Pm。由于
它们一般均大于零,所以算法不是完全同步的。
从算法的计算步骤可以看出,产生初始群体的过程是完全并行的,并行度=N。计算个体的
适应值也是完全并行的,并行度=N。进行遗传操作的过程也是完全并行的,但由于杂交运算是
对两个个体进行的,所以并行度≤N。
由此可见,该算法是异步并行的,所以适合在大规模MIMD计算机系统及分布式计算机系统
上执行。Koza在电路自动设计中采用的最大群体规模N=64万,遗传算子的概率分别为Pr=10%
,Pc=89%,Pm=1%。他们用一台由64个PowerPC 601(80MHz)处理机组成的中等粒度的并行Pary
stec计算机系统执行,64个处理机每个计算1万个个体,所以这种方法称作分布式演化算法。
由此可见,用大规模并行MIMD系统来实现自动程序设计是高效率的,即可充分发挥大规模
并行计算机系统在自动程序设计中的作用。实际上,规模较大的问题,其自动程序设计一般只
有采用并行处理方式才可能完成。遗传程序设计算法是并行计算环境下的产物。可以预言,
自动程序设计方法将随着并行计算的飞速发展而发展。
三、自动程序设计的实例
在第三届IEEE演化计算国际会议上,Koza等发表了一篇论文,以细胞自动机、分子生物学
与电子电路合成等问题为例,将GP演化出的计算机程序与人编写的程序进行比较。对这些问
题,他们用GP演化出来的计算机程序产生的结果比人对同一问题编写的程序的结果还要好一
些。他们较详细地介绍了GP是怎样解决电子电路合成问题的,如交叉滤波器(低频扬声器与高
频扬声器)的设计、低通滤波器和放大器的设计,以及非对称带通滤波器的设计。应用GP既演
化出了所期望的电子电路拓扑,也演化出了每个元件的规格。
下面介绍武汉大学软件工程国家重点实验室提出的复杂系统演化建模理论,他们应用自
动程序设计研制成功了基于演化计算的自适应复杂函数建模软件。该软件具有"计算智能"—
—自适应、自组织、自学习和自优化的功能。用户只需提供样品数据表{(xi1,xi2,…,xin,
yi);(i=1,2,…,m)}及所期望模型的精度,无需提供任何数学知识,应用智能建模软件,计算机
即可自动给出满足用户需求的数学模型。
例如, 应用该软件做三峡大坝处的岩石结构分析时, 所给的数据如下:
@@27107000.GIF;表1@@
用户要求由此找到五类岩石结构y与它们的移动率x1、结合率x2、强度x3、变形系数x4
的关系。计算机求得下述模型:
@@27107001.GIF;算式1@@
f2(x)=1.69+x1-x42+0.258x3-1
f3(x)=2+x1-x4+0.225x3-1
f4(x)=ln(5.09x2+0.39+12.78x1/x3)
f5(x)=exp(1.50(cos x3-cos x1)+cos(1.7132))
由计算机找到的这五个模型,都满足用户要求的精确度,这是数学家与岩土力学家很难构
思出来的。有人把该软件称为"傻瓜建模软件",使用该软件就像使用"傻瓜相机"一样。因此
,遗传程序设计给程序设计自动化带来了一线曙光。