@@ 278,15 278,31 @@ trait TerminatingCondition<T>
}
struct EqualTerminatingCondition {
- target: BinaryString
+ target: BinaryString,
+ remember_match: bool,
+ matched: bool,
}
impl EqualTerminatingCondition {
pub fn new(target: BinaryString) -> Self {
Self {
- target
+ target,
+ remember_match: false,
+ matched: false,
}
}
+
+ pub fn new_remembered(target: BinaryString) -> Self {
+ Self {
+ target,
+ remember_match: true,
+ matched: false,
+ }
+ }
+
+ pub fn reset_match(self: &mut Self) {
+ self.matched = false;
+ }
}
impl<T: Clone> TerminatingCondition<T> for EqualTerminatingCondition {
@@ 296,7 312,13 @@ impl<T: Clone> TerminatingCondition<T> for EqualTerminatingCondition {
_: &Vec<LocalSearchCandidate<T>>,
_: usize
) -> bool {
- candidate.pos == self.target
+ let matched = candidate.pos == self.target;
+
+ if matched && self.remember_match {
+ self.matched = true;
+ }
+
+ matched || self.matched
}
}
@@ 455,7 477,7 @@ fn test_local_search_one_max() {
&mut
AndTerminatingConditions::new(
vec![
- &mut EqualTerminatingCondition::new(optimum.clone()),
+ &mut EqualTerminatingCondition::new_remembered(optimum.clone()),
&mut NoBetterForCyclesTerminatingCondition::new(100)
]
),
@@ 491,7 513,7 @@ fn test_local_search_sphere() {
&mut
AndTerminatingConditions::new(
vec![
- &mut EqualTerminatingCondition::new(optimum.clone()),
+ &mut EqualTerminatingCondition::new_remembered(optimum.clone()),
&mut NoBetterForCyclesTerminatingCondition::new(100)
]
),