From c3806faf307e2411fe27911a918ad0a39f1f837d Mon Sep 17 00:00:00 2001 From: RexeneLee Date: Mon, 5 Jan 2026 23:27:48 +0300 Subject: [PATCH 1/7] Create RFO.py Add Red Fox Optimization (RFO) algorithm --- mealpy/swarm_based/RFO.py | 1 + 1 file changed, 1 insertion(+) create mode 100644 mealpy/swarm_based/RFO.py diff --git a/mealpy/swarm_based/RFO.py b/mealpy/swarm_based/RFO.py new file mode 100644 index 00000000..7e5f9b55 --- /dev/null +++ b/mealpy/swarm_based/RFO.py @@ -0,0 +1 @@ +Add Red Fox Optimization (RFO) algorithm From a6915edd0af5baa6293607975eac12c98457d7f1 Mon Sep 17 00:00:00 2001 From: RexeneLee Date: Mon, 5 Jan 2026 23:29:34 +0300 Subject: [PATCH 2/7] Update __init__.py Export OriginalRFO optimizer --- mealpy/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mealpy/__init__.py b/mealpy/__init__.py index b5ba005f..941f7669 100644 --- a/mealpy/__init__.py +++ b/mealpy/__init__.py @@ -128,3 +128,4 @@ def get_optimizer_by_name(name, verbose=False): for name, optimizer in cls.items(): print(f"Optimizer: {name} - {optimizer} - {optimizer()}") return cls +from .RFO import OriginalRFO From 7e520c7146458dd924b499c0c2f7b3399cf1fc87 Mon Sep 17 00:00:00 2001 From: RexeneLee Date: Mon, 5 Jan 2026 23:31:56 +0300 Subject: [PATCH 3/7] Create test_RFO.py Add tests for OriginalRFO --- mealpy/test_RFO.py | 1 + 1 file changed, 1 insertion(+) create mode 100644 mealpy/test_RFO.py diff --git a/mealpy/test_RFO.py b/mealpy/test_RFO.py new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/mealpy/test_RFO.py @@ -0,0 +1 @@ + From d26d7d376843b42c49f0738822a735b5d816b7c1 Mon Sep 17 00:00:00 2001 From: RexeneLee Date: Mon, 5 Jan 2026 23:46:23 +0300 Subject: [PATCH 4/7] Add Red Fox Optimization (RFO) algorithm From 46f8ca404517aca59ee71a2921fb279636fc26d7 Mon Sep 17 00:00:00 2001 From: RexeneLee Date: Mon, 5 Jan 2026 23:54:31 +0300 Subject: [PATCH 5/7] Add tests for OriginalRFO --- tests/swarm_based/test_RFO.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 tests/swarm_based/test_RFO.py diff --git a/tests/swarm_based/test_RFO.py b/tests/swarm_based/test_RFO.py new file mode 100644 index 00000000..73e2184c --- /dev/null +++ b/tests/swarm_based/test_RFO.py @@ -0,0 +1,21 @@ +import numpy as np +from mealpy import FloatVar +from mealpy.swarm_based import OriginalRFO + + +def objective_function(solution): + return np.sum(solution ** 2) + + +def test_OriginalRFO(): + problem = { + "obj_func": objective_function, + "bounds": FloatVar(lb=(-10.,) * 5, ub=(10.,) * 5), + "minmax": "min", + } + + model = OriginalRFO(epoch=50, pop_size=20) + result = model.solve(problem) + + assert result.solution is not None + assert result.target.fitness is not None From f32bc3e0359e140e9fea5b7358ac6cf9ba440595 Mon Sep 17 00:00:00 2001 From: RexeneLee Date: Tue, 6 Jan 2026 00:32:05 +0300 Subject: [PATCH 6/7] Add Red Fox Optimization (RFO) implementation --- mealpy/swarm_based/RFO.py | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/mealpy/swarm_based/RFO.py b/mealpy/swarm_based/RFO.py index 7e5f9b55..81481deb 100644 --- a/mealpy/swarm_based/RFO.py +++ b/mealpy/swarm_based/RFO.py @@ -1 +1,33 @@ -Add Red Fox Optimization (RFO) algorithm +import numpy as np +from mealpy.optimizer import Optimizer + + +class OriginalRFO(Optimizer): + """ + Red Fox Optimization (RFO) + Dehghani et al., Artificial Intelligence Review, 2021 + DOI: 10.1007/s10462-020-09904-6 + """ + + def __init__(self, epoch=1000, pop_size=50, **kwargs): + super().__init__(**kwargs) + self.epoch = epoch + self.pop_size = pop_size + self.set_parameters(["epoch", "pop_size"]) + self.sort_flag = False + + def evolve(self, epoch): + a = 2 * (1 - epoch / self.epoch) + pop_new = [] + + for i in range(self.pop_size): + r = np.random.uniform(-1, 1, self.problem.n_dims) + dist = np.abs(self.g_best.solution - self.pop[i].solution) + pos_new = self.g_best.solution + a * r * dist + pos_new = self.amend_solution(pos_new) + + agent = self.generate_empty_agent(pos_new) + agent.target = self.get_target(pos_new) + pop_new.append(agent) + + self.pop = self.update_target_for_population(pop_new) From f3fa6fa14e077de8de598969cdb1985009a31ce3 Mon Sep 17 00:00:00 2001 From: RexeneLee Date: Tue, 6 Jan 2026 00:35:03 +0300 Subject: [PATCH 7/7] Add basic test for RFO optimizer --- mealpy/test_RFO.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/mealpy/test_RFO.py b/mealpy/test_RFO.py index 8b137891..1ecce8a9 100644 --- a/mealpy/test_RFO.py +++ b/mealpy/test_RFO.py @@ -1 +1,21 @@ +import numpy as np +from mealpy import FloatVar +from mealpy.swarm_based.RFO import OriginalRFO + + +def sphere(x): + return np.sum(x ** 2) + + +def test_rfo_runs(): + problem = { + "obj_func": sphere, + "bounds": FloatVar(lb=(-5.,) * 5, ub=(5.,) * 5), + "minmax": "min", + } + + model = OriginalRFO(epoch=10, pop_size=10) + result = model.solve(problem) + + assert result.solution is not None