11 个不稳定版本 (3 个破坏性更新)
0.4.0 | 2021年11月2日 |
---|---|
0.3.4 | 2021年11月2日 |
0.3.3 | 2021年10月29日 |
0.3.0 | 2021年9月3日 |
0.1.0 | 2021年8月31日 |
#1493 in 算法
每月下载量 30
48KB
669 行
genx
genx 提供模块化构建块,用于使用 遗传算法 (GA) 运行优化和搜索问题的模拟。
genx 的愿景是成为一个 灵活 且高度 可扩展 的库,用于实现遗传算法应用。genx 使用 Rust 编写。该库的 API 使用函数式编程范式,并仅以这种方式公开其 API。
实现分为 构建块,它们都由特质表示。该软件包提供了所有构建块最常见和可能的所有可能的实现。因此,它可以用于许多问题。
基本示例
选择
以下是一个简单示例,它使用 随机均匀抽样 返回选定的个体。
use genx::selection::stochastic_universal::stochastic_universal_selection;
let num_parents:usize = 10;
let fitness_values = vec![2.4,8.4,3.2,9.4,9.0,11.0,4.5,0.6,4.4,2.3,5.6,10.0,0.2,9.0,4.8,7.7];
let result = stochastic_universal_selection(&fitness_values, num_parents, None)
.iter()
.map(|&a| fitness_values[a])
.collect::<Vec<f32>>();
stochastic_universal_selection
接收 fitness_value
向量、需要选择的父代数量和一个种子值(Option<u64>
)。它返回选定的个体的索引,我们将它们映射到实际的适应度值。
变异
变异函数接收一个单个个体、分布索引,并使用 多项式变异 返回变异后的个体(实值个体)。
use genx::mutation::polynomial::polynomial_mutation;
let individual = 29.11;
let result = polynomial_mutation(individual, 4.2, 4.0, None);
返回的值可能相等或不相等,因为它基于随机生成的值进行变异,对于确定性的结果可以进行种值。
构建块
遗传算法需要一个种群来进化,每个迭代都会更新这个种群。一个种群包含多个个体。每个个体代表优化问题的可能候选解决方案,其中最佳解决方案是搜索的目标。
遗传算法通过以下操作进行
- 编码:二进制、实值、顺序、树等。
- 选择:在适应度评估后选择个体。
- 交叉:从选定的个体池中创建新的个体。
- 变异:对生成的个体进行重大改变以实现多样性。
- 收敛:测试目标实现或收敛。
目前可用的构建块(定义为特征)包括
- 选择
- 变异
此库为每个操作符提供了多个实现。因此,可以尝试组合不同的实现,以组成针对特定搜索或优化问题的最佳算法。
用法
将此添加到您的 Cargo.toml
[dependencies]
genx = "0.4.0"
如果您不使用 Rust 2018 版本,请将其添加到您的包根目录
extern crate genx;
为什么选择遗传算法
遗传算法是软计算的核心,软计算是计算的一个分支,当问题无法用硬计算解决时,它就会出现。遗传算法有几个优点
- 算法具有适应性,可以适应动态环境的变化。
- 这种方法利用近似解来解决问题,这些问题可能无法解决,或者用当前硬件解决过于耗时。
- 对复杂计算问题提供不精确但可用的解决方案,使研究人员能够处理传统计算无法处理的一些问题。
灵感来源
我开始这个项目主要是为了在学习软计算方法作为大学课程的一部分时了解遗传算法(GA)。我发现自己在寻找简单、易于使用的模块化函数,以便了解遗传算法的每个步骤。
依赖项
~735KB
~13K SLoC