neat_lib 0.1.1

Rust implementation of NeuroEvolution of Augmenting Topologies
Documentation
extern crate neat_lib;

use neat_lib::*;
use neat_lib::save_load::*;

const FILE_PATH: &str = "./tmp/xor";
const MAX_ROUND: u32 = 1500;

fn evalute(config: &Config, genome: &Genome) -> f64 {
    let mut nn = FeedForwardNetwork::new(config, genome);
    let mut fitness = 0.0;
    for i in 0..2 {
        for j in 0..2 {
            let inputs = vec![i as f64, j as f64];
            let outputs = nn.evalute(inputs);
            let expected = (i ^ j) as f64;
            fitness += 1.0 - (expected - outputs[0]).abs();
        }
    }
    fitness
}

fn main() {
    let mut config = Config::new_from_path("./examples/xor_config.json");
    config.inputs = 2;
    config.outputs = 1;
    config.population = 100;
    let mut pop = Population::new(&config, "xor");
    match pop.run(evalute, EvaluteOption { epochs: 500, fitness_target: Some(3.6) }){
        Ok(genome) => {
            let saver = FileSaverLoader::new(FILE_PATH);
            let _ = saver.save(&pop);
            print!("Problem solved {:?}", genome);
        },
        Err(err) => {
            println!("Failed to solve the problem.");
            print!("err {:?}", err);
        },
    }
}