From b1a2bbaa8489931da4881507e68f74e41f79a1a9 Mon Sep 17 00:00:00 2001 From: Rutherther Date: Sun, 5 Oct 2025 14:43:14 +0200 Subject: [PATCH] refactor: extend local search to accept any inputs Instead of accepting only BinaryString, accept anything. Extend the operators to accept anything. --- env/src/local_search/mod.rs | 34 +++++++++++++-------------- env/src/terminating/mod.rs | 47 ++++++++++++++++++++----------------- 2 files changed, 42 insertions(+), 39 deletions(-) diff --git a/env/src/local_search/mod.rs b/env/src/local_search/mod.rs index b0d9d007ec87227424c30daee8f0251bdf282161..53817b1ef263922b7aa8fad3e332e26d08c87e5d 100644 --- a/env/src/local_search/mod.rs +++ b/env/src/local_search/mod.rs @@ -7,41 +7,41 @@ use crate::comparison::BetterThanOperator; // Functions #[derive(Debug, Clone, PartialEq)] -pub struct LocalSearchCandidate - where T: Clone +pub struct LocalSearchCandidate { - pub fit: T, - pub pos: BinaryString, + pub fit: TResult, + pub pos: TInput, pub cycle: usize } #[derive(Debug, Clone, PartialEq)] -pub struct LocalSearchResult - where T: Clone +pub struct LocalSearchResult + where TResult: Clone { - pub best_candidate: LocalSearchCandidate, + pub best_candidate: LocalSearchCandidate, // How many cycles there were pub cycles: usize, // statistics - pub best_candidates: Vec> + pub best_candidates: Vec> } fn local_search_first_improving< - T, TErr, TFit, TTerminatingCondition, TPerturbationOperator, TBetterThanOperator>( + TInput, TResult, TErr, TFit, TTerminatingCondition, TPerturbationOperator, TBetterThanOperator>( fit: &TFit, terminating_condition: &mut TTerminatingCondition, perturbation_operator: &mut TPerturbationOperator, better_than_operator: &TBetterThanOperator, - initial: &BinaryString -) -> Result, TErr> + initial: &TInput +) -> Result, TErr> where - T: Clone, - TFit: FitnessFunction, - TTerminatingCondition: TerminatingCondition, - TPerturbationOperator: PerturbationOperator, - TBetterThanOperator: BetterThanOperator, + TResult: Clone, + TInput: Clone, + TFit: FitnessFunction, + TTerminatingCondition: TerminatingCondition, + TPerturbationOperator: PerturbationOperator, + TBetterThanOperator: BetterThanOperator, { let mut best_candidate = LocalSearchCandidate { pos: initial.clone(), @@ -49,7 +49,7 @@ where cycle: 0 }; - let mut stats: Vec> = vec![]; + let mut stats: Vec> = vec![]; let mut cycle: usize = 0; while !terminating_condition.should_terminate(&best_candidate, &stats, cycle) { diff --git a/env/src/terminating/mod.rs b/env/src/terminating/mod.rs index c8af4a594ac925172cb65c816b2f703f810ff29f..55e2a844d0e61fbb930da39300cb85570e3565a1 100644 --- a/env/src/terminating/mod.rs +++ b/env/src/terminating/mod.rs @@ -1,24 +1,23 @@ use crate::{binary_string::BinaryString, local_search::LocalSearchCandidate}; -pub trait TerminatingCondition - where T: Clone +pub trait TerminatingCondition { fn should_terminate( self: &mut Self, - candidate: &LocalSearchCandidate, - stats: &Vec>, + candidate: &LocalSearchCandidate, + stats: &Vec>, cycle: usize ) -> bool; } -pub struct EqualTerminatingCondition { - target: BinaryString, +pub struct EqualTerminatingCondition { + target: T, remember_match: bool, matched: bool, } -impl EqualTerminatingCondition { - pub fn new(target: BinaryString) -> Self { +impl EqualTerminatingCondition { + pub fn new(target: T) -> Self { Self { target, remember_match: false, @@ -26,7 +25,7 @@ impl EqualTerminatingCondition { } } - pub fn new_remembered(target: BinaryString) -> Self { + pub fn new_remembered(target: T) -> Self { Self { target, remember_match: true, @@ -39,11 +38,15 @@ impl EqualTerminatingCondition { } } -impl TerminatingCondition for EqualTerminatingCondition { +impl TerminatingCondition for EqualTerminatingCondition +where + TInput: Clone + PartialEq, + TResult: Clone +{ fn should_terminate( self: &mut Self, - candidate: &LocalSearchCandidate, - _: &Vec>, + candidate: &LocalSearchCandidate, + _: &Vec>, _: usize ) -> bool { let matched = candidate.pos == self.target; @@ -68,23 +71,23 @@ impl NoBetterForCyclesTerminatingCondition { } } -pub struct AndTerminatingConditions<'a, T: Clone> { - terminating_conditions: Vec<&'a mut dyn TerminatingCondition> +pub struct AndTerminatingConditions<'a, TInput, TResult> { + terminating_conditions: Vec<&'a mut dyn TerminatingCondition> } -impl<'a, T: Clone> AndTerminatingConditions<'a, T> { - pub fn new(terminating_conditions: Vec<&'a mut dyn TerminatingCondition>) -> Self { +impl<'a, TInput, TResult> AndTerminatingConditions<'a, TInput, TResult> { + pub fn new(terminating_conditions: Vec<&'a mut dyn TerminatingCondition>) -> Self { Self { terminating_conditions } } } -impl<'a, T: Clone> TerminatingCondition for AndTerminatingConditions<'a, T> { +impl<'a, TInput, TResult> TerminatingCondition for AndTerminatingConditions<'a, TInput, TResult> { fn should_terminate( self: &mut Self, - candidate: &LocalSearchCandidate, - stats: &Vec>, + candidate: &LocalSearchCandidate, + stats: &Vec>, cycle: usize ) -> bool { return self.terminating_conditions.iter_mut() @@ -94,11 +97,11 @@ impl<'a, T: Clone> TerminatingCondition for AndTerminatingConditions<'a, T> { } } -impl TerminatingCondition for NoBetterForCyclesTerminatingCondition { +impl TerminatingCondition for NoBetterForCyclesTerminatingCondition { fn should_terminate ( self: &mut Self, - candidate: &LocalSearchCandidate, - _: &Vec>, + candidate: &LocalSearchCandidate, + _: &Vec>, cycle: usize ) -> bool { (cycle - candidate.cycle) > self.cycles