2个版本
0.7.2 | 2024年7月27日 |
---|---|
0.7.1 | 2024年7月27日 |
745 在 算法
每月261 次下载
33KB
504 行
genetic-algorithm-meta
此库是从genetic_algorithm中提取出来的,因此依赖于它。版本号保持同步,以表示兼容性。
对于基因型,一个有趣的事情是创建所有交配/突变/竞争策略和其他进化参数的元基因型。这可以用来优化某些其他遗传算法的参数。是的,简单的嵌套循环也会起作用,但那有什么乐趣呢?但我没有找到创建这种异质设置的高雅方法。曾尝试使用特质对象、Any和枚举,但都不太成功
- 由于基因型的其他特性和泛型,不允许基因型成为特质对象。
- Any可以工作,但你仍然需要事先知道所有可能的基因型来进行向下转换,这与灵活的目的相违背
- 枚举可以工作,但你仍然需要事先知道所有可能的基因型来进行封装,这与灵活的目的相违背
因此,经过一些考虑,我决定使用基于嵌套索引的基因型 MultiDiscreteGenotype<usize>
,这些索引是外部任意类型向量的索引,应该在适应性函数中检索。每个外部向量只允许一种类型,因此交配/突变/竞争策略都有封装实现,将转发到底层类型(例如 CompeteTournament::new(4).into()
)
目前实现为排列,但通过缓存,进化策略也可以用于较大的搜索空间。
文档
请参阅docs.rs
示例
使用cargo run --example [EXAMPLE_BASENAME] --release
运行
- example/meta_evolve_binary
cargo run --example meta_evolve_binary --release
- example/meta_evolve_milp
cargo run --example meta_evolve_milp --release
- example/meta_evolve_monkeys
cargo run --example meta_evolve_monkeys --release
- example/meta_evolve_nqueens
cargo run --example meta_evolve_nqueens --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