8个版本 (稳定)

1.2.1 2022年7月17日
1.2.0 2022年7月14日
1.1.1 2022年4月7日
1.0.1 2022年2月22日
0.1.1 2022年2月21日

#286机器学习

每月25 次下载

自定义许可

32KB
529 代码行

Easy_GA

Current Crates.io Version

Easy_GA是一个为Rust项目制作的遗传算法库。它为您自己的基因型定义提供完全定制,并提供一个遗传算法实现来封装遗传算法中的所有常见逻辑。

所有更改都将更新在 CHANGELOG.md

功能

  • trait Gene: 定义用于您的自定义基因型的实现。
  • trait Selection: 定义用于您的自定义选择算法。
    • Roulette: 已实现的选取算法。
    • Tournament: 带有n个成员的选取算法实现。
    • Random: 已实现的选取算法。
    • Stochastic: 已实现的选取算法。
  • GeneticAlgorithm: 封装遗传算法执行中的业务逻辑的主要类。

用法

在您的 Cargo.tml 中,您必须添加 Easy_GA 依赖项

[dependencies]
easy_ga = "*"

现在我将向您展示一个基本的 Easy_GA 示例,您可以在 main.rs 中找到

为了使用功能需要包含的文件

use easy_ga::Gene; // For defining our own gene.
use easy_ga::GeneticAlgorithm; // To create a GeneticAlgorithm.
use easy_ga::SelectionAlgorithms; // To specity a concrete SelectionAlgorithm.

自定义基因实现 easy_ga::Gene 特性的定义

#[derive(Clone, Copy)]
struct MyGene {
    // Fields.
    fitness: f64 // Recomended to avoid recalculate fitness on `get_fitness`
}

impl Gene for MyGene {
    fn init() -> Self {
        // Gene constructor.
    }

    fn calculate_fitness(&mut self) -> f64 {
        // Fitness function.
    }

    fn crossover(&self, other: &Self) -> Self {
        // Crossover implementation.
    }

    fn mutate(&mut self) {
        // Mutation implementation.
    }

    fn get_fitness(&self) -> f64 {
        // Returns the fitness
    }
}

在此时刻,我们需要为我们的 Gene 实现克隆和复制特性。我将在未来的版本中尝试避免这种情况。


初始化我们的 GeneticAlgorithm

let genetic_algorithm = GeneticAlgorithm::<MyGene>::new()
            .population_size(20)
            .iterations(50)
            .mutation_rate(0.10)
            .selection_rate(0.90)
            .selection_algorithm(Box::new(SelectionAlgorithms::Tournament(10)))
            .fitness_goal(100.0)
            .init().unwrap();

我们还有其他初始化我们的 GeneticAlgorithm 的方法,比如 GeneticAlgorithm::new_with_values,如果我们不想使用链式调用方法。


现在我们已经定义了基因型和初始化了我们的 GeneticAlgorithm,我们有两种运行它的方式

  • GeneticAlgorithm::run:此方法运行算法直到结束,并返回一个包含(GeneStopCriteria)的元组,表示执行过程中的最佳 Gene 以及停止执行的原因。
let (gene, stop_criteria) = genetic_algorithm.run();
  • 迭代运行:我们可以一代一代地运行算法,并在执行过程中进行修改。
while genetic_algorithm.is_running() {
    let new_generation: &Vec<MyGene> = genetic_algorithm.next_iteration();
}

日志记录器

日志记录器是一个非常实用的工具,可以测量和检索执行过程中的某些数据。默认情况下,日志记录器是禁用的,您可以这样启用它

use easy_ga::VerbosityLevel; // Verbosity level {DISABLED, LOW, MID, HIGH}
use easy_ga::VerbosityType; // Verbosity type {LOG, SAVE, LOG_AND_SAVE}
use easy_ga::LOG_verbosity; // Sets the verbosity level.
use easy_ga::LOG_verbosity_type; // Sets the verbosity type.

LOG_verbosity(VerbosityLevel::LOW); // VerbosityLevel::DISABLED by default
LOG_verbosity_type(VerbosityType::LOG_AND_SAVE); // VerbosityType::LOG by default
  • 详细程度

    • 禁用:日志被禁用。
    • :仅包含非常有用的信息。
    • :可能不是期望的信息,但也很有用。
    • :所有日志都可用,包括跟踪日志。
  • 详细类型

    • 日志:仅终端日志。
    • 保存:将日志保存到 target/easy_ga/logs/
    • 保存和日志:两者都。

基准测试

基准测试是在版本 1.1.0 中添加的,您可以通过下载仓库并从命令行运行 cargo bench 来运行它们。基准测试放置在 benches/ 文件夹中。


下一步

这是一个主要为我自己而做的个人项目,所以任何进一步的实现都将在我空闲时间完成,作为一个学习 Rust 的好方法。

  • 多线程
  • 为调试添加详细程度 ✅
  • 更多单元测试和系统测试
  • 添加新的默认 Selection 算法
  • CSV 和 JSON 结果导出
  • 解决一些与引用和链式调用相关的质量生活问题
  • 添加基准测试 ✅

许可证

Easy_GA 依据 Mozilla Public License 2.0 许可。

依赖

~0.5–1MB
~13K SLoC