2 个版本
0.1.1 | 2024年1月18日 |
---|---|
0.1.0 | 2023年10月13日 |
#993 在 算法
88KB
2K SLoC
进化
一个用于使用瘫痪遗传算法解决问题的完全可扩展的 Rust 框架。
目前,它支持在 Binary
、Real
、Permuted Integers
、Integers 和您可能希望实现的任何其他编码中进行编码。查看内置的遗传算子实现。
您也可以编写自己的 selection
、crossover
或 mutation
,实现 traits 并将它们传递给 EvolutionBuilder
。
入门指南
首先您需要编写 Fitness 函数
use evolutionary::prelude::*;
#[derive(Clone)]
pub struct MaxFitness;
impl Fitness<Bin> for MaxFitness {
fn calculate_fitness(&self, individual: &Bin) -> f64 {
let mut sum = 0.;
for i in 0..individual.get_chromosome().len() {
if individual.get_gene(i) {
sum += 1.;
}
}
sum
}
}
然后您可以使用 EvolutionBuiler
建立一个进化对象,并设置所有必需的参数
fn main() {
let mut evolution = EvolutionBuilder::new(30, 10, GeneCod::Bin, ())
.with_fitness(MaxFitness)
.with_selection(TournamentSelection::default())
.with_crossover(NPointsCrossover::default())
.with_mutation(BitSwapMutation::default())
.with_stop_condition(move |_, iterations, _| iterations >= 1000)
.build().unwrap();
evolution.run();
println!("Best individual: {:?}", evolution.current_best());
println!("Best fitness: {}", evolution.current_best_fitness());
}
更详细的入门指南 在这里。
示例和项目
- evolutionary-examples - 一个使用 bevy 游戏引擎 实现的
evolutionary
库的视觉示例项目。
在 示例文件夹 中有一些示例
待办事项
- 个体
- 基于树的染色体
- 选择
- 排名选择
- 随机均匀抽样
- 并行化 SUS 选择
- N 个个体精英主义
- 交叉
- 实数
- 线性交叉 (LX)
- 算术交叉 (AX)
- 模拟二进制交叉 (SBX)
- 实数
- 变异
- 实数
- 高斯变异 (GM)
- 排列
- 插入变异 (IM)
- 洗牌变异 (SM)
- 实数
- 可用性和性能
- 为实现
Individual
trait 创建宏 - 允许 fitness 是一个函数,而不是必须实现的 struct
- 为实现
- 示例和基准
- 实现和优化旅行商问题
依赖关系
~6.5–9MB
~161K SLoC