4 个版本

0.2.1 2022年5月18日
0.2.0 2022年4月21日
0.1.1 2022年3月4日
0.1.0 2022年2月16日

#803算法

每月 21 次下载
用于 haru_cmaes

MIT/Apache

405KB
4.5K SLoC

cmaes

Crates.io Rust

CMA-ES优化算法的Rust实现。它用于最小化或最大化目标函数的值,在处理高维、非线性、非凸、病态和/或噪声问题时表现良好。有关算法本身的详细信息,请参阅这篇论文

依赖项

cmaes 使用一些外部库,因此需要以下依赖项

  • Rust(已测试与 rustc 1.57 一起使用,早期版本可能也适用)
  • FreeType(对于 plotters 功能所需,默认启用)
  • 根据所选的 LAPACK 实现(可以通过功能启用,但默认情况下不启用),您需要该特定选择的库,这至少是
    • 构建
    • CMake
    • C 编译器
    • Fortran 编译器(GCC 的 gfortran 可以工作)

快速入门

将此添加到您的 Cargo.toml 中

[dependencies]
cmaes = "0.2"

所使用的 LAPACK 实现可以通过 Cargo 功能进行选择(请参阅 Cargo.toml)。默认情况下,使用来自 nalgebra 的纯 Rust 实现。

然后,要优化一个函数

use cmaes::DVector;

let sphere = |x: &DVector<f64>| x.iter().map(|xi| xi.powi(2)).sum();
let dim = 10;
let solution = cmaes::fmin(sphere, vec![5.0; dim], 1.0);

可以通过 CMAESOptions 类型访问更多选项,包括数据绘图(需要 plotters 功能)

use cmaes::{CMAESOptions, DVector, PlotOptions};

let sphere = |x: &DVector<f64>| x.iter().map(|xi| xi.powi(2)).sum();

let dim = 10;
let mut cmaes_state = CMAESOptions::new(vec![1.0; dim], 1.0)
    .fun_target(1e-8)
    .max_generations(20000)
    .enable_printing(200)
    .enable_plot(PlotOptions::new(0, false))
    .build(sphere)
    .unwrap();

let results = cmaes_state.run();

cmaes_state.get_plot().unwrap().save_to_file("plot.png", true).unwrap();

生成的图表将类似于以下内容

对于更复杂的问题,还提供了自动重启功能

use cmaes::restart::{RestartOptions, RestartStrategy};
use cmaes::DVector;

let sphere = |x: &DVector<f64>| x.iter().map(|xi| xi.powi(2)).sum();

let strategy = RestartStrategy::BIPOP(Default::default());
let dim = 10;
let search_range = -5.0..=5.0;
let restarter = RestartOptions::new(dim, search_range, strategy)
    .fun_target(1e-10)
    .enable_printing(true)
    .build()
    .unwrap();

let results = restarter.run(|| sphere);

有关更多信息,请参阅文档示例

测试

可以使用 cargo test --release 运行库的测试。请注意,由于算法的随机性,某些测试可能会偶尔失败,但只要没有测试持续失败,则可以认为它们已经通过。

可以使用 cargo bench 运行基准测试。

贡献

欢迎贡献!您可以通过报告库中存在的任何错误或问题、添加文档或打开拉取请求来贡献。

除非您明确声明,否则您根据Apache-2.0许可证定义的,有意提交以包含在本作品中的任何贡献,将按以下方式双许可,不附加任何额外条款或条件。

许可证

许可方式任选其一。

Apache License, Version 2.0, (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)

任选。

引用

以下内容包含有关此库实现或引用的算法的更详细信息。

Auger, Anne 和 Hansen, Nikolaus. “A Restart CMA Evolution Strategy with Increasing Population Size.” 2005 IEEE Congress on Evolutionary Computation, 第2卷,2005年,第1769-1776页,第2卷,https://doi.org/10.1109/CEC.2005.1554902.

Hansen, Nikolaus. “Benchmarking a BI-Population CMA-ES on the BBOB-2009 Function Testbed.” GECCO (Companion),2009年7月,https://doi.org/10.1145/1570256.1570333.

Auger, Anne 和 Hansen, Nikolaus. 教程 CMA-ES。2013年,https://doi.org/10.1145/2464576.2483910.

Hansen, Nikolaus,Akimoto, Youhei 和 Baudis, Petr. CMA-ES/Pycma on Github。2019年2月,https://doi.org/10.5281/zenodo.2559634.

依赖项

~6–25MB
~367K SLoC