3个版本 (稳定)

2.0.0 2022年5月8日
1.0.0 2022年5月5日
0.1.0 2022年5月1日

#17 in #进化

MIT 许可证

30KB
557

watchmaker

Rust中遗传算法库实现。

CircleCI

特性

  • 作为对功能和实现特性的研究而开发
  • 用Rust编程语言编写
  • API旨在最小化和完整
  • 内置交叉保护,以避免在交叉操作中第一个基因组总是用于结果基因组的开始的常见错误
  • 一些功能缺失(见路线图部分)

使用方法

    pub fn search<G>(
        mut genetic: Box<dyn Genetic<G>>,
        mut progress: Option<Progress<G>>,
        mut random: Random,
        settings: &Settings,
    ) -> Result<Success<G>, Failure>

搜索最优浮点值的示例

use watchmaker::*;

fn main() {
    let result = search(
        Box::new(ExampleGenetic::new(make_random())),
        Some(Box::new(|x| {
            println!("progress:{:?}", x);
        })),
        make_random(),
        &Settings::default(),
    );
    println!("{:?}", result);
}

#[derive(Clone, Debug, PartialEq)]
pub struct ExampleGenome(pub f64);

pub const TARGET: f64 = 100.0;

pub struct ExampleGenetic {
    random: Random,
}

impl ExampleGenetic {
    pub fn new(random: Random) -> Self {
        Self { random }
    }
}

impl Genetic<ExampleGenome> for ExampleGenetic {
    fn initialize(&mut self) -> ExampleGenome {
        ExampleGenome(self.random.gen_range(0.0..1_000.0))
    }

    fn evaluate(&mut self, genome: &ExampleGenome) -> f64 {
        (TARGET - genome.0).abs()
    }

    fn crossover(&mut self, lhs: &ExampleGenome, rhs: &ExampleGenome) -> ExampleGenome {
        ExampleGenome((lhs.0 + rhs.0) / 2.0)
    }

    fn mutate(&mut self, original: &ExampleGenome) -> ExampleGenome {
        ExampleGenome(original.0 + self.random.gen_range(-10.0..10.0))
    }
}

开发

  • 克隆仓库(见下文)
  • 运行cargo testcargo build

示例

  • 运行cargo run --example peak
  • 运行cargo run --example weasel
  • 运行cargo run --example hyperparameter_grid_search

测试

测试在一个独立的testscrate中。这种安排允许在测试、示例和benches之间重用代码,而不会影响核心crate。

路线图

注意每个主要版本的版本增量。API更改在主要版本之间不会向后兼容。

  • v3.x.x
  • 第四个发布版本;长期支持
  • 从此点开始接受贡献、错误修复。
  • 未发布;不受支持;beta质量
  • 添加超参数检测功能
  • 更新示例
  • 更新基准测试
  • 更新API文档
  • 更新README.md特性
  • 更新README.md示例
  • 添加crate级别文档
  • v2.x.x
  • 第四个发布版本;不提供支持;Beta质量
  • 将测试、基准测试、示例拆分为独立的crate和workspace
  • 添加对TournamentSelector的测试
  • 未发布;不受支持;beta质量
  • 分离出产生新几代的算法
  • 添加旅行商问题
  • 多线程
  • 改进基准测试
  • 修复与非单调最佳成本/基因组的bug
  • 未发布;不受支持;beta质量
  • 关于进度改进的更好类型
  • 在README.md和crate文档中提供更简单、更完整的代码示例
  • 链接到示例,包含描述和示例输出
  • v1.x.x
  • 第二个发布版本;不提供支持;Beta质量
  • 随机交换基因组以进行交叉,以防止偏向于单个基因组
  • 搜索设置的Builder模式
  • Rustdoc
  • 修复许可证 - 在crates.io上不显示为'标准'
  • v0.1.0
  • 第一个发布版本;不提供支持;Beta质量

替代方案

  • 遗传算法是一个非常著名的技巧:[遗传算法](https://en.wikipedia.org/wiki/Genetic_algorithm)
  • Rust Awesome有一个列表:[Rust遗传算法](https://github.com/awesome-rust-com/awesome-rust#genetic-algorithms)
  • Cargo:[遗传算法](https://crates.io/search?q=genetic%20algorithm)

贡献

目前不接受pull请求 :) 请参阅路线图。

许可证

MIT宽松许可证。请参阅LICENSE以获取完整的许可证详情。

源代码仓库

https://github.com/thomasbratt/watchmaker

依赖关系

~1.5MB
~30K SLoC