1 个不稳定发布版
0.1.0 | 2020年10月1日 |
---|
#1738 在 算法
40KB
1K SLoC
rsneat
rsneat 是一个开源的crate,实现了NEAT遗传算法。这个实现基于原始的2002年论文。
这个项目的目的是帮助我学习Rust和Rust生态系统。在没有极端谨慎的情况下,可能不应该将此项目用于任何严肃的项目。
示例
此示例使用neat模拟来找到一个计算异或函数的算法
let mut neat = Neat::new();
let mut founder = Genome::new(3, 1);
founder.add_connection(0, 3, 0.0, &mut neat);
founder.add_connection(1, 3, 0.0, &mut neat);
founder.add_connection(2, 3, 0.0, &mut neat);
let mut pop = Population::clone_from(founder, &neat);
loop {
let mut correct = true;
for (mut n, fitness) in pop.iter_fitness() {
correct = true;
let data = [
(vec![0.0, 0.0, 1.0], 0.0, false),
(vec![0.0, 1.0, 1.0], 1.0, true),
(vec![1.0, 0.0, 1.0], 1.0, true),
(vec![1.0, 1.0, 1.0], 0.0, false),
];
let mut error = 0.0;
*fitness = 0.0;
for (input, output, c) in data.iter() {
for _ in 0..5 {
let _ = n.activate(input.clone().into_iter());
}
let result = n.activate(input.clone().into_iter()).next().unwrap();
let result_error = (result - output).abs();
error += result_error;
let result = result >= 0.5;
if *c != result {
correct = false;
}
n.reset();
}
*fitness += 4.0 - error;
*fitness *= *fitness;
if correct {
break;
}
}
if correct {
pop.champ().write(&mut std::fs::File::create("champ.neat").unwrap()).unwrap();
println!("Got a champ after {} gens!", pop.gen());
}
pop.evaluate_generation(&mut neat);
}
依赖项
~2MB
~35K SLoC