#遗传 # #ga

genetic_algorithm_meta

用于优化遗传算法参数的遗传算法实现

2个版本

0.7.2 2024年7月27日
0.7.1 2024年7月27日

745算法

Download history 153/week @ 2024-07-21 106/week @ 2024-07-28 2/week @ 2024-08-04

每月261 次下载

MIT/Apache

33KB
504

genetic-algorithm-meta

此库是从genetic_algorithm中提取出来的,因此依赖于它。版本号保持同步,以表示兼容性。

对于基因型,一个有趣的事情是创建所有交配/突变/竞争策略和其他进化参数的元基因型。这可以用来优化某些其他遗传算法的参数。是的,简单的嵌套循环也会起作用,但那有什么乐趣呢?但我没有找到创建这种异质设置的高雅方法。曾尝试使用特质对象、Any和枚举,但都不太成功

  • 由于基因型的其他特性和泛型,不允许基因型成为特质对象。
  • Any可以工作,但你仍然需要事先知道所有可能的基因型来进行向下转换,这与灵活的目的相违背
  • 枚举可以工作,但你仍然需要事先知道所有可能的基因型来进行封装,这与灵活的目的相违背

因此,经过一些考虑,我决定使用基于嵌套索引的基因型 MultiDiscreteGenotype<usize>,这些索引是外部任意类型向量的索引,应该在适应性函数中检索。每个外部向量只允许一种类型,因此交配/突变/竞争策略都有封装实现,将转发到底层类型(例如 CompeteTournament::new(4).into()

目前实现为排列,但通过缓存,进化策略也可以用于较大的搜索空间。

文档

请参阅docs.rs

示例

使用cargo run --example [EXAMPLE_BASENAME] --release运行

快速使用

use genetic_algorithm::fitness::placeholders::CountTrue;
use genetic_algorithm::strategy::evolve::prelude::*;
use genetic_algorithm_meta::prelude::*;

let rounds = 10;
let target_population_sizes = vec![2, 4, 8];
let max_stale_generations_options = vec![Some(10)];
let max_chromosome_age_options = vec![Some(10)];
let target_fitness_score_options = vec![Some(0)];
let mutates = vec![
    MutateOnce::new(0.05).into(),
    MutateOnce::new(0.2).into(),
    MutateOnce::new(0.4).into(),
];
let crossovers = vec![
    CrossoverClone::new(true).into(),
    CrossoverSingleGene::new(false).into(),
    CrossoverSingleGene::new(true).into(),
    CrossoverSinglePoint::new(true).into(),
    CrossoverUniform::new(true).into(),
];
let competes = vec![
    CompeteElite::new().into(),
    CompeteTournament::new(3).into(),
    CompeteTournament::new(4).into(),
];
let extensions = vec![
    ExtensionNoop::new().into(),
    ExtensionMassExtinction::new(0.9, 0.1).into(),
    ExtensionMassGenesis::new(0.9).into(),
    ExtensionMassInvasion::new(0.9, 0.1).into(),
    ExtensionMassDegeneration::new(0.9, 10).into(),
];

let genotype = BinaryGenotype::builder()
    .with_genes_size(10)
    .build()
    .unwrap();
let fitness = CountTrue;
let evolve_builder = EvolveBuilder::new()
    .with_genotype(genotype)
    .with_fitness(fitness)
    .with_fitness_ordering(FitnessOrdering::Minimize);
let evolve_fitness_to_micro_second_factor = 1_000_000;

let config = MetaConfig::builder()
    .with_evolve_builder(evolve_builder)
    .with_evolve_fitness_to_micro_second_factor(evolve_fitness_to_micro_second_factor)
    .with_rounds(rounds)
    .with_target_population_sizes(target_population_sizes)
    .with_max_stale_generations_options(max_stale_generations_options)
    .with_max_chromosome_age_options(max_chromosome_age_options)
    .with_target_fitness_score_options(target_fitness_score_options)
    .with_mutates(mutates)
    .with_crossovers(crossovers)
    .with_competes(competes)
    .with_extensions(extensions)
    .build()
    .unwrap();

let permutate = MetaPermutate::new(&config).call();
println!();
println!("{}", permutate);

// meta-permutate population_size: 270

// [...]

// meta-permutate:
//   best_target_population_size: 2
//   best_max_stale_generations: Some(10)
//   best_max_chromosome_age: Some(10)
//   best_target_fitness_score: Some(0)
//   best_mutate: Some(Once(Once { mutation_probability: 0.4 }))
//   best_crossover: Some(Clone(Clone { keep_parent: true }))
//   best_compete: Some(Elite(Elite))
//   best_extension: Some(Noop(Noop))

测试

使用 cargo test 运行测试

问题

依赖项

~3MB
~60K SLoC