1个不稳定版本
0.1.0 | 2022年1月10日 |
---|
#1841 in 算法
38KB
713 行
gworld
Rust的遗传算法库
使用说明
-
world.rs 定义了主要对象/特性。
-
World
包含1个环境和许多生物,您将通过Environs
和Creature
特性来定义它们。 -
在设置配置时,一个“函数性”染色体被定义为描述从输入到输出的完整路径的基因集合。它目前与突变率相关联,将
use_chromo
设置为true
将降低突变率。 -
从
act
返回的适应度值将影响繁殖的概率,相对于所有其他适应度值。例如,如果一个适应度值是另一个的两倍,则繁殖的概率将是两倍。
示例用法
对于进化解决方案的示例:见 examples/migrate.rs
这是一个更简单的示例。它做不了多少事,但它可以编译并运行。
use gworld::{math, World, Config, Environs, Creature};
fn main() {
Config::set( Config {
inputs: ["X", "Y"].iter().map(|&s| s.into()).collect(),
outputs: ["MOVX", "MOVY"].iter().map(|&s| s.into()).collect(),
neurons: 3,
strength_mult: 4.0, // multiplier for gene strengths
population: 50,
lifespan: 100,
genome_size: 6, // number of chromosomes
use_chromo: true, // multiple genes per functional chromosome?
independent: false, // do the creatures (not) interact with each other?
verbose: "none".to_string(), // options: silent/low/high
});
let mut world :World<MyEnv, Blob> = World::new();
world.live(); // will advance the world #lifespan steps
world.advance( 1000 ); // will advance the world 1000 steps
// world.environs to access MyEnv structure
// world.organisms[i].creature to access Blob creatures
}
struct MyEnv {}
impl Environs for MyEnv {
type Creature = Blob;
fn new() -> Self { Self{} }
}
struct Blob {
x: f32,
y: f32,
}
impl Creature for Blob {
type Env = MyEnv;
type CCT = Self;
fn new( _env: &mut Self::Env, _parents: Vec<&Self::CCT> ) -> Self {
Self { // may want to generate x, y from env data, or inherit things from parents
x: 10.,
y: 10.,
}
}
// your actions can change the world.environs!
fn act( &mut self, _env: &mut Self::Env ) -> f32 {
return 0. // return a fitness value
}
// calculate an input for the network, match for each node in Config.inputs
fn rx_input( &self, input: &str, _env: &Self::Env ) -> f32 {
match input {
"X" => self.x,
"Y" => self.y,
_ => {
println!("rx_input: no match found for: {}", input );
return 0.
},
}
}
// get output from the network, match for each node in Config.outputs
fn tx_output( &mut self, output: &str, value: f32, _env: &Self::Env ) {
match output { // you may wish to refer to env in your logic
"MOVX" => self.x = math::tanh( value ),
"MOVY" => self.y = math::tanh( value ),
_ => println!("tx_output: no match found for: {}", output ),
}
}
}
未来工作
改进设置处理。
修复灭绝问题。目前如果设置 population 很低,以及包括随机生成器的不幸在内的其他因素,可能会发生灭绝。你已经收到警告了。
更好的突变和繁殖控制。
多适应度功能。根据多个适应度函数选择繁殖。此外,我还想尝试将每个适应度函数负责的染色体相关联,并增强繁殖。
多父母(二倍体、三倍体、n倍体)配对策略。
至少再提供一个示例。稍微复杂一些。也许将其迁移到4个独立的角落。
更友好的GUI。可能将gworld作为服务运行。目前它是自定义的。祝你好运。
要做的事情太多,但时间太少。我将继续将其用于个人项目,并在需要时添加。
如果你正在使用这个库,并且有功能请求或想贡献,请在讨论部分告诉我。
关于gworld的更多信息
目标是让库在设置遗传算法时自动处理所有样板工作。
我目前用它创建了一个绘画算法,并计划重现一个模仿此视频中工作的示例:[我编程了一些生物。它们进化了。](https://www.youtube.com/watch?v=N3tRFayqVtk&t=1392s "I programmed some creatures. They Evolved.")
在创建代码时,我也有这样的想法。我不能确定gwould是否可以用来创建这样的东西,但我认为它可以接近,并且希望最终会发展到具备这种能力。[如何创建一个进化的神经网络生态系统](https://www.youtube.com/watch?v=myJ7YOZGkv0 "How I created an evolving neural network ecosystem")
整个想法是act
方法会改变环境。那可能是你的生物行为的核心所在。
依赖项
~315KB