sefar/benchmarks/
functions.rs

1use crate::core::problem::Problem;
2//use crate::core::genome::Genome;
3
4#[derive(Debug, Clone)]
5pub struct SumAbsFunction {}
6impl Problem for SumAbsFunction {
7    #[cfg(not(feature = "parallel"))]
8    fn objectivefunction(&mut self, genome: &mut [f64]) -> f64 {
9        let fitness = genome.iter().fold(0.0f64, |sum, g| sum + g.abs());
10        fitness
11    }
12
13    #[cfg(feature = "parallel")]
14    fn objectivefunction(&self, genome: &[f64]) -> f64 {
15        let fitness = genome.iter().fold(0.0f64, |sum, g| sum + g.abs());
16        fitness
17    }
18}
19
20///
21/// Sphere benchmark function (F1).
22/// Fi(X) = Sum(|X|)
23/// where X = {x1, x2, ..... xd}, and 'd' is the problem dimension.
24///
25#[derive(Debug, Clone)]
26pub struct Sphere {}
27
28impl Problem for Sphere {
29    ///
30    /// Define the objective function. The later is called in sequential mode.
31    ///
32    #[cfg(not(feature = "parallel"))]
33    fn objectivefunction(&mut self, genome: &mut [f64]) -> f64 {
34        let fitness = genome.iter().fold(0.0f64, |sum, g| sum + g.powi(2));
35        //let fitness = genome.iter().fold(0.0f64, |sum, g| sum + g);
36        fitness
37    }
38
39    #[cfg(feature = "parallel")]
40    fn objectivefunction(&self, genome: &[f64]) -> f64 {
41        let fitness = genome.iter().fold(0.0f64, |sum, g| sum + g.powi(2));
42        fitness
43    }
44}
45
46///
47/// F2 = Sum(x_i) + Prod(x_i) = Sum(X) + Prod(X).
48/// Search space : [-100.0, 100.0];
49/// Problem dimension : 30;
50/// Optimal value = vec![0.0; 30];
51#[derive(Debug, Clone)]
52pub struct F2 {}
53impl Problem for F2 {
54    #[cfg(not(feature = "parallel"))]
55    fn objectivefunction(&mut self, genome: &mut [f64]) -> f64 {
56        let sum = genome.iter().fold(0.0f64, |sum, g| sum + g.abs());
57        let prod = genome.iter().fold(1.0f64, |prod, g| prod * f64::abs(*g));
58        sum + prod
59    }
60
61    #[cfg(feature = "parallel")]
62    fn objectivefunction(&self, genome: &[f64]) -> f64 {
63        let sum = genome.iter().fold(0.0f64, |sum, g| sum + g.abs());
64        let prod = genome.iter().fold(1.0f64, |prod, g| prod * f64::abs(*g));
65        sum + prod
66    }
67}