bartvig/simple-ga

1.0.5 2019-12-15 16:32 UTC

This package is auto-updated.

Last update: 2024-09-16 02:36:00 UTC


README

PHP中的简单遗传算法实现

这是一个相当快速且简单的遗传算法实现,具有通用的基因组和基因组种群。

一些元素,如种群大小、复制到下一代的最优秀基因组的数量、每代新随机基因组的数量和突变率,可以通过依赖注入(使用Pimple)进行配置。

可以通过覆盖GenomePopulation类来实现其他自定义。

有关如何使用SimpleGA的示例,请参阅 https://github.com/bartvig/queens-ga

安装

使用composer安装所需的库:composer install。然后您可能需要运行composer dump-autoload -o以使自动加载正常工作。

Composer的安装不在本文档的范围内。

如何运行

这是一个通用实现,不能单独运行。有关如何使用此实现的示例,请参阅 https://github.com/bartvig/queens-ga

配置

这些变量必须在Pimple容器中配置

  • population_size:种群中的基因组数量。
  • population_random:为每个种群生成多少随机基因组。这可以用来在种群中引入新的随机基因。
  • elite_count:复制到下一代的最佳基因组数量。
  • mutation_promille:千分率突变率,例如,5%的突变率是50
  • genome:特定基因组实现的生成。这应该返回一个基因组类的新实例。例如(当Pimple容器被调用为$container时):$container['genome'] = $container->factory(function ($c) { return new \QueensGA\QueensGenome($c); });

此变量可以配置

  • evaluate_points:这是一个键值对的关联数组,用于评估基因组。例如,二次方程中的某些点:[ 0 => 0, 2 => 4, 4 => 16 ]

基因组

基因组是我们试图解决的问题的提议解决方案。

必须覆盖以下函数

Genome::mutate()Genome::evaluate()什么也不做,必须由要解决的特定问题的实现来覆盖。

mutate()应该通过随机更改一个或多个基因来更改基因组。没有默认的突变。

evaluate()必须评估基因组的适应性 - 基因组越适应,值就越低。0是允许的最小适应性。

可选的覆盖函数

默认情况下,基因组的基因是数组中的元素。这使得交叉和产生后代变得容易,因为我们只需要切片和合并数组。如果您想将基因构造为除数组之外的其他东西,可以覆盖Genome::generate()Genome::getPart()

如果您想在每一代或执行完成后输出基因组,可以覆盖Genome::toString()

种群

通过生成基因组、根据适应性对基因组进行排序、生成新基因组和突变基因组来处理基因组种群。

这个类不需要重写且处理基本功能。 Population::initialize() 根据配置初始化种群。对于每一代新种群,调用 Population::nextGeneration()。此函数执行以下步骤,使用配置中的值

  1. 将大多数 elite_count 最适合的基因组复制到下一代。
  2. 产生后代。更适合的基因组更有可能被选中进行交配。随机选择两个基因组,并随机选择两个交叉点,为每个父代生成两个半基因组。这些半基因组混合产生两个孩子。
  3. 评估整个种群。如果配置了 evaluate_points,则使用这些值来评估基因组。否则,在没有外部值的情况下独立评估基因组。

当一代完成时,可以使用 Population::getFittestGenome() 获取最适合的基因组。