52 个版本 (29 个稳定版)
使用旧的 Rust 2015
1.8.1 | 2021年1月21日 |
---|---|
1.8.0 | 2018年7月20日 |
1.7.14 | 2018年2月23日 |
1.7.9 | 2017年10月14日 |
0.9.1 | 2015年12月29日 |
#39 在 模拟
每月44 次下载
58KB
908 行
RsGenetic
摘要和功能
RsGenetic 是一个在 Rust 中执行遗传算法的框架。它设计成一个简单但模块化的 API。
示例和文档
文档可在这里找到。
实现 Fitness
特性
注意,如果您的适应度类型是整数类型,您不需要围绕这个整数编写包装结构体。有关更多详细信息,请参阅 types
模块的文档。
use rsgenetic::pheno::*;
use std::cmp::Ordering;
#[derive(Eq, PartialEq, PartialOrd, Ord)]
struct MyFitness {
value: i32,
}
impl Fitness for MyFitness {
// The zero value for our custom type
fn zero() -> MyFitness {
MyFitness { value: 0 }
}
// The absolute difference between two instances
fn abs_diff(&self, other: &MyFitness) -> MyFitness {
MyFitness {
value: (self.value - other.value).abs()
}
}
}
实现 Phenotype
特性
注意,我们使用整数类型作为适应度类型参数,以使此示例更加简单。如果需要,请将其替换为您自定义的类型。在此示例中,我们尝试找到具有两个整数组件且总和等于目标值的个体。
此示例有些牵强,但简化了以显示定义新个体和实现 Phenotype
特性的简便性。
use rsgenetic::pheno::*;
const TARGET: i32 = 100;
#[derive(Copy, Clone)]
struct MyPheno {
x: i32,
y: i32,
}
impl Phenotype<i32> for MyPheno {
// How fit is this individual?
fn fitness(&self) -> i32 {
TARGET - (self.x + self.y)
}
// Have two individuals create a new individual
fn crossover(&self, other: &MyPheno) -> MyPheno {
MyPheno {
x: self.x,
y: other.y,
}
}
// Mutate an individual, changing its state
fn mutate(&self) -> MyPheno {
MyPheno {
x: self.x + 1,
y: self.y - 1,
}
}
}
创建和运行 Simulator
use rsgenetic::pheno::*;
use rsgenetic::sim::*;
use rsgenetic::sim::seq::Simulator;
use rsgenetic::sim::select::*;
const TARGET: i32 = 100;
#[derive(Copy, Clone)]
struct MyPheno {
x: i32,
y: i32,
}
impl Phenotype<i32> for MyPheno {
// How fit is this individual?
fn fitness(&self) -> i32 {
TARGET - (self.x + self.y)
}
// Have two individuals create a new individual
fn crossover(&self, other: &MyPheno) -> MyPheno {
MyPheno {
x: self.x,
y: other.y,
}
}
// Mutate an individual, changing its state
fn mutate(&self) -> MyPheno {
MyPheno {
x: self.x + 1,
y: self.y - 1,
}
}
}
fn main() {
let mut population = (0..100).map(|i| MyPheno { x: i, y: 100 - i }).collect();
let mut s = Simulator::builder(&mut population)
.set_selector(Box::new(StochasticSelector::new(10)))
.set_max_iters(50)
.build();
s.run();
let result = s.get().unwrap(); // The best individual
}
请参阅存储库中的 examples
目录以获取更详细的示例。
注意
该库目前处于维护模式。有一些迹象表明,API 需要更新以更灵活,这将需要增加主版本号 (#23, #30)。不幸的是,我目前没有时间实施这种重新设计。但我将继续回答问题并合并拉取请求,但具体功能可能不会由我实现,具体取决于其规模。
许可证
根据您的选择,许可协议为
- Apache 许可证版本 2.0 (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
贡献
贡献总是受欢迎的。查看问题以查看需要完成的增强功能或需要修复的bug。如果您在使用库时遇到任何bug,请随时提出问题/修复bug,并提交pull请求。
除非您明确声明,否则您根据Apache-2.0许可证定义的,旨在包含在作品中的任何贡献,将按上述方式双重许可,不附加任何额外条款或条件。
依赖项
约2MB
约31K SLoC