如何在GALib中为GA1DArrayGenome <float>定义初始化器?</float>

时间:2014-01-30 03:58:52

标签: c++ namespaces genetic-algorithm galib

我正在使用GALib2.4遗传库中的GA1DArrayGenome类。我的目标是优化6个浮点数的列表,因此染色体应该是[0.3 0.5 0.1 0.2 0.4 0.1],[0.03 0.04 0.1 0.2 0.05 0.8] ......

我无法初始化群体,因为在调用GASimpleGA :: evolve()之后,我发现无论我使用什么随机种子,每个染色体的基因都是[0 0 0 0 0 0]。

我检查了文档并发现对于GA1DArrayGenome类,默认的Initializer是一个GAGenome :: NoInitializer,我认为这意味着我必须为这个基因组类找到另一个初始化器?

void main() {
// ...
GARandomSeed(1);
GA1DArrayGenome<float> genome(6, &Objective);
genome.initializer(/* ?? */);

GASimpleGA ga(genome);
ga.populationSize(100);
ga.nGenerations(100);
ga.pMutation(0.001);
ga.pCrossover(0.6);
ga.evolve();
cout << ga.statistics().bestIndividual() << endl;
// ...
}

以上是我使用GALib的程序。它模仿示例代码ex27.C和库中的内容。但是,样本正在执行类似

的操作
  // ...
  GA1DArrayGenome<float> genome(2, Objective);
  genome.initializer(::Initializer);
  genome.mutator(::Mutator);
  genome.comparator(::Comparator);
  genome.crossover(::Crossover);
  // ...

在'::'之前不使用名称空间,我不太了解它的含义。

有人可以帮我这个吗?谢谢。

1 个答案:

答案 0 :(得分:0)

命名空间

前面没有命名空间的::Foo意味着选择了在全局命名空间中声明的Foo(即没有命名空间)。使用此命令从当前命名空间“转义”回全局空间。另一个示例是::std::string,即string命名空间中不能嵌套的std类。

初始值设定

GA1DArrayGenome<T>非常通用,对T不了解。它不了解可接受的值,也不知道如何处理这些值。因此,您需要提供初始化程序,变更程序等。如果您只想“开箱即用”float优化,请考虑使用derived class GARealGenome that comes with good defaults。有关演示代码,请参阅GALib页面上的示例21.