#genetic-algorithm #genetic #evolutionary #evolution #simulation #reduce-boilerplate #ga

gworld

一个用于进化遗传算法(适合初学者到高级用户)并减少样板设置的库

1个不稳定版本

0.1.0 2022年1月10日

#1841 in 算法

Apache-2.0

38KB
713

gworld

Rust的遗传算法库

使用说明

  • world.rs 定义了主要对象/特性。

  • World 包含1个环境和许多生物,您将通过 EnvironsCreature 特性来定义它们。

  • 在设置配置时,一个“函数性”染色体被定义为描述从输入到输出的完整路径的基因集合。它目前与突变率相关联,将 use_chromo 设置为 true 将降低突变率。

  • act 返回的适应度值将影响繁殖的概率,相对于所有其他适应度值。例如,如果一个适应度值是另一个的两倍,则繁殖的概率将是两倍。

示例用法

对于进化解决方案的示例:见 examples/migrate.rs

这是一个更简单的示例。它做不了多少事,但它可以编译并运行。

examples/blobs.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