#genetic #framework #optimization #genetic-algorithm #search #integer #search-algorithms

evolutionary

一个用于使用瘫痪遗传算法解决问题的完全可扩展的 Rust 框架

2 个版本

0.1.1 2024年1月18日
0.1.0 2023年10月13日

#993算法

MIT 许可证

88KB
2K SLoC

进化

Crates.io Documentation

一个用于使用瘫痪遗传算法解决问题的完全可扩展的 Rust 框架。

目前,它支持在 BinaryRealPermuted IntegersIntegers 和您可能希望实现的任何其他编码中进行编码。查看内置的遗传算子实现。

您也可以编写自己的 selectioncrossovermutation,实现 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());
}

更详细的入门指南 在这里

示例和项目

示例文件夹 中有一些示例

待办事项

  • 个体
    • 基于树的染色体
  • 选择
    • 排名选择
    • 随机均匀抽样
      • 并行化 SUS 选择
    • N 个个体精英主义
  • 交叉
    • 实数
      • 线性交叉 (LX)
      • 算术交叉 (AX)
      • 模拟二进制交叉 (SBX)
  • 变异
    • 实数
      • 高斯变异 (GM)
    • 排列
      • 插入变异 (IM)
      • 洗牌变异 (SM)
  • 可用性和性能
    • 为实现 Individual trait 创建宏
    • 允许 fitness 是一个函数,而不是必须实现的 struct
  • 示例和基准
    • 实现和优化旅行商问题

依赖关系

~6.5–9MB
~161K SLoC