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