M env/Cargo.lock => env/Cargo.lock +18 -0
@@ 35,6 35,7 @@ version = "0.1.0"
dependencies = [
"nalgebra",
"rand",
+ "rand_distr",
]
[[package]]
@@ 56,6 57,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174"
[[package]]
+name = "libm"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de"
+
+[[package]]
name = "matrixmultiply"
version = "0.3.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ 138,6 145,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
dependencies = [
"autocfg",
+ "libm",
]
[[package]]
@@ 209,6 217,16 @@ dependencies = [
]
[[package]]
+name = "rand_distr"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463"
+dependencies = [
+ "num-traits",
+ "rand",
+]
+
+[[package]]
name = "rawpointer"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
M env/Cargo.toml => env/Cargo.toml +1 -0
@@ 6,3 6,4 @@ edition = "2024"
[dependencies]
nalgebra = "0.33.2"
rand = "0.9.2"
+rand_distr = "0.5.1"
M env/src/perturbation/mod.rs => env/src/perturbation/mod.rs +25 -1
@@ 1,4 1,6 @@
-use rand::Rng;
+use nalgebra::SVector;
+use rand::{distr::Distribution, Rng};
+use rand_distr::{Normal, NormalError};
use crate::binary_string::BinaryString;
@@ 30,6 32,28 @@ impl<TRng: Rng> PerturbationOperator for BinaryStringBitPerturbation<TRng> {
}
}
+pub struct RandomDistributionPerturbation<const LEN: usize, TRng: Rng, TDistribution: Distribution<f64>> {
+ distribution: TDistribution,
+ rng: TRng
+}
+
+impl<const LEN: usize> RandomDistributionPerturbation<LEN, rand::rngs::ThreadRng, Normal<f64>> {
+ pub fn normal(variance: f64) -> Result<Self, NormalError> {
+ Ok(Self {
+ distribution: Normal::new(0.0, variance)?,
+ rng: rand::rng()
+ })
+ }
+}
+
+impl<TRng: Rng, TDistribution: Distribution<f64>, const LEN: usize> PerturbationOperator for RandomDistributionPerturbation<LEN, TRng, TDistribution> {
+ type Chromosome = SVector<f64, LEN>;
+
+ fn perturb(self: &mut Self, chromosome: &Self::Chromosome) -> Self::Chromosome {
+ chromosome + Self::Chromosome::zeros().map(|_| self.distribution.sample(&mut self.rng))
+ }
+}
+
#[cfg(test)]
pub mod tests {
use crate::binary_string::BinaryString;