如何在 GALib 中定义 GA1DArrayGenome 的初始值设定项<float>?

How to define an Initializer for GA1DArrayGenome<float> in GALib?

本文关键字:lt float gt GALib 定义 GA1DArrayGenome      更新时间:2023-10-16

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

我很难初始化种群,因为在调用gasimplega :: evolve()之后,我发现我使用的任何随机种子,每个染色体的基因都是[0 0 0 0 0 0 0 0 0]。

我检查了该文档,发现对于Ga1DarrayGenome类,默认初始化器是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);
  // ...

我没有在'::'。

有人可以帮我吗?谢谢。

名称空间

前面没有名称空间的::Foo表示在全局名称空间中声明的Foo(即未选择名称空间)。用它将当前名称空间"逃回"到全球空间。另一个示例是::std::string,即std名称空间中的string类。

初始化

GA1DArrayGenome<T>非常通用,对T不了解。它不知道可接受的值或如何处理这些值。因此,您需要提供初始化器,突变器等。如果您只想"开箱即用" float优化,请考虑使用带有良好默认值的派生类GARealGenome。有关演示代码的Galib页面上的示例21。