#遗传算法 #人工智能 #遗传 #智能 #人工 #AI

genetic_algorithms

用于解决遗传算法问题的库

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 算法

Apache-2.0

92KB
1.5K SLoC

RUST 遗传算法库

Codacy Badge Rust Unit Tests

描述

本库提供了一个使用 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