22 个版本 (7 个稳定版)
1.3.2 | 2023年11月22日 |
---|---|
1.1.0 | 2023年10月12日 |
0.9.2 | 2023年8月22日 |
0.8.4 | 2023年7月26日 |
0.5.1 | 2022年12月26日 |
#160 in 算法
92KB
1.5K SLoC
RUST 遗传算法库
描述
本库提供了一个使用 Rust 实现遗传算法(GA)的简单框架。
本库还支持多线程和自适应遗传算法。
目录
文档
见 docs.rs
特性
特质
本版本使用特质进行泛型实现。
这些特质位于 traits
模块中
GeneT
:这个特质必须在你自己的基因表示上实现。new()
:可选。这是一个构造函数。get_id()
:可选。这个函数必须返回基因的 ID。set_id()
:设置基因的 ID。
GenotypeT
:这个特质必须在你自己的基因型表示上实现。Gene
:这是GeneT
关联类型。new()
:可选。这是一个构造函数。new_gene()
:可选。必须返回Self::Gene
。get_dna()
: 必须返回基因数组(GeneT
)。set_dna(dna: &[Self::Gene])
: 必须设置基因数组(GeneT
)。set_gene(gene_index: usize, gene: Self::Gene)
: 可选。此方法替换指定基因_index位置的基因。calculate_fitness()
: 可选。此函数必须以f64计算个体的适应度(或基因型)。get_fitness()
: 返回之前由calculate_fitness()
计算的适应度。set_fitness(fitness: f64)
: 设置适应度值。get_age()
: 返回基因型的年龄。set_age(age: i32)
: 设置基因型的年龄。
操作符
在 operations
模块中,我们有以下操作符
- 杂交
- 循环
- 多点
- 均匀
- 变异
- 交换
- 倒置
- 洗牌
- 选择
- 随机
- 轮盘赌
- 随机均匀抽样
- 锦标赛
- 幸存者
- 基于适应度
- 基于年龄
种群
在遗传算法中,操作符应用于个体种群和一组规则(尚未实现)。在 population
模块中,Population
结构将定义种群。
运行器
由于遗传算法在多代中运行,因此在此库的 ga
模块中有一个 run
函数,该函数简化了过程。此函数需要 GaConfiguration
结构,该结构包含要使用的操作符、最大代数、问题求解器(最大化或最小化)等,以及 Population
结构,该结构位于 population
模块中。
GA 配置
在此库中,您可以通过使用配置结构 GaConfiguration
来配置遗传算法的执行方式。此结构具有以下属性
adaptive_ga
: 指定遗传算法是否是自适应的。number_of_threads
: 可选。指示将同时执行多少线程。limit_configuration
: 使用LimitConfiguration
结构配置遗传算法的限制。selection_configuration
: 使用SelectionConfiguration
结构配置选择方法。crossover_configuration
: 使用CrossoverConfiguration
结构配置交叉方法。mutation_configuration
: 使用MutationConfiguration
结构配置变异方法。survivor
: 指定要使用的幸存者操作符。log_level
: 可选。配置我们想要的日志最大级别。如果此值为空,则禁用日志。
SelectionConfiguration
:
number_of_couples
:可选。此属性仅适用于随机均匀抽样。它指定从总体中选择多少对。默认情况下,值将是总体大小的一半。method
:指定要使用哪个选择算子。
交叉配置
:
number_of_points
:可选。此属性仅适用于多点交叉,表示在交叉操作期间在DNA中创建多少个点。probability_max
:可选。指定两个父代交叉的最大概率。此数字必须在0.0和1.0之间,包括两者。在自适应遗传算法的情况下,此参数是强制性的,必须大于probability_min
。probability_min
:可选。指定两个父代交叉的最小概率。此数字必须在0.0和1.0之间,包括两者。在自适应遗传算法的情况下,此参数是强制性的,必须小于probability_max
。method
:指定要使用哪个交叉算子。
变异配置
:
-
probability_max
:可选。指定基因型变异的最大概率。此数字必须在0.0和1.0之间,包括两者。在自适应遗传算法的情况下,此参数是强制性的,必须大于probability_min
。 -
probability_min
:可选。指定基因型变异的最小概率。此数字必须在0.0和1.0之间,包括两者。在自适应遗传算法的情况下,此参数是强制性的,必须小于probability_max
。 -
method
:指定要使用哪个变异算子。
限制配置
:
problem_solving
:您可以选择最小化问题或最大化问题。max_generations
:如果结果不是最优的,此属性指示在停止之前运行的代数最大值。fitness_target
:可选。最佳个体的适应性。get_best_individual_by_generation
:可选。告诉运行者按代返回最佳个体。population_size
:要执行的种群大小。genes_per_individual
:每个个体必须拥有的基因数。needs_unique_ids
:可选。指示每个基因是否必须有唯一的编号。alleles_can_be_repeated
:指示是否可以在个体中重复相同的等位基因。
示例
使用示例可以是最小化具有单个基因id的基因型。
基因和基因型结构的创建
使用特性和use genetic_algorithms::{operations::{Selection, Crossover, Mutation, Survivor{}, population::Population, traits::{GenotypeT, ConfigurationT{}, configuration::ProblemSolving, ga{};
定义基因结构。
#[derive(Debug, Copy, Clone, Default, PartialEq)]
pub struct Gene{
pub id: i32,
}
impl GeneT for Gene{
fn get_id(&self) -> &i32{
return &self.id;
}
fn set_id(&mut self, id: i32) {
self.id = id;
}
}
定义基因型结构和适应性计算。
#[derive(Debug, Clone, Default, PartialEq)]
pub struct Genotype{
pub dna: Vec<Gene>,
pub fitness: f64,
pub age: i32,
}
impl GenotypeT for Genotype{
type Gene = Gene;
fn get_dna(&self) -> &[Self::Gene] {
&self.dna
}
fn get_fitness(&self) -> f64 {
return self.fitness;
}
fn set_fitness(&mut self, fitness: f64) {
self.fitness = fitness;
}
fn set_age(&mut self, age:i32){
self.age = age;
}
fn get_age(&self) -> i32 {
self.age
}
fn calculate_fitness(&mut self) {
self.fitness = 0.0;
let mut position = 0;
for i in &self.dna{
let fitness = f64::from(i.get_id()*position);
self.fitness += fitness;
position += 1;
}
}
fn set_dna(&mut self, dna: &[Self::Gene]){
self.dna = dna.to_vec();
}
}
定义等位基因。
let binding = vec![Gene{id:1}, Gene{id:2}, Gene{id:3}, Gene{id:4},
Gene{id:5}, Gene{id:6}, Gene{id:7}, Gene{id:8}];
let alleles = binding.as_slice();
最后,配置并运行遗传算法。
let population = ga::Ga::new()
.with_threads(8)
.with_problem_solving(ProblemSolving::Maximization)
.with_selection_method(Selection::Tournament)
.with_number_of_couples(10)
.with_crossover_method(Crossover::Cycle)
.with_mutation_method(Mutation::Swap)
.with_survivor_method(Survivor::Fitness)
.with_alleles(alleles)
.with_genes_per_individual(6)
.with_population_size(100)
.run();
其他示例
- 旅行商问题:[链接](https://en.wikipedia.org/wiki/Travelling_salesman_problem)
- 查看[链接](https://github.com/leimbernon/traveller_problem)
使用方法
请将此内容添加到您的 Cargo.toml
[dependencies]
genetic_algorithms = "1.3.2"
依赖项
~3.5–5MB
~90K SLoC