genetic_algorithm 0.27.1

A genetic algorithm implementation
Documentation
pub mod build;
pub mod inspect;

#[allow(unused_imports)]
pub use approx::relative_eq;
pub use approx::RelativeEq;
#[allow(unused_imports)]
pub use genetic_algorithm::chromosome::Chromosome;
#[allow(unused_imports)]
pub use genetic_algorithm::genotype::{BinaryGenotype, Genotype, ListGenotype, RangeGenotype};
#[allow(unused_imports)]
pub use genetic_algorithm::population::Population;
#[allow(unused_imports)]
pub use num::BigUint;
#[allow(unused_imports)]
pub use rand::rngs::SmallRng;
#[allow(unused_imports)]
pub use rand::SeedableRng;

#[allow(dead_code)]
pub fn relative_chromosome_eq<T: RelativeEq<Epsilon = T> + Clone + Copy + std::fmt::Debug>(
    a: Vec<T>,
    b: Vec<T>,
    epsilon: T,
) -> bool {
    let result = if a.len() == b.len() {
        a.iter()
            .zip(b.iter())
            .all(|(a, b)| a.relative_eq(b, epsilon, epsilon))
    } else {
        false
    };
    if result {
        true
    } else {
        println!("{:?} <> {:?}", a, b);
        false
    }
}

#[allow(dead_code)]
pub fn relative_population_eq<T: RelativeEq<Epsilon = T> + Clone + Copy + std::fmt::Debug>(
    a: Vec<Vec<T>>,
    b: Vec<Vec<T>>,
    epsilon: T,
) -> bool {
    let result = if a.len() == b.len() {
        a.iter()
            .zip(b.iter())
            .all(|(a, b)| relative_chromosome_eq(a.to_vec(), b.to_vec(), epsilon))
    } else {
        println!("{:?} <> {:?}", a, b);
        false
    };
    if result {
        true
    } else {
        println!("{:?} <> {:?}", a, b);
        false
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn chromosome_binary() {
        let chromosome: Chromosome<bool> = build::chromosome(vec![true, false, true, false]);
        println!("{:#?}", chromosome);
        assert_eq!(
            inspect::chromosome(&chromosome),
            vec![true, false, true, false]
        );
    }

    #[test]
    fn chromosome_list() {
        let chromosome: Chromosome<u8> = build::chromosome(vec![3, 4, 5, 6]);
        println!("{:#?}", chromosome);
        assert_eq!(inspect::chromosome(&chromosome), vec![3, 4, 5, 6]);
    }

    #[test]
    fn chromosome_range() {
        let chromosome: Chromosome<f32> = build::chromosome(vec![0.1, 0.2, 0.3]);
        println!("{:#?}", chromosome);
        assert_eq!(inspect::chromosome(&chromosome), vec![0.1, 0.2, 0.3]);
    }

    #[test]
    fn population_binary() {
        let population: Population<bool> = build::population(vec![
            vec![true, true, true],
            vec![true, true, false],
            vec![true, false, false],
            vec![false, false, false],
        ]);
        println!("{:#?}", population);
        assert_eq!(
            inspect::population(&population),
            vec![
                vec![true, true, true],
                vec![true, true, false],
                vec![true, false, false],
                vec![false, false, false],
            ]
        );
    }
}