GEP程序(C#语言描述)分析(四)

来源:互联网 发布:共享经济的相关数据 编辑:程序博客网 时间:2024/05/18 01:38

以上我们做了一个基本的工作,将函数集合,终结符集合,和适应性函数构造起来了。以下的工作就是如何实现遗传操作。当然一些细节上的工作我们也将处理。

 我们再回想一下,我们在前三部分都做了什么工作!

一、总结

     (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;
 }
 
}

原创粉丝点击