From 6cbba58e63cb72318cdefd12fa45c93d1edbbd36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20Kaan=20G=C3=9CM=C3=9C=C5=9E?= <96421894+Tahinli@users.noreply.github.com> Date: Wed, 20 Nov 2024 00:20:40 +0300 Subject: [PATCH] fix: :bug: non-sticking to bounds --- artificial_bee_colony/src/bee.rs | 37 ++++++++++++++++++++++++++----- artificial_bee_colony/src/main.rs | 10 ++++++++- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/artificial_bee_colony/src/bee.rs b/artificial_bee_colony/src/bee.rs index 7aae79c..8cd2241 100644 --- a/artificial_bee_colony/src/bee.rs +++ b/artificial_bee_colony/src/bee.rs @@ -8,6 +8,8 @@ impl Bee { food_sources: &mut [FoodSource], index: usize, decision_variable_count: usize, + upper_bound: f64, + lower_bound: f64, ) { let mut different_food_source_index = rand::thread_rng().gen_range(0..food_sources.len()); while different_food_source_index == index { @@ -16,11 +18,17 @@ impl Bee { let selected_coordinate_index = rand::thread_rng().gen_range(0..decision_variable_count); let randomness = rand::thread_rng().gen_range(-1.0..=1.0); - let candidate_one_index = food_sources[index].coordinates[selected_coordinate_index] + let mut candidate_one_index = food_sources[index].coordinates[selected_coordinate_index] + randomness * (food_sources[index].coordinates[selected_coordinate_index] - food_sources[different_food_source_index].coordinates [selected_coordinate_index]); + if candidate_one_index > upper_bound { + candidate_one_index = upper_bound; + } + if candidate_one_index < lower_bound { + candidate_one_index = lower_bound; + } let mut candidate_coordinates = food_sources[index].coordinates.clone(); candidate_coordinates[selected_coordinate_index] = candidate_one_index; let candidate = FoodSource::get(candidate_coordinates); @@ -36,10 +44,18 @@ impl Bee { index: usize, total_fitness: f64, decision_variable_count: usize, + upper_bound: f64, + lower_bound: f64, ) { let fitness_for_index = food_sources[index].fitness; if fitness_for_index / total_fitness <= rand::thread_rng().gen_range(0.0..=1.0) { - Self::worker_bee(food_sources, index, decision_variable_count); + Self::worker_bee( + food_sources, + index, + decision_variable_count, + upper_bound, + lower_bound, + ); } } @@ -54,9 +70,20 @@ impl Bee { if food_sources[most_tried_index].try_counter > limit { let mut coordinates_for_new = vec![]; for _ in 0..decision_variable_count { - let random = lower_bound - + rand::thread_rng().gen_range(0.0..=1.0) * (upper_bound - lower_bound); - coordinates_for_new.push(random); + let random = if upper_bound * lower_bound > 0.0 { + lower_bound + + rand::thread_rng().gen_range(0.0..=1.0) * (upper_bound - lower_bound) + } else { + lower_bound + + rand::thread_rng().gen_range(0.0..=1.0) * (upper_bound + lower_bound) + }; + if random > upper_bound { + coordinates_for_new.push(upper_bound); + } else if random < lower_bound { + coordinates_for_new.push(lower_bound); + } else { + coordinates_for_new.push(random); + } } let new_food_source = FoodSource::get(coordinates_for_new); food_sources[most_tried_index] = new_food_source; diff --git a/artificial_bee_colony/src/main.rs b/artificial_bee_colony/src/main.rs index 1d693aa..87191df 100644 --- a/artificial_bee_colony/src/main.rs +++ b/artificial_bee_colony/src/main.rs @@ -19,7 +19,13 @@ fn main() { } for _ in 0..input.iteration { for index in 0..input.food_source_number as usize { - Bee::worker_bee(&mut food_sources, index, input.decision_variable_count); + Bee::worker_bee( + &mut food_sources, + index, + input.decision_variable_count, + input.upper_bound, + input.lower_bound, + ); let mut total_fitness = 0.0; for food_source in &food_sources { total_fitness += food_source.fitness; @@ -29,6 +35,8 @@ fn main() { index, total_fitness, input.decision_variable_count, + input.upper_bound, + input.lower_bound, ); let mut most_tried_index = 0; for i in 0..food_sources.len() {