From 9063396dca69debf24cd992886cdd136e837ab29 Mon Sep 17 00:00:00 2001 From: Rutherther Date: Sat, 1 Nov 2025 10:29:40 +0100 Subject: [PATCH] feat(lib): add random search --- codes/eoa_lib/src/lib.rs | 1 + codes/eoa_lib/src/random_search.rs | 68 ++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 codes/eoa_lib/src/random_search.rs diff --git a/codes/eoa_lib/src/lib.rs b/codes/eoa_lib/src/lib.rs index 26c475868f28cd46cd5722166ce978f11778b43a..0042eee494ad5c4163145c64962116ef0e1d3d7f 100644 --- a/codes/eoa_lib/src/lib.rs +++ b/codes/eoa_lib/src/lib.rs @@ -10,6 +10,7 @@ pub mod terminating; pub mod perturbation; pub mod comparison; pub mod local_search; +pub mod random_search; pub mod binary_string; pub mod evolutionary_strategy; diff --git a/codes/eoa_lib/src/random_search.rs b/codes/eoa_lib/src/random_search.rs new file mode 100644 index 0000000000000000000000000000000000000000..b0bc41aeadd6092500be0068d7460aebd73c11cc --- /dev/null +++ b/codes/eoa_lib/src/random_search.rs @@ -0,0 +1,68 @@ +use std::error::Error; + +use nalgebra::Dim; +use rand::RngCore; + +use crate::{comparison::BetterThanOperator, evolutionary_strategy::EvolutionaryStrategy, fitness::FitnessFunction, initializer::Initializer, local_search::{LocalSearchCandidate, LocalSearchResult, LocalSearchStats}, perturbation::PerturbationOperator, terminating::TerminatingCondition}; + +pub fn random_search< + D: Dim, + TInput, + TResult, + TFit, + TTerminatingCondition, + TPerturbationOperator, + TBetterThanOperator, + TEvolutionaryStrategy, + TInitializer>( + fit: &TFit, + terminating_condition: &mut TTerminatingCondition, + better_than_operator: &TBetterThanOperator, + initializer: &TInitializer, + size: D, + rng: &mut dyn RngCore +) -> Result, Box> +where + TResult: Clone, + TInput: Clone, + TFit: FitnessFunction, + TTerminatingCondition: TerminatingCondition, + TPerturbationOperator: PerturbationOperator, + TEvolutionaryStrategy: EvolutionaryStrategy, + TBetterThanOperator: BetterThanOperator, + TInitializer: Initializer +{ + let initial = initializer.initialize_single(size, rng); + let mut best_candidate = LocalSearchCandidate { + fit: fit.fit(&initial)?, + pos: initial, + cycle: 0 + }; + + let mut stats = LocalSearchStats::new(); + let mut cycle: usize = 0; + + while !terminating_condition.should_terminate(&best_candidate, &stats, cycle) { + let next = initializer.initialize_single(size, rng); + let next_fit = fit.fit(&next)?; + + // Minimize + if better_than_operator.better_than(&next_fit, &best_candidate.fit) { + best_candidate = LocalSearchCandidate { + pos: next, + fit: next_fit, + cycle + }; + + stats.append(best_candidate.clone()); + } + + cycle += 1; + } + + Ok(LocalSearchResult { + best_candidate, + stats, + cycles: cycle + }) +}