bartvig / simple-ga
Requires
- pimple/pimple: ^3.2
README
PHP中的简单遗传算法实现
这是一个相当快速且简单的遗传算法实现,具有通用的基因组和基因组种群。
一些元素,如种群大小、复制到下一代的最优秀基因组的数量、每代新随机基因组的数量和突变率,可以通过依赖注入(使用Pimple)进行配置。
可以通过覆盖Genome和Population类来实现其他自定义。
有关如何使用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()。此函数执行以下步骤,使用配置中的值
- 将大多数
elite_count最适合的基因组复制到下一代。 - 产生后代。更适合的基因组更有可能被选中进行交配。随机选择两个基因组,并随机选择两个交叉点,为每个父代生成两个半基因组。这些半基因组混合产生两个孩子。
- 评估整个种群。如果配置了
evaluate_points,则使用这些值来评估基因组。否则,在没有外部值的情况下独立评估基因组。
当一代完成时,可以使用 Population::getFittestGenome() 获取最适合的基因组。