From 35d186cf0548c24ad7c4ac71c4e04c2d606c0e70 Mon Sep 17 00:00:00 2001 From: Rendo Date: Sun, 9 Nov 2025 15:43:03 +0500 Subject: [PATCH] Random mutations --- src/formula.rs | 4 +++- src/learner.rs | 20 +++++++++++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/formula.rs b/src/formula.rs index c9e4833..eacd71a 100644 --- a/src/formula.rs +++ b/src/formula.rs @@ -22,11 +22,13 @@ impl Formula { } outputs } - pub fn mutate(&mut self) {} pub fn modify_tree(&mut self) -> NodeModifier { self.tree.modify_tree() } + pub fn modify_random_node(&mut self) -> NodeModifier { + self.tree.modify_node() + } pub fn display_tree(&self) { self.display_recursion(0, vec![&self.tree]); } diff --git a/src/learner.rs b/src/learner.rs index fb14647..d7d8dcc 100644 --- a/src/learner.rs +++ b/src/learner.rs @@ -1,4 +1,10 @@ use crate::formula::Formula; +use rand::random_range; + +const ACTION_ADD: u8 = 0; +const ACTION_REMOVE: u8 = 1; +const ACTION_INSERT: u8 = 2; +const ACTION_MUTATE: u8 = 3; pub struct Learner { best_algorithm: Formula, @@ -49,7 +55,19 @@ impl Learner { .0 .clone() } - fn mutate_formula_randomly(formula: &mut Formula) {} + fn mutate_formula_randomly(formula: &mut Formula) { + let mut editor = formula.modify_random_node(); + let decided_action = random_range(0..3); + if decided_action == ACTION_ADD { + editor.add_node(editor.get_random_node()); + } else if decided_action == ACTION_REMOVE { + editor.remove_node(None); + } else if decided_action == ACTION_INSERT { + editor.insert_node(editor.get_random_node(), None); + } else if decided_action == ACTION_MUTATE { + editor.mutate_node(); + } + } fn get_similarity(expected_output: &Vec, real_output: &Vec) -> Result { if expected_output.len() != real_output.len() { return Err(());