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
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
:此方法运行算法直到结束,并返回一个包含(Gene
,StopCriteria
)的元组,表示执行过程中的最佳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