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 次下载

MIT/Apache

58KB
908

RsGenetic

Rust Report Card Build Status Crates Version License MIT License Apache

摘要和功能

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)。不幸的是,我目前没有时间实施这种重新设计。但我将继续回答问题并合并拉取请求,但具体功能可能不会由我实现,具体取决于其规模。

许可证

根据您的选择,许可协议为

贡献

贡献总是受欢迎的。查看问题以查看需要完成的增强功能或需要修复的bug。如果您在使用库时遇到任何bug,请随时提出问题/修复bug,并提交pull请求。

除非您明确声明,否则您根据Apache-2.0许可证定义的,旨在包含在作品中的任何贡献,将按上述方式双重许可,不附加任何额外条款或条件。

依赖项

约2MB
约31K SLoC