1 个不稳定版本
0.1.0 | 2022 年 4 月 9 日 |
---|
#475 在 科学
17KB
276 行
optimiGAtion
摘要
这是 Rust 进化计算工具,参与 GA。该工具注重高度的通用性,因此我们可以通过这种方式优化许多类型的多元问题。
什么是 GA?
GA(遗传算法)是进化计算中最基本的理论之一,用于在研究、设计等情况下优化多元问题。这种逻辑主要包含四个步骤以获得你想要的答案。如下所示:
- 创建基因组组
- 通过评估函数评估每个基因组的适用性
- 交叉
- 更改基因组组
通常,下一代的基因组比上一代更好,因为弱基因组会交换到新的子代基因组,而新的子代基因组是期望的强基因组。经过许多基因组的进化,组中最强的基因组就是你要知道的值。当然,评估函数会由你设置。
如何使用
如果你想使用这个工具,你应该在 cargo.toml 中的依赖项中添加 optimiGAtion,如下所示。
[dependencies]
optimiGAtion = "0.1.0"
然后,main.rs 应该是这样的。
extern crate gene;
use gene::GenomeList;
use crate::gene::ga_algorithm::Generation;
use crate::gene::ga_algorithm::System;
fn sum(genome: &Vec<f32>) -> f32{
let mut a: f32 = 0.0;
for i in 0..genome.len(){
a += genome[i];
}
a
}
fn main() {
let c1: fn(&Vec<f32>) -> f32 = |x| {(sum(x)/x.len() as f32 - 10.0).abs()};
let mut functions = Vec::new();
functions.push(c1);
let mut world = GenomeList::new(1000, 10, 0.0, 10.0, &functions); // initiating group of genome.
GenomeList::ga_loop(&mut world, 200, 3, 0.05, 0.0, 10.0); // starting GA loop.
}
GenomeList::new()
这些是这个函数的参数。
- 组中基因组的数量。
- 每个基因组的组件数量。
- 值的下限。
- 值的上限。
- 评估函数的闭包列表。
GenomeList::ga_loop()
这些是这个函数的参数。
- 由 GenomeList::new() 初始化的基因组列表
- 作为交叉父母的精英基因组的数量。
- 键决定了交叉的方式。
- 值的下限。
- 值的上限。
特别是第三个参数,键和交叉方式的对应表如下:
键 | 交叉方式 |
---|---|
-1 | 继承父母组件的平均值 |
0 | 随机单位内继承组件 |
n > 0 | n 单位内继承组件 |
结果样本
上述 main.rs 的结果将是这样的。
Note : Creating first generation...
Note : GA loop start.
Result : Genome { dna: [9.99994, 9.9998865, 9.999953, 9.9998865, 9.999953, 9.9998865, 9.99994, 9.9998865, 9.999953, 9.9998865], eval: 8.2969666e-5 }
Generations : 13953.0
所有的理论值都是 1.0,GA 可以得到准最优解。
下一个版本
- 应用任何类型的值
- 多评估函数
依赖项
~1–12MB
~93K SLoC