以上我们做了一个基本的工作,将函数集合,终结符集合,和适应性函数构造起来了。以下的工作就是如何实现遗传操作。当然一些细节上的工作我们也将处理。
我们再回想一下,我们在前三部分都做了什么工作!
一、总结
(1)建筑材料
在第一部分中,我们设置了函数集合和终结符集合。这些是我们GEP算法操作的基本元素。
这称为基因表达式编程环境,可以表示成一个二元组,记为
GEP-ENV=<F,T>
其中F表示函数集合,T表示终结符集合。在不引起歧义的情况下,简记为:
GEP=<F,T>
也就是说我们第一步做的工作,是给GEP建立了一个环境。相当于我们做建筑时给了一些材料。
(2)建筑构件
在第二部分中,我们设置了基因组或者说染色体的结构,和种群结构。这相当于我们将建筑材料连接成了一些构建。
我们称为K—表达式(染色体),以及K-表达式序列(种群)。
(3)建筑标准
第三部分中,我们给出了一些常用的适应性函数,在建筑学中,也就是建立了一个建筑标准。
完成了以上三部分内容,相当于我们有了建筑材料,并且知道了怎么去组建一些建筑构件。并且我们也有建筑标准。那么我们
剩下所做的就是如何将这些组装起来,并且在这些构件的组装过程添加一些组装方式。
二、如何制作建筑构件
我们按照第一部分所给那个标准程序进行。
首先我们需要做的是产生初始种群。使用以下接口和类来完成
public interface Initializer
{
/**
* 产生初始种群
* @return
*/
Population generateInitialPopulation();
}
这个是一个基本的接口,给出了唯一的方法,generateInitialPopulation(),产生初始种群。以下我们给出一个用于数值优化的初始种群产生器。
/**
* 用于数值优化的初始种群产生器
*/
public class GepInitializer : Initializer
{
private GEP gep;
private int size; // 种群大小
public GepInitializer(GEP gep, int size)
{
this.gep = gep;
this.size = size;
}
public Population generateInitialPopulation()
{
// int populationSize = gep.getPopulationSize();
Population population = new Population();
int geneNumber = gep.getGeneNumber();
int geneHead = gep.getGeneHead();
int geneTail = gep.getGeneTail();
int geneLength = gep.getGeneLength();
for (int k=0; k<size; k++)
{
char[] genes = new char[geneLength*geneNumber];
int index = 0;
for (int j=0; j<geneNumber; j++)
{
for (int i=0; i<geneHead; i++)
{
genes[index++] = gep.getHeadCode();
}
for (int i=0; i<geneTail; i++)
{
genes[index++] = gep.getTailCode();
}
}
population.add(new GepChromosome(new String(genes)));
}
return population;
}
}