multivariate_optimization/
testfuncs.rs

1//! Test problems for optimization algorithms.
2
3use crate::optimize::SearchRange;
4
5/// Rastrigin function.
6///
7/// Typically used from `-5.12..=5.12`. Minimum is at `0.0`.
8pub fn rastrigin(args: &[f64]) -> f64 {
9    const A: f64 = 10.0;
10    const PI: f64 = std::f64::consts::PI;
11    let n = args.len() as f64;
12    A * n
13        + args
14            .iter()
15            .copied()
16            .map(|x| x * x - A * (2.0 * PI * x).cos())
17            .sum::<f64>()
18}
19
20/// Sum of Rosenbrock functions.
21///
22/// Multidimensional generalization of Rosenbrock function.
23/// If `args.len() % 2 == 1`, then the last argument is ignored.
24pub fn rosenbrock(mut args: &[f64]) -> f64 {
25    const A: f64 = 1.0;
26    const B: f64 = 100.0;
27    let mut sum: f64 = 0.0;
28    while args.len() >= 2 {
29        let x = args[0];
30        let y = args[1];
31        sum += (A - x).powi(2) + B * (y - x.powi(2)).powi(2);
32        args = &args[2..];
33    }
34    sum
35}
36
37/// Parameter where Schwefel function is zero.
38pub const SCHWEFEL_TARGET: f64 = 420.968746;
39
40/// Search range for Schwefel function.
41pub const SCHWEFEL_RANGE: SearchRange = SearchRange::Finite {
42    low: -500.0,
43    high: 500.0,
44};
45
46/// Scaled Schwefel function.
47pub fn schwefel(args: &[f64]) -> f64 {
48    let dim = args.len() as f64;
49    let sum: f64 = args.iter().copied().map(|x| x * x.abs().sqrt().sin()).sum();
50    dim - sum / 418.982887272433800
51}