#ga #evolutionary #genetic #optimization

bin+lib optimigation

这是用于进化计算的 Rust 工具,参与 GA

1 个不稳定版本

0.1.0 2022 年 4 月 9 日

#475科学

MIT 许可证

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()

这些是这个函数的参数。

  1. 组中基因组的数量。
  2. 每个基因组的组件数量。
  3. 值的下限。
  4. 值的上限。
  5. 评估函数的闭包列表。

GenomeList::ga_loop()

这些是这个函数的参数。

  1. 由 GenomeList::new() 初始化的基因组列表
  2. 作为交叉父母的精英基因组的数量。
  3. 键决定了交叉的方式。
  4. 值的下限。
  5. 值的上限。

特别是第三个参数,键和交叉方式的对应表如下:

交叉方式
-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