1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
extern crate rand;
mod optimizer;
pub use optimizer::{JobConfig, PSOConfig, ParamDist, SwarmConfig, SwarmConfigDistribution, PSO};
use std::f64::consts::PI;
#[test]
fn expSinFunction() {
let num_variables = 5;
let opt_config = PSOConfig::new(8, 256, 1000, true);
let opt = PSO::new(opt_config);
let job_config = JobConfig::new(
num_variables,
vec![[-2.0 * PI, 2.0 * PI]; num_variables],
vec![0.25; num_variables],
10000,
0.000000001,
);
let swarm_config = SwarmConfig::new_collaborative(0.65, 0.9, 1.7, 0.5, 1.125, 0.125, 32);
let min = opt.minimize(job_config, swarm_config, move |pt: &[f64]| -> f64 {
let mut sum = 0.0;
let mut sin_sum = 0.0;
for i in 0..num_variables {
sum += pt[i].abs();
sin_sum += pt[i].powi(2).sin();
}
sum * (-1.0 * sin_sum).exp()
});
assert!((min.0 - 0.0).abs() < 0.001, "optimizer did not converge!");
}
#[test]
fn opt_quad_test_collab() {
let num_variables = 10;
let opt_config = PSOConfig::new(8, 128, 0, true);
let opt = PSO::new(opt_config);
let job_config = JobConfig::new(
num_variables,
vec![[-10.0, 10.0]; num_variables],
vec![1.125; num_variables],
1000,
0.00000000001,
);
let swarm_config = SwarmConfig::new_collaborative(0.35, 0.8, 1.9, 0.5, 1.125, 0.125, 15);
let centers = vec![2.5; num_variables];
let coeffs = vec![5.0; num_variables];
let min = opt.minimize(job_config, swarm_config, move |pt: &[f64]| -> f64 {
let mut sum = 0.0;
for i in 0..num_variables {
sum += (pt[i] - centers[i]).powi(2) * coeffs[i];
}
sum
});
}