Repository: GheodeAI/metaheuristic-designer (language: python)

Issue:
Rename algorithm to strategy and search to algorithm
Also added correct encoding tutorial


Discussion / hints:

Fix patch:
diff --git a/README.md b/README.md
index d2bd989..6d2b0f1 100644
--- a/README.md
+++ b/README.md
@@ -75,9 +75,9 @@ nox test
 ## Implemented components
 This package comes with some already made components that can be used in any algorithm in this framework
 
-### Algorithms
+### Search strategies
 The algorithms implemented are:
-| Class name | Algorithm | Params | Other info |
+| Class name | Strategy | Params | Other info |
 |------------|-----------|--------|------------|
 |NoSearch|Do nothing||For debugging purposes||
 |RandomSearch|Random Search|||
@@ -144,47 +144,46 @@ The Operators functions available in the operator classes are:
 |"1point"|1 point crossover||Real, Int, Bin|
 |"2point"|2 point crossover||Real, Int, Bin|
 |"Multipoint"|multipoint crossover||Real, Int, Bin|
-|"WeightedAvg"|Weighted average crossover||Real, Int|
-|"BLXalpha"|BLX-alpha crossover||Real|
-|"Multicross"|multi-individual multipoint crossover||Real, Int, Bin|
-|"XOR"|Bytewise XOR with a random vector||Int|
+|"WeightedAvg"|Weighted average crossover|**F**|Real, Int|
+|"BLXalpha"|BLX-alpha crossover|**Cr**|Real|
+|"Multicross"|multi-individual multipoint crossover|**Nindiv**|Real, Int, Bin|
+|"XOR"|Bytewise XOR with a random vector|**N**|Int|
 |"XORCross"|Bytewise XOR between 2 vectors component by component||Int|
-|"sbx"|SBX crossover||Real|
-|"Perm"|Permutate vector components||Real, Int, Bin, Perm|
-|"Gauss"|Add Gaussian noise||Real, Int|
-|"Laplace"|Add noise following a Laplace distribution||Real, Int|
-|"Cauchy"|Add noise following a Cauchy distribution||Real, Int|
-|"Poisson"|Add noise following a Cauchy distribution||Int|
-|"Uniform"|Add Uniform noise||Real, Int|
-|"MutRand" or "MutNoise"|Add random noise to a number of vector components||Real, Int|
-|"MutSample"|Take a sample from a probability distribution and put it on a number of vector components||Real, Int|
-|"RandNoise"|Add random noise||Real, Int|
-|"RandSample"|Sample from a probability distribution||Real, Int|
-|"DE/Rand/1"|Sample from a probability distribution||Real, Int|
-|"DE/Best/1"|Sample from a probability distribution||Real, Int|
-|"DE/Rand/2"|Sample from a probability distribution||Real, Int|
-|"DE/Best/2"|Sample from a probability distribution||Real, Int|
-|"DE/Current-to-rand/1"|Sample from a probability distribution||Real, Int|
-|"DE/Current-to-best/1"|Sample from a probability distribution||Real, Int|
-|"DE/Current-to-pbest/1"|Sample from a probability distribution||Real, Int|
-|"PSO"|Sample from a probability distribution||Real, Int|
-|"Firefly"|Sample from a probability distribution||Real, Int|
+|"sbx"|SBX crossover|**Cr**|Real|
+|"Perm"|Permutate vector components|**N**|Real, Int, Bin, Perm|
+|"Gauss"|Add Gaussian noise|**F**|Real, Int|
+|"Laplace"|Add noise following a Laplace distribution|**F**|Real, Int|
+|"Cauchy"|Add noise following a Cauchy distribution|**F**|Real, Int|
+|"Poisson"|Add noise following a Cauchy distribution|**F**|Int|
+|"Uniform"|Add Uniform noise|**Low**, **Up**|Real, Int|
+|"MutRand" or "MutNoise"|Add random noise to a number of vector components|**method**, **N**, optionaly: **Low**, **Up**, **F**|Real, Int|
+|"MutSample"|Take a sample from a probability distribution and put it on a number of vector components|**method**, **N**, optionaly: **Low**, **Up**, **F**|Real, Int|
+|"RandNoise"|Add random noise|**method**, optionaly: **Low**, **Up**, **F**|Real, Int|
+|"RandSample"|Sample from a probability distribution|**method**, optionaly: **Low**, **Up**, **F**|Real, Int|
+|"DE/Rand/1"|Sample from a probability distribution|**F**, **Cr**|Real, Int|
+|"DE/Best/1"|Sample from a probability distribution|**F**, **Cr**|Real, Int|
+|"DE/Rand/2"|Sample from a probability distribution|**F**, **Cr**|Real, Int|
+|"DE/Best/2"|Sample from a probability distribution|**F**, **Cr**|Real, Int|
+|"DE/Current-to-rand/1"|Sample from a probability distribution|**F**, **Cr**|Real, Int|
+|"DE/Current-to-best/1"|Sample from a probability distribution|**F**, **Cr**|Real, Int|
+|"DE/Current-to-pbest/1"|Sample from a probability distribution|**F**, **Cr**, **p**|Real, Int|
+|"PSO"|Sample from a probability distribution|**w**, **c1**, **c2**|Real, Int|
+|"Firefly"|Sample from a probability distribution|**a**,**b**,**c**,**g**|Real, Int|
 |"Random"|Sample from a probability distribution||Real, Int, Bin, Perm|
-|"RandomMask"|||Real, Int||
-|"Swap"|||Perm||
-|"Insert"|||Perm||
-|"Scramble"|||Perm||
-|"Perm"|||Real, Int, Bin, Perm||
-|"Invert"|||Perm||
-|"Roll"|||Perm||
-|"PMX"|||Perm||
-|"OrderCross"|||Perm||
-|"branch"|||Operators|
-|"sequence"|||Operators|
-|"split"|||Operators|
-|"pick"|||Operators|
+|"RandomMask"|Randomly sample a number of vector components|**N**|Real, Int||
+|"Swap"|Swap two components||Perm||
+|"Insert"|Insert a component and shift to the left||Perm||
+|"Scramble"|Scramble permutation order|**N**|Perm||
+|"Invert"|Reverse order of components||Perm||
+|"Roll"|Roll components to the right|**N**|Perm||
+|"PMX"|Partially mapped crossover||Perm||
+|"OrderCross"|Ordered crossover||Perm||
+|"branch"|Choose one of the provided operators randomly||Operators|
+|"sequence"|Apply all the provided operators in order||Operators|
+|"split"|Apply each operator to a subset of vector components following the mask provided||Operators|
+|"pick"|Manually pick one of the operators provided (setting the ```chosen_idx``` attribute)||Operators|
 |"Dummy"|Assing the vector to a predefined value||All|
-|"Custom"|||All|
+|"Custom"|Provide a lambda function to apply as an operator|**function**|All|
 |"Nothing"|Do nothing||All|
 
 ### Initializers
@@ -219,32 +218,31 @@ Some of the implemented Encodings are:
 
 ### Benchmark functions
 The benchmark functions you can use to test the algorithms are:
-| Class name | Function | Domain | Other info |
-|------------|----------|--------|------------|
-|MaxOnes|||
-|DiophantineEq|||
-|MaxOnesReal|||
-|Sphere|||
-|HighCondElliptic|||
-|BentCigar|||
-|Discus|||
-|Rosenbrock|||
-|Ackley|||
-|Weistrass|||
-|Griewank|||
-|Rastrigin|||
-|ModSchwefel|||
-|Katsuura|||
-|HappyCat|||
-|HGBat|||
-|SumPowell|||
-|N4XinSheYang|||
-|ThreeSAT|||
-|BinKnapsack|||
-|MaxClique|||
-|MaxOnes|||
-|TSP|||
-|ImgApprox|||
-|ImgStd|||
-|ImgEntropy|||
+| Class name | Domain | Other info |
+|------------|--------|------------|
+|MaxOnes||Integer||
+|DiophantineEq||Integer||
+|MaxOnesReal||Real||
+|Sphere||Real||
+|HighCondElliptic||Real||
+|BentCigar||Real||
+|Discus||Real||
+|Rosenbrock||Real||
+|Ackley||Real||
+|Weistrass||Real||
+|Griewank||Real||
+|Rastrigin||Real||
+|ModSchwefel||Real||
+|Katsuura||Real||
+|HappyCat||Real||
+|HGBat||Real||
+|SumPowell||Real||
+|N4XinSheYang||Real||
+|ThreeSAT||Real||
+|BinKnapsack||Binary||
+|MaxClique||Permutation||
+|TSP||Permutation||
+|ImgApprox||Integer||
+|ImgStd||Integer||
+|ImgEntropy||Integer||
 
diff --git a/docs/index.rst b/docs/index.rst
index d99c984..4ccc91a 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -82,11 +82,11 @@ To perturb individuals we use operators are instances of the class :class:`Opera
 and returns a perturbed individual. This could represent a crossing operation, a mutation, generating a completely random individual or
 even a sequence of operators.
 
-We define an algorithm as the way of combining of the previous elements and specifies how each iteration or step is carried out and
-is implemented as as instance of the class :class:`Algorithm <metaheuristic_designer.Algorithm>`.
+We define a search strategy as the way of combining of the previous elements and specifies how each iteration or step is carried out and
+is implemented as as instance of the class :class:`SearchStrategy <metaheuristic_designer.SearchStrategy>`.
 
 The proper optimization is carried repeating steps until a stopping condition is reached, this is implemented as an instance of the class 
-:class:`Search <metaheuristic_designer.Search>` which also provides some information about the progress of the algorithm and is the interface that is
+:class:`Algorithm <metaheuristic_designer.Algorithm>` which also provides some information about the progress of the algorithm and is the interface that is
 used for the optimization.
 
 All of these components have working implementations in their respective subpackages except for individuals, which are already implemented since
diff --git a/docs/metaheuristic_designer.algorithms.rst b/docs/metaheuristic_designer.algorithms.rst
index c5ae3b5..8404a6a 100644
--- a/docs/metaheuristic_designer.algorithms.rst
+++ b/docs/metaheuristic_designer.algorithms.rst
@@ -1,52 +1,18 @@
 metaheuristic_designer.algorithms package
-=========================================
+============================================
 
-HillClimb
----------
+General Algorithm
+---------------------------------------------
 
-.. autoclass:: metaheuristic_designer.algorithms.HillClimb
+.. autoclass:: metaheuristic_designer.algorithms.GeneralAlgorithm
    :members:
    :undoc-members:
    :show-inheritance:
 
-LocalSearch
------------
+Memetic Algorithm
+---------------------------------------------
 
-.. autoclass:: metaheuristic_designer.algorithms.LocalSearch
+.. autoclass:: metaheuristic_designer.algorithms.MemeticAlgorithm
    :members:
    :undoc-members:
    :show-inheritance:
-
-StaticPopulation
-----------------
-
-.. autoclass:: metaheuristic_designer.algorithms.StaticPopulation
-   :members:
-   :undoc-members:
-   :show-inheritance:
-
-VariablePopulation
-------------------
-
-.. autoclass:: metaheuristic_designer.algorithms.VariablePopulation
-   :members:
-   :undoc-members:
-   :show-inheritance:
-
-NoSearch
---------
-
-.. autoclass:: metaheuristic_designer.algorithms.NoSearch
-   :members:
-   :undoc-members:
-   :show-inheritance:
-
-Subpackages
------------
-
-.. toctree::
-   :maxdepth: 2
-
-   metaheuristic_designer.algorithms.CRO
-   metaheuristic_designer.algorithms.Classic
-   metaheuristic_designer.algorithms.VNS
\ No newline at end of file
diff --git a/docs/metaheuristic_designer.initializers.rst b/docs/metaheuristic_designer.initializers.rst
index 85559bb..bc6d96b 100644
--- a/docs/metaheuristic_designer.initializers.rst
+++ b/docs/metaheuristic_designer.initializers.rst
@@ -17,14 +17,6 @@ GaussianInitializer
    :undoc-members:
    :show-inheritance:
 
-LambdaInitializer
-------------------------------------------------
-
-.. automodule:: metaheuristic_designer.initializers.LambdaInitializer
-   :members:
-   :undoc-members:
-   :show-inheritance:
-
 SeedInitializer
 ----------------------------------------------
 
diff --git a/docs/metaheuristic_designer.rst b/docs/metaheuristic_designer.rst
index 9441802..34afbbc 100644
--- a/docs/metaheuristic_designer.rst
+++ b/docs/metaheuristic_designer.rst
@@ -11,8 +11,8 @@ These subpackages provide implementations of the interfaces needed to define an
 
    metaheuristic_designer.simple
    metaheuristic_designer.benchmarks
-   metaheuristic_designer.searchMethods
    metaheuristic_designer.algorithms
+   metaheuristic_designer.strategies
    metaheuristic_designer.operators
    metaheuristic_designer.selectionMethods
    metaheuristic_designer.initializers
@@ -35,18 +35,18 @@ metaheuristic_designer.Individual module
    :undoc-members:
    :show-inheritance:
 
-metaheuristic_designer.Search module
-------------------------------------
+metaheuristic_designer.Algorithm module
+---------------------------------------
 
-.. autoclass:: metaheuristic_designer.Search
+.. autoclass:: metaheuristic_designer.Algorithm
    :members:
    :undoc-members:
    :show-inheritance:
 
-metaheuristic_designer.Algorithm module
----------------------------------------
+metaheuristic_designer.SearchStrategy module
+--------------------------------------------
 
-.. autoclass:: metaheuristic_designer.Algorithm
+.. autoclass:: metaheuristic_designer.SearchStrategy
    :members:
    :undoc-members:
    :show-inheritance:
diff --git a/docs/metaheuristic_designer.searchMethods.rst b/docs/metaheuristic_designer.searchMethods.rst
deleted file mode 100644
index 215f238..0000000
--- a/docs/metaheuristic_designer.searchMethods.rst
+++ /dev/null
@@ -1,18 +0,0 @@
-metaheuristic_designer.searchMethods package
-============================================
-
-General Search
----------------------------------------------
-
-.. autoclass:: metaheuristic_designer.searchMethods.GeneralSearch
-   :members:
-   :undoc-members:
-   :show-inheritance:
-
-Memetic Search
----------------------------------------------
-
-.. autoclass:: metaheuristic_designer.searchMethods.MemeticSearch
-   :members:
-   :undoc-members:
-   :show-inheritance:
diff --git a/docs/metaheuristic_designer.algorithms.CRO.rst b/docs/metaheuristic_designer.strategies.CRO.rst
similarity index 55%
rename from docs/metaheuristic_designer.algorithms.CRO.rst
rename to docs/metaheuristic_designer.strategies.CRO.rst
index 4158201..78c963e 100644
--- a/docs/metaheuristic_designer.algorithms.CRO.rst
+++ b/docs/metaheuristic_designer.strategies.CRO.rst
@@ -1,10 +1,10 @@
-metaheuristic_designer.algorithms.CRO package
-=================================
+metaheuristic_designer.strategies.CRO package
+===============================================
 
 CRO
 ------------------------------------
 
-.. autoclass:: metaheuristic_designer.algorithms.CRO.CRO
+.. autoclass:: metaheuristic_designer.strategies.CRO.CRO
    :members:
    :undoc-members:
    :show-inheritance:
@@ -12,7 +12,7 @@ CRO
 CRO\_SL
 ----------------------------------------
 
-.. autoclass:: metaheuristic_designer.algorithms.CRO.CRO_SL
+.. autoclass:: metaheuristic_designer.strategies.CRO.CRO_SL
    :members:
    :undoc-members:
    :show-inheritance:
@@ -20,7 +20,7 @@ CRO\_SL
 PCRO\_SL
 -----------------------------------------
 
-.. autoclass:: metaheuristic_designer.algorithms.CRO.PCRO_SL
+.. autoclass:: metaheuristic_designer.strategies.CRO.PCRO_SL
    :members:
    :undoc-members:
    :show-inheritance:
@@ -28,7 +28,7 @@ PCRO\_SL
 DPCRO\_SL
 ------------------------------------------
 
-.. autoclass:: metaheuristic_designer.algorithms.CRO.DPCRO_SL
+.. autoclass:: metaheuristic_designer.strategies.CRO.DPCRO_SL
    :members:
    :undoc-members:
    :show-inheritance:
\ No newline at end of file
diff --git a/docs/metaheuristic_designer.algorithms.Classic.rst b/docs/metaheuristic_designer.strategies.Classic.rst
similarity index 57%
rename from docs/metaheuristic_designer.algorithms.Classic.rst
rename to docs/metaheuristic_designer.strategies.Classic.rst
index a6f4a0f..93cb6b1 100644
--- a/docs/metaheuristic_designer.algorithms.Classic.rst
+++ b/docs/metaheuristic_designer.strategies.Classic.rst
@@ -1,10 +1,10 @@
-metaheuristic_designer.algorithms.Classic package
-=====================================
+metaheuristic_designer.strategies.Classic package
+=================================================
 
 ES
 ---------------------------------------
 
-.. autoclass:: metaheuristic_designer.algorithms.Classic.ES
+.. autoclass:: metaheuristic_designer.strategies.Classic.ES
    :members:
    :undoc-members:
    :show-inheritance:
@@ -12,7 +12,7 @@ ES
 GA
 ---------------------------------------
 
-.. autoclass:: metaheuristic_designer.algorithms.Classic.GA
+.. autoclass:: metaheuristic_designer.strategies.Classic.GA
    :members:
    :undoc-members:
    :show-inheritance:
@@ -20,7 +20,7 @@ GA
 PSO
 ----------------------------------------
 
-.. autoclass:: metaheuristic_designer.algorithms.Classic.PSO
+.. autoclass:: metaheuristic_designer.strategies.Classic.PSO
    :members:
    :undoc-members:
    :show-inheritance:
@@ -28,7 +28,7 @@ PSO
 SA
 ---------------------------------------
 
-.. autoclass:: metaheuristic_designer.algorithms.Classic.SA
+.. autoclass:: metaheuristic_designer.strategies.Classic.SA
    :members:
    :undoc-members:
    :show-inheritance:
@@ -36,7 +36,7 @@ SA
 DE
 ---------------------------------------
 
-.. autoclass:: metaheuristic_designer.algorithms.Classic.DE
+.. autoclass:: metaheuristic_designer.strategies.Classic.DE
    :members:
    :undoc-members:
    :show-inheritance:
@@ -44,7 +44,7 @@ DE
 HS
 ---------------------------------------
 
-.. autoclass:: metaheuristic_designer.algorithms.Classic.HS
+.. autoclass:: metaheuristic_designer.strategies.Classic.HS
    :members:
    :undoc-members:
    :show-inheritance:
@@ -52,7 +52,7 @@ HS
 RandomSearch
 -------------------------------------------------
 
-.. autoclass:: metaheuristic_designer.algorithms.Classic.RandomSearch
+.. autoclass:: metaheuristic_designer.strategies.Classic.RandomSearch
    :members:
    :undoc-members:
    :show-inheritance:
diff --git a/docs/metaheuristic_designer.algorithms.VNS.rst b/docs/metaheuristic_designer.strategies.VNS.rst
similarity index 63%
rename from docs/metaheuristic_designer.algorithms.VNS.rst
rename to docs/metaheuristic_designer.strategies.VNS.rst
index 7de985b..817153f 100644
--- a/docs/metaheuristic_designer.algorithms.VNS.rst
+++ b/docs/metaheuristic_designer.strategies.VNS.rst
@@ -1,10 +1,10 @@
-metaheuristic_designer.algorithms.VNS package
+metaheuristic_designer.strategies.VNS package
 =============================================
 
 RVNS
 ----------------------------------------
 
-.. automodule:: metaheuristic_designer.algorithms.VNS.RVNS
+.. automodule:: metaheuristic_designer.strategies.VNS.RVNS
    :members:
    :undoc-members:
    :show-inheritance:
@@ -12,7 +12,7 @@ RVNS
 VND
 ---------------------------------------
 
-.. automodule:: metaheuristic_designer.algorithms.VNS.VND
+.. automodule:: metaheuristic_designer.strategies.VNS.VND
    :members:
    :undoc-members:
    :show-inheritance:
@@ -20,7 +20,7 @@ VND
 VNS
 ---------------------------------------
 
-.. automodule:: metaheuristic_designer.algorithms.VNS.VNS
+.. automodule:: metaheuristic_designer.strategies.VNS.VNS
    :members:
    :undoc-members:
    :show-inheritance:
@@ -28,7 +28,7 @@ VNS
 VNS neighborhood changes
 --------------------------------------------------------------
 
-.. automodule:: metaheuristic_designer.algorithms.VNS.vns_neighborhood_changes
+.. automodule:: metaheuristic_designer.strategies.VNS.vns_neighborhood_changes
    :members:
    :undoc-members:
    :show-inheritance:
\ No newline at end of file
diff --git a/docs/metaheuristic_designer.strategies.rst b/docs/metaheuristic_designer.strategies.rst
new file mode 100644
index 0000000..8d48701
--- /dev/null
+++ b/docs/metaheuristic_designer.strategies.rst
@@ -0,0 +1,52 @@
+metaheuristic_designer.strategies package
+=========================================
+
+HillClimb
+---------
+
+.. autoclass:: metaheuristic_designer.strategies.HillClimb
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+LocalSearch
+-----------
+
+.. autoclass:: metaheuristic_designer.strategies.LocalSearch
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+StaticPopulation
+----------------
+
+.. autoclass:: metaheuristic_designer.strategies.StaticPopulation
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+VariablePopulation
+------------------
+
+.. autoclass:: metaheuristic_designer.strategies.VariablePopulation
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+NoSearch
+--------
+
+.. autoclass:: metaheuristic_designer.strategies.NoSearch
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+Subpackages
+-----------
+
+.. toctree::
+   :maxdepth: 2
+
+   metaheuristic_designer.strategies.CRO
+   metaheuristic_designer.strategies.Classic
+   metaheuristic_designer.strategies.VNS
\ No newline at end of file
diff --git a/examples/exec_basic.py b/examples/exec_basic.py
index 2276c24..d130d7b 100644
--- a/examples/exec_basic.py
+++ b/examples/exec_basic.py
@@ -1,9 +1,9 @@
 from metaheuristic_designer import ObjectiveFunc, ParamScheduler
-from metaheuristic_designer.searchMethods import GeneralSearch, MemeticSearch
+from metaheuristic_designer.algorithms import GeneralAlgorithm, MemeticAlgorithm
 from metaheuristic_designer.operators import OperatorReal, OperatorInt, OperatorBinary
 from metaheuristic_designer.initializers import UniformVectorInitializer
 from metaheuristic_designer.selectionMethods import ParentSelection, SurvivorSelection
-from metaheuristic_designer.algorithms import *
+from metaheuristic_designer.strategies import *
 
 from metaheuristic_designer.benchmarks import *
 
@@ -171,11 +171,11 @@ def run_algorithm(alg_name, memetic, save_state):
         exit()
 
     if memetic:
-        alg = MemeticSearch(
+        alg = MemeticAlgorithm(
             objfunc, search_strat, local_search, mem_select, params=params
         )
     else:
-        alg = GeneralSearch(objfunc, search_strat, params=params)
+        alg = GeneralAlgorithm(objfunc, search_strat, params=params)
 
     ind, fit = alg.optimize()
     print(ind)
diff --git a/examples/image_deblur.py b/examples/image_deblur.py
index 70bf3ef..2ca3618 100644
--- a/examples/image_deblur.py
+++ b/examples/image_deblur.py
@@ -3,9 +3,9 @@
     ParamScheduler,
     Individual,
 )
-from metaheuristic_designer.searchMethods import GeneralSearch, MemeticSearch
+from metaheuristic_designer.algorithms import GeneralAlgorithm, MemeticAlgorithm
 from metaheuristic_designer.operators import OperatorReal, OperatorInt, OperatorBinary
-from metaheuristic_designer.algorithms import *
+from metaheuristic_designer.strategies import *
 from metaheuristic_designer.initializers import *
 from metaheuristic_designer.selectionMethods import ParentSelection, SurvivorSelection
 from metaheuristic_designer.encodings import ImageEncoding
@@ -111,6 +111,10 @@ def run_algorithm(alg_name, img_file_name, memetic):
     parent_sel_op = ParentSelection("Best", {"amount": 15})
     selection_op = SurvivorSelection("Elitism", {"amount": 10})
 
+    mem_select = ParentSelection("Best", {"amount": 5})
+    neihbourhood_op = OperatorReal("RandNoise", {"method": "Cauchy", "F": 0.0002})
+    local_search = LocalSearch(pop_initializer, neihbourhood_op, params={"iters": 10})
+
     if alg_name == "HillClimb":
         pop_initializer.pop_size = 1
         search_strat = HillClimb(pop_initializer, mutation_op)
@@ -159,11 +163,19 @@ def run_algorithm(alg_name, img_file_name, memetic):
         exit()
 
     if memetic:
+        ls_pop_init = UniformVectorInitializer(
+            objfunc.vecsize,
+            objfunc.low_lim,
+            objfunc.up_lim,
+            encoding=encoding,
+            pop_size=100,
+        )
         local_search = LocalSearch(
+            ls_pop_init,
             OperatorInt("MutRand", {"method": "Uniform", "Low": -3, "Up": -3, "N": 3}),
-            {"iters": 10},
+            params={"iters": 10},
         )
-        alg = MemeticSearch(
+        alg = MemeticAlgorithm(
             objfunc,
             search_strat,
             local_search,
@@ -171,7 +183,7 @@ def run_algorithm(alg_name, img_file_name, memetic):
             params,
         )
     else:
-        alg = GeneralSearch(objfunc, search_strat, params)
+        alg = GeneralAlgorithm(objfunc, search_strat, params)
 
     # Optimize with display of image
     real_time_start = time.time()
diff --git a/examples/image_evolution.py b/examples/image_evolution.py
index 5326f19..6c4566b 100644
--- a/examples/image_evolution.py
+++ b/examples/image_evolution.py
@@ -1,7 +1,7 @@
 from metaheuristic_designer import ObjectiveFunc, ParamScheduler
-from metaheuristic_designer.searchMethods import GeneralSearch, MemeticSearch
+from metaheuristic_designer.algorithms import GeneralAlgorithm, MemeticAlgorithm
 from metaheuristic_designer.operators import OperatorReal, OperatorInt, OperatorBinary
-from metaheuristic_designer.algorithms import *
+from metaheuristic_designer.strategies import *
 from metaheuristic_designer.initializers import *
 from metaheuristic_designer.selectionMethods import ParentSelection, SurvivorSelection
 from metaheuristic_designer.encodings import ImageEncoding
@@ -112,6 +112,10 @@ def run_algorithm(alg_name, img_file_name, memetic):
     parent_sel_op = ParentSelection("Best", {"amount": 15})
     selection_op = SurvivorSelection("Elitism", {"amount": 10})
 
+    mem_select = ParentSelection("Best", {"amount": 5})
+    neihbourhood_op = OperatorInt("MutRand", {"method": "Uniform", "Low": -3, "Up": -3, "N": 3})
+    local_search = LocalSearch(pop_initializer, neihbourhood_op, params={"iters": 10})
+
     if alg_name == "HillClimb":
         pop_initializer.pop_size = 1
         search_strat = HillClimb(pop_initializer, mutation_op)
@@ -207,19 +211,11 @@ def run_algorithm(alg_name, img_file_name, memetic):
         exit()
 
     if memetic:
-        local_search = LocalSearch(
-            OperatorInt("MutRand", {"method": "Uniform", "Low": -3, "Up": -3, "N": 3}),
-            {"iters": 10},
-        )
-        alg = MemeticSearch(
-            objfunc,
-            search_strat,
-            local_search,
-            ParentSelection("Best", {"amount": 10}),
-            params,
+        alg = MemeticAlgorithm(
+            objfunc, search_strat, local_search, mem_select, params=params
         )
     else:
-        alg = GeneralSearch(objfunc, search_strat, params)
+        alg = GeneralAlgorithm(objfunc, search_strat, params)
 
     # Optimize with display of image
     real_time_start = time.time()
diff --git a/examples/np_problem_example.py b/examples/np_problem_example.py
index 2cedbe0..f42aaf8 100644
--- a/examples/np_problem_example.py
+++ b/examples/np_problem_example.py
@@ -1,5 +1,5 @@
 from metaheuristic_designer import ObjectiveFunc, ParamScheduler
-from metaheuristic_designer.searchMethods import GeneralSearch, MemeticSearch
+from metaheuristic_designer.algorithms import GeneralAlgorithm, MemeticAlgorithm
 from metaheuristic_designer.encodings import TypeCastEncoding
 from metaheuristic_designer.operators import (
     OperatorReal,
@@ -11,7 +11,7 @@
     UniformVectorInitializer,
     PermInitializer,
 )
-from metaheuristic_designer.algorithms import *
+from metaheuristic_designer.strategies import *
 from metaheuristic_designer.selectionMethods import ParentSelection, SurvivorSelection
 from metaheuristic_designer.benchmarks import *
 
@@ -348,11 +348,11 @@ def run_algorithm(alg_name, problem_name, memetic, save_state):
         exit()
 
     if memetic:
-        alg = MemeticSearch(
+        alg = MemeticAlgorithm(
             objfunc, search_strat, local_search, mem_select, params=params
         )
     else:
-        alg = GeneralSearch(objfunc, search_strat, params=params)
+        alg = GeneralAlgorithm(objfunc, search_strat, params=params)
 
     ind, fit = alg.optimize()
     print(ind)
diff --git a/examples/obj_from_lambda.py b/examples/obj_from_lambda.py
index 05a95df..460868a 100644
--- a/examples/obj_from_lambda.py
+++ b/examples/obj_from_lambda.py
@@ -1,10 +1,10 @@
 import numpy as np
 
 from metaheuristic_designer import ObjectiveFromLambda, ParamScheduler
-from metaheuristic_designer.searchMethods import GeneralSearch
+from metaheuristic_designer.algorithms import GeneralAlgorithm
 from metaheuristic_designer.operators import OperatorReal
 from metaheuristic_designer.initializers import UniformVectorInitializer
-from metaheuristic_designer.algorithms import *
+from metaheuristic_designer.strategies import *
 
 
 def func(vector):
@@ -33,7 +33,7 @@ def run_algorithm():
 
     search_strat = HillClimb(pop_init, mutation_op)
 
-    alg = GeneralSearch(objfunc, search_strat, params=params)
+    alg = GeneralAlgorithm(objfunc, search_strat, params=params)
 
     ind, fit = alg.optimize()
     print(ind)
diff --git a/pyproject.toml b/pyproject.toml
index e418085..f3e7313 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
 
 [project]
 name = "metaheuristic-designer"
-version = "0.1.3"
+version = "0.1.4"
 authors = [
     {name = "eugenioLR", email = "eugeniolorente0@gmail.com"}
 ]
diff --git a/src/metaheuristic_designer/Algorithm.py b/src/metaheuristic_designer/Algorithm.py
index ef756d1..41fecc5 100644
--- a/src/metaheuristic_designer/Algorithm.py
+++ b/src/metaheuristic_designer/Algorithm.py
@@ -1,216 +1,345 @@
 from __future__ import annotations
 from abc import ABC, abstractmethod
-from .Individual import Individual
-from .ParamScheduler import ParamScheduler
-from .selectionMethods import ParentSelection, SurvivorSelection
-from .Operator import Operator
 import time
+import json
+import numpy as np
+import pyparsing as pp
+from .utils import NumpyEncoder
 
 
 class Algorithm(ABC):
     """
-    This is the class that defines how the optimization will be carried out.
+    General framework for metaheuristic algorithms.
 
     Parameters
     ----------
-    pop_init: Initializer
-        Population initializer that will generate the initial population of the algorithm.
-    param: Union[ParamScheduler, dict]
+
+    objfunc: ObjectiveFunc
+        Objective function to be optimized.
+    search_strategy: SearchStrategy
+        Search strategy that will iteratively optimize the function.
+    params: ParamScheduler or dict, optional
         Dictionary of parameters to define the stopping condition and output of the algorithm.
-    name: str, optional
-        The name that will be displayed for this algorithm in the reports.
     """
 
     def __init__(
         self,
-        pop_init: Initializer,
+        objfunc: ObjectiveFunc,
+        search_strategy: SearchStrategy,
         params: Union[ParamScheduler, dict] = None,
-        name: str = "some algorithm",
     ):
         """
-        Constructor of the Algorithm class
+        Constructor of the Search class
         """
 
-        self.name = name
-        self.pop_init = pop_init
-
-        self.population = None
+        self.params = params
+        self.search_strategy = search_strategy
+        self.objfunc = objfunc
 
-        self.best = None
-
-        self.param_scheduler = None
         if params is None:
-            self.params = {}
-        elif isinstance(params, ParamScheduler):
-            self.param_scheduler = params
-            self.params = self.param_scheduler.get_params()
-        else:
-            self.params = params
-
-        self._find_operator_attributes()
-
-    def _find_operator_attributes(self):
+            params = {}
+
+        # Verbose parameters
+        self.verbose = params.get("verbose", True)
+        self.v_timer = params.get("v_timer", 1)
+
+        # Stopping conditions
+        self.stop_cond = params.get("stop_cond", "time_limit")
+        self.stop_cond_parsed = parse_stopping_cond(self.stop_cond)
+
+        self.progress_metric = params.get("progress_metric", self.stop_cond)
+        self.progress_metric_parsed = (
+            parse_stopping_cond(self.progress_metric)
+            if "progress_metric" in params
+            else self.stop_cond_parsed
+        )
+
+        self.Ngen = params.get("ngen", 100)
+        self.Neval = params.get("neval", 1e5)
+        self.time_limit = params.get("time_limit", 10.0)
+        self.cpu_time_limit = params.get("cpu_time_limit", 10.0)
+        self.fit_target = params.get("fit_target", 1e-10)
+        self.max_patience = params.get("patience", 1)
+        self.patience_left = self.max_patience
+
+        # Metrics
+        self.fit_history = []
+        self.best_history = []
+        self.progress = 0
+        self.ended = False
+        self.steps = 0
+        self.prev_best_fitness = None
+        self.cpu_time_spent = 0
+        self.real_time_spent = 0
+        self.converged_steps = 0
+
+    def restart(self):
         """
-        Saves the attributes that represent operators or other relevant information
-        about the algorithm.
+        Resets the internal values of the algorithm and the number of evaluations of the fitness function.
         """
 
-        attr_dict = vars(self).copy()
-
-        self.parent_sel = []
-        self.operators = []
-        self.surv_sel = []
+        self.fit_history = []
+        self.best_history = []
+        self.progress = 0
+        self.ended = False
+        self.prev_best_fitness = None
+        self.cpu_time_spent = 0
+        self.real_time_spent = 0
+        self.objfunc.counter = 0
 
-        for var_key in attr_dict:
-            attr = attr_dict[var_key]
-
-            if attr:
-                # We have a parent selection method
-                if isinstance(attr, ParentSelection):
-                    self.parent_sel.append(attr)
-
-                # We have an operator
-                if isinstance(attr, Operator):
-                    self.operators.append(attr)
-
-                # We have a survivor selection method
-                if isinstance(attr, SurvivorSelection):
-                    self.surv_sel.append(attr)
+    def save_solution(self, file_name: str = "solution.csv"):
+        """
+        Save the result of an execution to a csv file in disk.
 
-                # We have a list of operators
-                if isinstance(attr, list) and isinstance(attr[0], Operator):
-                    self.operators += attr
+        Parameters
+        ----------
 
-    @property
-    def pop_size(self):
-        """
-        Gets the amount of inidividuals in the population.
+        file_name: str
+            Path to the file where the solution will be stored.
         """
 
-        return self.pop_init.pop_size
+        ind, fit = self.search_strategy.best_solution()
+        np.savetxt(file_name, ind.reshape([1, -1]), delimiter=",")
 
     def best_solution(self) -> Tuple[Individual, float]:
         """
-        Returns the best solution found by the algorithm and its fitness.
+        Returns the best solution so far in the population.
 
         Returns
         -------
-        best_solution : Tuple[Individual, float]
+        best_solution: Tuple[Individual, float]
             A pair of the best individual with its fitness.
         """
 
-        best_fitness = self.best.fitness
-        if self.best.objfunc.mode == "min":
-            best_fitness *= -1
+        return self.search_strategy.best_solution()
 
-        return self.best.genotype, best_fitness
-
-    def initialize(self, objfunc: ObjectiveFunc):
+    def stopping_condition(
+        self, gen: int, real_time_start: float, cpu_time_start: float
+    ) -> bool:
         """
-        Initializes the optimization algorithm.
+        Given the state of the algorithm, returns wether we have finished or not.
 
         Parameters
         ----------
-        objfunc: ObjectiveFunc
-            Objective function to be optimized.
+        gen: int
+            The number of generations that has passed.
+        real_time_start: float
+            The time in seconds that passed since the algorithm was executed.
+        cpu_time_start: float
+            The time in seconds that the CPU has executed code in this algorithm.
+
+        Returns
+        -------
+        has_stopped: bool
+            Whether the algorithm has reached its end
         """
 
-        self.population = self.pop_init.generate_population(objfunc)
+        neval_reached = self.objfunc.counter >= self.Neval
+
+        ngen_reached = gen >= self.Ngen
+
+        real_time_reached = time.time() - real_time_start >= self.time_limit
 
-        self.best = max(self.population, key=lambda x: x.fitness)
+        cpu_time_reached = time.process_time() - cpu_time_start >= self.cpu_time_limit
 
-    def select_parents(
-        self, population: List[Individual], **kwargs
-    ) -> Tuple[List[Individual], List[int]]:
+        if self.objfunc.mode == "max":
+            target_reached = self.best_solution()[1] >= self.fit_target
+        else:
+            target_reached = self.best_solution()[1] <= self.fit_target
+
+        patience_reached = self.patience_left < 0
+
+        return process_condition(
+            self.stop_cond_parsed,
+            neval_reached,
+            ngen_reached,
+            real_time_reached,
+            cpu_time_reached,
+            target_reached,
+            patience_reached,
+        )
+
+    def get_progress(
+        self, gen: int, real_time_start: float, cpu_time_start: float
+    ) -> float:
         """
-        Selects the individuals that will be perturbed in this generation to generate the offspring.
+        Given the state of the algorithm, returns a number between 0 and 1 indicating
+        how close to the end of the algorithm we are, 0 when starting and 1 when finished.
 
         Parameters
         ----------
-        population: List[Individual]
-            The current population of the algorithm.
-        progress: float, optional
-            Indicator of how close it the algorithm to finishing, 1 means the algorithm should be stopped.
-        history: List[float], optional
-            The list of the best fitness value in each iteration.
+        gen: int
+            The number of generations that has passed.
+        real_time_start: float
+            The time in seconds that passed since the algorithm was executed.
+        cpu_time_start: float
+            The time in seconds that the CPU has executed code in this algorithm.
 
         Returns
         -------
-        parents: Tuple[List[Individual], List[int]]
-            A pair of the list of individuals considered as parents and their position in the original population.
+        progress: float
+            Indicator of how close it the algorithm to finishing, 1 means the algorithm should be stopped.
         """
 
-        return population
+        neval_reached = self.objfunc.counter / self.Neval
 
-    @abstractmethod
-    def perturb(
-        self, parent_list: List[Individual], objfunc: ObjectiveFunc, **kwargs
-    ) -> List[Individual]:
+        ngen_reached = gen / self.Ngen
+
+        real_time_reached = (time.time() - real_time_start) / self.time_limit
+
+        cpu_time_reached = (time.process_time() - cpu_time_start) / self.cpu_time_limit
+
+        best_fitness = self.best_solution()[1]
+        if self.objfunc.mode == "max":
+            target_reached = best_fitness / self.fit_target
+        else:
+            if best_fitness == 0:
+                best_fitness = 1e-40
+            target_reached = self.fit_target / best_fitness
+
+        patience_prec = 1 - self.patience_left / self.max_patience
+
+        return process_progress(
+            self.stop_cond_parsed,
+            neval_reached,
+            ngen_reached,
+            real_time_reached,
+            cpu_time_reached,
+            target_reached,
+            patience_prec,
+        )
+
+    def update(
+        self, real_time_start: float, cpu_time_start: float, pass_step: bool = True
+    ):
         """
-        Applies operators to the population to get the next generation of individuals.
+        Updates the attributes of the optimization algorithm.
+        This function should be called once per iteration of the algorithm.
 
         Parameters
         ----------
-        parent_list: List[Individual]
-            The current parents that will be used in the algorithm.
-        progress: float, optional
-            Indicator of how close it the algorithm to finishing, 1 means the algorithm should be stopped.
-        objfunc: ObjectiveFunc
-            Objective function to be optimized.
-        history: List[float], optional
-            The list of the best fitness value in each iteration.
+        real_time_start: float
+            The time in seconds that passed since the algorithm was executed.
+        cpu_time_start: float
+            The time in seconds that the CPU has executed code in this algorithm.
+        pass_step: bool
+            Whether to increment the iteration counter or not.
+        """
 
-        Returns
-        -------
-        offspring: List[Individual]
-            The list of individuals modified by the operators of the algorithm.
+        if pass_step:
+            self.steps += 1
+
+        if self.best_solution()[1] == self.prev_best_fitness:
+            self.patience_left -= 1
+        else:
+            self.patience_left = self.max_patience
+
+        self.prev_best_fitness = self.best_solution()[1]
+
+        self.progress = self.get_progress(self.steps, real_time_start, cpu_time_start)
+
+        self.ended = self.stopping_condition(
+            self.steps, real_time_start, cpu_time_start
+        )
+
+    def initialize(self):
+        """
+        Initializes the optimization algorithm.
         """
 
-    def select_individuals(
-        self, population: List[Individual], offspring: List[Individual], **kwargs
-    ) -> List[Individual]:
+        self.restart()
+        self.search_strategy.initialize(self.objfunc)
+
+    @abstractmethod
+    def step(
+        self, time_start: float = 0, verbose: bool = False
+    ) -> Tuple[Individual, float]:
         """
-        Selects the individuals that will pass to the next generation.
+        Performs an iteration of the algorithm.
 
         Parameters
         ----------
-        population: List[Individual]
-            The current population of the algorithm.
-        offspring: List[Individual]
-            The list of individuals modified by the operators of the algorithm.
-        progress: float, optional
-            Indicator of how close it the algorithm to finishing, 1 means the algorithm should be stopped.
-        history: List[float], optional
-            The list of the best fitness value in each iteration.
+        time_start: float, optional
+            Indicates to the algorihm how much time has already passed.
+        verbose: bool, optional
+            Indicates whether to show the status of the algorithm or not.
 
         Returns
         -------
-        offspring: List[Individual]
-            The list of individuals selected for the next generation.
+        best_solution: Tuple[Individual, float]
+            A pair of the best individual with its fitness.
         """
 
-        return offspring
-
-    def update_params(self, **kwargs):
+    def optimize(self) -> Tuple[Individual, float]:
         """
-        Updates the parameters of the algorithm and the operators.
+        Execute the algorithm to get the best solution possible along with its evaluation.
+        It will initialize the algorithm and repeat steps of the algorithm untill the
+        stopping condition is met.
 
-        Parameters
-        ----------
-        progress: float, optional
-            Indicator of how close it the algorithm to finishing, 1 means the algorithm should be stopped.
+        Returns
+        -------
+        best_solution: Tuple[Individual, float]
+            A pair of the best individual with its fitness.
         """
 
-    def get_state(self, show_pop: bool = False, show_pop_details: bool = False) -> dict:
+        if self.verbose:
+            self.init_info()
+
+        self.steps = 0
+
+        # initialize clocks
+        real_time_start = time.time()
+        cpu_time_start = time.process_time()
+        display_timer = time.time()
+
+        # Initizalize search strategy
+        self.initialize()
+
+        # Search until the stopping condition is met
+        self.update(real_time_start, cpu_time_start, pass_step=False)
+
+        if self.verbose:
+            self.step_info(real_time_start)
+
+        while not self.ended:
+            self.step(real_time_start)
+
+            self.update(real_time_start, cpu_time_start)
+
+            # Display information
+            if self.verbose and time.time() - display_timer > self.v_timer:
+                self.step_info(real_time_start)
+                display_timer = time.time()
+
+        # Store the time spent optimizing
+        self.real_time_spent = time.time() - real_time_start
+        self.cpu_time_spent = time.process_time() - cpu_time_start
+
+        return self.best_solution()
+
+    def get_state(
+        self,
+        show_best_solution: bool = True,
+        show_fit_history: bool = False,
+        show_gen_history: bool = False,
+        show_pop: bool = False,
+        show_pop_details: bool = False,
+    ) -> dict:
         """
         Gets the current state of the algorithm as a dictionary.
 
         Parameters
         ----------
+        show_best_solution: bool, optional
+            Save the best solution found by the algorithm.
+        show_fit_history: bool, optional
+            Save the fitness of the best individual of each iteration.
+        show_gen_history: bool, optional
+            Save the best inividual for each iteration.
         show_pop: bool, optional
-            Save the current population.
-        show_pop_details: bool, optional
-            Save the complete details of each individual.
+            Save the entire population of the last iteration.
+        show_pop_details:bool, optional
+            Save the detailed information of each individual.
 
         Returns
         -------
@@ -219,44 +348,282 @@ def get_state(self, show_pop: bool = False, show_pop_details: bool = False) -> d
         """
 
         data = {
-            "name": self.name,
-            "population_size": self.pop_size,
+            "ended": self.ended,
+            "progress": self.progress,
+            "generation": self.steps,
+            "evaluations": self.objfunc.counter,
+            "real_time_spent": self.real_time_spent,
+            "cpu_time_spent": self.cpu_time_spent,
+            "params": self.params,
         }
 
-        if self.param_scheduler:
-            data["param_scheduler"] = self.param_scheduler.get_state()
-            data["params"] = self.param_scheduler.get_params()
-        elif self.params:
-            data["params"] = self.params
-
-        if self.parent_sel:
-            data["parent_sel"] = [par.get_state() for par in self.parent_sel]
+        if show_best_solution:
+            data["best_fitness"] = self.best_solution()[1]
+            data["best_individual"] = self.search_strategy.best.get_state(
+                show_speed=False, show_best=False
+            )
 
-        if self.operators:
-            data["operators"] = [op.get_state() for op in self.operators]
+        if show_fit_history:
+            data["fit_history"] = self.fit_history
 
-        if self.surv_sel:
-            data["survivor_sel"] = [surv.get_state() for surv in self.surv_sel]
+        if show_gen_history:
+            data["best_history"] = self.best_history
 
-        if show_pop:
-            data["population"] = [
-                ind.get_state(show_speed=show_pop_details, show_best=show_pop_details)
-                for ind in self.population
-            ]
+        data["search_strat_state"] = self.search_strategy.get_state(
+            show_pop, show_pop_details
+        )
 
         return data
 
-    def extra_step_info(self):
+    def store_state(
+        self,
+        file_name: str = "dumped_state.json",
+        readable: bool = False,
+        show_best_solution: bool = True,
+        show_fit_history: bool = False,
+        show_gen_history: bool = False,
+        show_pop: bool = False,
+        show_pop_details: bool = False,
+    ):
         """
-        Specific information to report relevant to this algorithm each iteration.
+        Dumps the current state of the algorithm to a JSON file.
+
+        Parameters
+        ----------
+        file_name: str
+            Path to the file where the json file will be stored.
+        readable: bool, optional
+            Indent the JSON file to make it human-readable (comes at the cost of a higher file size).
+        show_best_solution: bool, optional
+            Save the best solution found by the algorithm.
+        show_fit_history: bool, optional
+            Save the fitness of the best individual of each iteration.
+        show_gen_history: bool, optional
+            Save the best inividual for each iteration.
+        show_pop: bool, optional
+            Save the entire population of the last iteration.
+        show_pop_details:bool, optional
+            Save the detailed information of each individual.
         """
 
-    def extra_report(self, show_plots: bool):
+        dumped = json.dumps(
+            self.get_state(
+                show_best_solution,
+                show_fit_history,
+                show_gen_history,
+                show_pop,
+                show_pop_details,
+            ),
+            cls=NumpyEncoder,
+            indent=4 if readable else None,
+        )
+
+        with open(file_name, "w") as fp:
+            fp.write(dumped)
+
+    def init_info(self):
+        print(
+            f"Initializing optimization of {self.objfunc.name} using {self.search_strategy.name}"
+        )
+        print(
+            f"-----------------------------{'-'*len(self.objfunc.name)}-------{'-'*len(self.search_strategy.name)}"
+        )
+        print()
+
+    @abstractmethod
+    def step_info(self, start_time: float = 0):
         """
-        Specific information to display relevant to this algorithm at the end of the algorithm.
+        Displays information about the current state of the algotithm.
 
         Parameters
         ----------
-        show_plots: bool
-            Display plots specific to this algorithm.
+        time_start: float, optional
+            Indicates to the algorihm how much time has already passed.
         """
+
+    @abstractmethod
+    def display_report(self, show_plots: bool = True):
+        """
+        Shows a summary of the execution of the algorithm.
+
+        Parameters
+        ----------
+        show_plots: bool, optional
+            Whether to display plots about the algorithm or not.
+        """
+
+
+def parse_stopping_cond(condition_str: str) -> List[str | List]:
+    """
+    This function parses an expression of the form "neval or cpu_time" into
+    a tree structure so that it can be futher processed.
+
+    Parameters
+    ----------
+    condition_str: str
+        The string to be parsed.
+
+    Returns
+    -------
+    token_list: List[str | List]
+        The list of tokens representing the original string.
+    """
+
+    orop = pp.Literal("and")
+    andop = pp.Literal("or")
+    condition = pp.oneOf(
+        ["neval", "ngen", "time_limit", "cpu_time_limit", "fit_target", "convergence"]
+    )
+
+    expr = pp.infixNotation(
+        condition, [(orop, 2, pp.opAssoc.RIGHT), (andop, 2, pp.opAssoc.RIGHT)]
+    )
+
+    return expr.parse_string(condition_str).as_list()
+
+
+def process_condition(
+    cond_parsed: List[str | List],
+    neval: int,
+    ngen: int,
+    real_time: float,
+    cpu_time: float,
+    target: float,
+    patience: int,
+) -> bool:
+    """
+    This function recieves as an input an expression for the stopping condition
+    and the truth variable of the possible stopping conditions and returns wether to stop or not.
+
+    Parameters
+    ----------
+    cond_parsed: List[str | List]
+        The list of tokens representing the parsed stopping condition.
+    neval: int
+        Number of function evaluations done.
+    ngen: int
+        Number of iterations done by the algorithm
+    real_time: float
+        Time since the start of the algorithm.
+    cpu_time: float
+        Time dedicated by the CPU to optimizing our function.
+    target: float
+        Fitness target.
+    patience: int
+        Number of time the algorithm has reached the same fitness value in a row.
+
+    Returns
+    -------
+    has_stopped: bool
+        Whether the algorithm has reached its end
+    """
+
+    result = None
+
+    if isinstance(cond_parsed, list):
+        if len(cond_parsed) == 3:
+            cond1 = process_condition(
+                cond_parsed[0], neval, ngen, real_time, cpu_time, target, patience
+            )
+            cond2 = process_condition(
+                cond_parsed[2], neval, ngen, real_time, cpu_time, target, patience
+            )
+
+            if cond_parsed[1] == "or":
+                result = cond1 or cond2
+            elif cond_parsed[1] == "and":
+                result = cond1 and cond2
+
+        elif len(cond_parsed) == 1:
+            result = process_condition(
+                cond_parsed[0], neval, ngen, real_time, cpu_time, target, patience
+            )
+
+    else:
+        if cond_parsed == "neval":
+            result = neval
+        elif cond_parsed == "ngen":
+            result = ngen
+        elif cond_parsed == "time_limit":
+            result = real_time
+        elif cond_parsed == "cpu_time_limit":
+            result = cpu_time
+        elif cond_parsed == "fit_target":
+            result = target
+        elif cond_parsed == "convergence":
+            result = patience
+
+    return result
+
+
+def process_progress(
+    cond_parsed: List[str | List],
+    neval: int,
+    ngen: int,
+    real_time: float,
+    cpu_time: float,
+    target: float,
+    patience: int,
+) -> float:
+    """
+    This function recieves as an input an expression for the stopping condition
+    and the truth variable of the possible stopping conditions and returns wether to stop or not.
+
+    Parameters
+    ----------
+    cond_parsed: List[str | List]
+        The list of tokens representing the parsed stopping condition.
+    neval: int
+        Number of function evaluations done.
+    ngen: int
+        Number of iterations done by the algorithm
+    real_time: float
+        Time since the start of the algorithm.
+    cpu_time: float
+        Time dedicated by the CPU to optimizing our function.
+    target: float
+        Fitness target.
+    patience: int
+        Number of time the algorithm has reached the same fitness value in a row.
+
+    Returns
+    -------
+    has_stopped: bool
+        Indicator of how close it the algorithm to finishing, 1 means the algorithm should be stopped.
+    """
+
+    result = None
+
+    if isinstance(cond_parsed, list):
+        if len(cond_parsed) == 3:
+            progress1 = process_progress(
+                cond_parsed[0], neval, ngen, real_time, cpu_time, target, patience
+            )
+            progress2 = process_progress(
+                cond_parsed[2], neval, ngen, real_time, cpu_time, target, patience
+            )
+
+            if cond_parsed[1] == "or":
+                result = max(progress1, progress2)
+            elif cond_parsed[1] == "and":
+                result = min(progress1, progress2)
+
+        elif len(cond_parsed) == 1:
+            result = process_progress(
+                cond_parsed[0], neval, ngen, real_time, cpu_time, target, patience
+            )
+    else:
+        if cond_parsed == "neval":
+            result = neval
+        elif cond_parsed == "ngen":
+            result = ngen
+        elif cond_parsed == "time_limit":
+            result = real_time
+        elif cond_parsed == "cpu_time_limit":
+            result = cpu_time
+        elif cond_parsed == "fit_target":
+            result = target
+        elif cond_parsed == "convergence":
+            result = patience
+
+    return result
diff --git a/src/metaheuristic_designer/Search.py b/src/metaheuristic_designer/Search.py
deleted file mode 100644
index 98d225d..0000000
--- a/src/metaheuristic_designer/Search.py
+++ /dev/null
@@ -1,632 +0,0 @@
-from __future__ import annotations
-from abc import ABC, abstractmethod
-import time
-import numpy as np
-import pyparsing as pp
-from .ObjectiveFunc import ObjectiveVectorFunc
-from .initializers import UniformVectorInitializer
-
-import json
-from .utils import NumpyEncoder
-
-
-class Search(ABC):
-    """
-    General framework for metaheuristic algorithms.
-
-    Parameters
-    ----------
-
-    objfunc: ObjectiveFunc
-        Objective function to be optimized.
-    search_strategy: Algorithm
-        Search strategy that will iteratively optimize the function.
-    params: ParamScheduler or dict, optional
-        Dictionary of parameters to define the stopping condition and output of the algorithm.
-    """
-
-    def __init__(
-        self,
-        objfunc: ObjectiveFunc,
-        search_strategy: Algorithm,
-        params: Union[ParamScheduler, dict] = None,
-    ):
-        """
-        Constructor of the Search class
-        """
-
-        self.params = params
-        self.search_strategy = search_strategy
-        self.objfunc = objfunc
-
-        if params is None:
-            params = {}
-
-        # Verbose parameters
-        self.verbose = params.get("verbose", True)
-        self.v_timer = params.get("v_timer", 1)
-
-        # Stopping conditions
-        self.stop_cond = params.get("stop_cond", "time_limit")
-        self.stop_cond_parsed = parse_stopping_cond(self.stop_cond)
-
-        self.progress_metric = params.get("progress_metric", self.stop_cond)
-        self.progress_metric_parsed = (
-            parse_stopping_cond(self.progress_metric)
-            if "progress_metric" in params
-            else self.stop_cond_parsed
-        )
-
-        self.Ngen = params.get("ngen", 100)
-        self.Neval = params.get("neval", 1e5)
-        self.time_limit = params.get("time_limit", 10.0)
-        self.cpu_time_limit = params.get("cpu_time_limit", 10.0)
-        self.fit_target = params.get("fit_target", 1e-10)
-        self.max_patience = params.get("patience", 1)
-        self.patience_left = self.max_patience
-
-        # Metrics
-        self.fit_history = []
-        self.best_history = []
-        self.progress = 0
-        self.ended = False
-        self.steps = 0
-        self.prev_best_fitness = None
-        self.cpu_time_spent = 0
-        self.real_time_spent = 0
-        self.converged_steps = 0
-
-    def restart(self):
-        """
-        Resets the internal values of the algorithm and the number of evaluations of the fitness function.
-        """
-
-        self.fit_history = []
-        self.best_history = []
-        self.progress = 0
-        self.ended = False
-        self.prev_best_fitness = None
-        self.cpu_time_spent = 0
-        self.real_time_spent = 0
-        self.objfunc.counter = 0
-
-    def save_solution(self, file_name: str = "solution.csv"):
-        """
-        Save the result of an execution to a csv file in disk.
-
-        Parameters
-        ----------
-
-        file_name: str
-            Path to the file where the solution will be stored.
-        """
-
-        ind, fit = self.search_strategy.best_solution()
-        np.savetxt(file_name, ind.reshape([1, -1]), delimiter=",")
-
-    def best_solution(self) -> Tuple[Individual, float]:
-        """
-        Returns the best solution so far in the population.
-
-        Returns
-        -------
-        best_solution: Tuple[Individual, float]
-            A pair of the best individual with its fitness.
-        """
-
-        return self.search_strategy.best_solution()
-
-    def stopping_condition(
-        self, gen: int, real_time_start: float, cpu_time_start: float
-    ) -> bool:
-        """
-        Given the state of the algorithm, returns wether we have finished or not.
-
-        Parameters
-        ----------
-        gen: int
-            The number of generations that has passed.
-        real_time_start: float
-            The time in seconds that passed since the algorithm was executed.
-        cpu_time_start: float
-            The time in seconds that the CPU has executed code in this algorithm.
-
-        Returns
-        -------
-        has_stopped: bool
-            Whether the algorithm has reached its end
-        """
-
-        neval_reached = self.objfunc.counter >= self.Neval
-
-        ngen_reached = gen >= self.Ngen
-
-        real_time_reached = time.time() - real_time_start >= self.time_limit
-
-        cpu_time_reached = time.process_time() - cpu_time_start >= self.cpu_time_limit
-
-        if self.objfunc.mode == "max":
-            target_reached = self.best_solution()[1] >= self.fit_target
-        else:
-            target_reached = self.best_solution()[1] <= self.fit_target
-
-        patience_reached = self.patience_left < 0
-
-        return process_condition(
-            self.stop_cond_parsed,
-            neval_reached,
-            ngen_reached,
-            real_time_reached,
-            cpu_time_reached,
-            target_reached,
-            patience_reached,
-        )
-
-    def get_progress(
-        self, gen: int, real_time_start: float, cpu_time_start: float
-    ) -> float:
-        """
-        Given the state of the algorithm, returns a number between 0 and 1 indicating
-        how close to the end of the algorithm we are, 0 when starting and 1 when finished.
-
-        Parameters
-        ----------
-        gen: int
-            The number of generations that has passed.
-        real_time_start: float
-            The time in seconds that passed since the algorithm was executed.
-        cpu_time_start: float
-            The time in seconds that the CPU has executed code in this algorithm.
-
-        Returns
-        -------
-        progress: float
-            Indicator of how close it the algorithm to finishing, 1 means the algorithm should be stopped.
-        """
-
-        neval_reached = self.objfunc.counter / self.Neval
-
-        ngen_reached = gen / self.Ngen
-
-        real_time_reached = (time.time() - real_time_start) / self.time_limit
-
-        cpu_time_reached = (time.process_time() - cpu_time_start) / self.cpu_time_limit
-
-        best_fitness = self.best_solution()[1]
-        if self.objfunc.mode == "max":    
-            target_reached = best_fitness / self.fit_target
-        else:
-            if best_fitness == 0:
-                best_fitness = 1e-40
-            target_reached = self.fit_target / best_fitness
-
-        patience_prec = 1 - self.patience_left / self.max_patience
-
-        return process_progress(
-            self.stop_cond_parsed,
-            neval_reached,
-            ngen_reached,
-            real_time_reached,
-            cpu_time_reached,
-            target_reached,
-            patience_prec,
-        )
-
-    def update(
-        self, real_time_start: float, cpu_time_start: float, pass_step: bool = True
-    ):
-        """
-        Updates the attributes of the optimization algorithm.
-        This function should be called once per iteration of the algorithm.
-
-        Parameters
-        ----------
-        real_time_start: float
-            The time in seconds that passed since the algorithm was executed.
-        cpu_time_start: float
-            The time in seconds that the CPU has executed code in this algorithm.
-        pass_step: bool
-            Whether to increment the iteration counter or not.
-        """
-
-        if pass_step:
-            self.steps += 1
-
-        if self.best_solution()[1] == self.prev_best_fitness:
-            self.patience_left -= 1
-        else:
-            self.patience_left = self.max_patience
-
-        self.prev_best_fitness = self.best_solution()[1]
-
-        self.progress = self.get_progress(self.steps, real_time_start, cpu_time_start)
-
-        self.ended = self.stopping_condition(
-            self.steps, real_time_start, cpu_time_start
-        )
-
-    def initialize(self):
-        """
-        Initializes the optimization algorithm.
-        """
-
-        self.restart()
-        self.search_strategy.initialize(self.objfunc)
-
-    @abstractmethod
-    def step(
-        self, time_start: float = 0, verbose: bool = False
-    ) -> Tuple[Individual, float]:
-        """
-        Performs an iteration of the algorithm.
-
-        Parameters
-        ----------
-        time_start: float, optional
-            Indicates to the algorihm how much time has already passed.
-        verbose: bool, optional
-            Indicates whether to show the status of the algorithm or not.
-
-        Returns
-        -------
-        best_solution: Tuple[Individual, float]
-            A pair of the best individual with its fitness.
-        """
-
-    def optimize(self) -> Tuple[Individual, float]:
-        """
-        Execute the algorithm to get the best solution possible along with its evaluation.
-        It will initialize the algorithm and repeat steps of the algorithm untill the
-        stopping condition is met.
-
-        Returns
-        -------
-        best_solution: Tuple[Individual, float]
-            A pair of the best individual with its fitness.
-        """
-
-        if self.verbose:
-            self.init_info()
-
-        self.steps = 0
-
-        # initialize clocks
-        real_time_start = time.time()
-        cpu_time_start = time.process_time()
-        display_timer = time.time()
-
-        # Initizalize search strategy
-        self.initialize()
-
-        # Search untill the stopping condition is met
-        self.update(real_time_start, cpu_time_start, pass_step=False)
-
-        if self.verbose:
-            self.step_info(real_time_start)
-
-        while not self.ended:
-            self.step(real_time_start)
-
-            self.update(real_time_start, cpu_time_start)
-
-            # Display information
-            if self.verbose and time.time() - display_timer > self.v_timer:
-                self.step_info(real_time_start)
-                display_timer = time.time()
-
-        # Store the time spent optimizing
-        self.real_time_spent = time.time() - real_time_start
-        self.cpu_time_spent = time.process_time() - cpu_time_start
-
-        return self.best_solution()
-
-    def get_state(
-        self,
-        show_best_solution: bool = True,
-        show_fit_history: bool = False,
-        show_gen_history: bool = False,
-        show_pop: bool = False,
-        show_pop_details: bool = False,
-    ) -> dict:
-        """
-        Gets the current state of the algorithm as a dictionary.
-
-        Parameters
-        ----------
-        show_best_solution: bool, optional
-            Save the best solution found by the algorithm.
-        show_fit_history: bool, optional
-            Save the fitness of the best individual of each iteration.
-        show_gen_history: bool, optional
-            Save the best inividual for each iteration.
-        show_pop: bool, optional
-            Save the entire population of the last iteration.
-        show_pop_details:bool, optional
-            Save the detailed information of each individual.
-
-        Returns
-        -------
-        state: dict
-            The complete state of the algorithm.
-        """
-
-        data = {
-            "ended": self.ended,
-            "progress": self.progress,
-            "generation": self.steps,
-            "evaluations": self.objfunc.counter,
-            "real_time_spent": self.real_time_spent,
-            "cpu_time_spent": self.cpu_time_spent,
-            "params": self.params,
-        }
-
-        if show_best_solution:
-            data["best_fitness"] = self.best_solution()[1]
-            data["best_individual"] = self.search_strategy.best.get_state(
-                show_speed=False, show_best=False
-            )
-
-        if show_fit_history:
-            data["fit_history"] = self.fit_history
-
-        if show_gen_history:
-            data["best_history"] = self.best_history
-
-        data["search_strat_state"] = self.search_strategy.get_state(
-            show_pop, show_pop_details
-        )
-
-        return data
-
-    def store_state(
-        self,
-        file_name: str = "dumped_state.json",
-        readable: bool = False,
-        show_best_solution: bool = True,
-        show_fit_history: bool = False,
-        show_gen_history: bool = False,
-        show_pop: bool = False,
-        show_pop_details: bool = False,
-    ):
-        """
-        Dumps the current state of the algorithm to a JSON file.
-
-        Parameters
-        ----------
-        file_name: str
-            Path to the file where the json file will be stored.
-        readable: bool, optional
-            Indent the JSON file to make it human-readable (comes at the cost of a higher file size).
-        show_best_solution: bool, optional
-            Save the best solution found by the algorithm.
-        show_fit_history: bool, optional
-            Save the fitness of the best individual of each iteration.
-        show_gen_history: bool, optional
-            Save the best inividual for each iteration.
-        show_pop: bool, optional
-            Save the entire population of the last iteration.
-        show_pop_details:bool, optional
-            Save the detailed information of each individual.
-        """
-
-        dumped = json.dumps(
-            self.get_state(
-                show_best_solution,
-                show_fit_history,
-                show_gen_history,
-                show_pop,
-                show_pop_details,
-            ),
-            cls=NumpyEncoder,
-            indent=4 if readable else None,
-        )
-
-        with open(file_name, "w") as fp:
-            fp.write(dumped)
-
-    def init_info(self):
-        print(
-            f"Initializing optimization of {self.objfunc.name} using {self.search_strategy.name}"
-        )
-        print(
-            f"-----------------------------{'-'*len(self.objfunc.name)}-------{'-'*len(self.search_strategy.name)}"
-        )
-        print()
-
-    @abstractmethod
-    def step_info(self, start_time: float = 0):
-        """
-        Displays information about the current state of the algotithm.
-
-        Parameters
-        ----------
-        time_start: float, optional
-            Indicates to the algorihm how much time has already passed.
-        """
-
-    @abstractmethod
-    def display_report(self, show_plots: bool = True):
-        """
-        Shows a summary of the execution of the algorithm.
-
-        Parameters
-        ----------
-        show_plots: bool, optional
-            Whether to display plots about the algorithm or not.
-        """
-
-
-def parse_stopping_cond(condition_str: str) -> List[str | List]:
-    """
-    This function parses an expression of the form "neval or cpu_time" into
-    a tree structure so that it can be futher processed.
-
-    Parameters
-    ----------
-    condition_str: str
-        The string to be parsed.
-
-    Returns
-    -------
-    token_list: List[str | List]
-        The list of tokens representing the original string.
-    """
-
-    orop = pp.Literal("and")
-    andop = pp.Literal("or")
-    condition = pp.oneOf(
-        ["neval", "ngen", "time_limit", "cpu_time_limit", "fit_target", "convergence"]
-    )
-
-    expr = pp.infixNotation(
-        condition, [(orop, 2, pp.opAssoc.RIGHT), (andop, 2, pp.opAssoc.RIGHT)]
-    )
-
-    return expr.parse_string(condition_str).as_list()
-
-
-def process_condition(
-    cond_parsed: List[str | List],
-    neval: int,
-    ngen: int,
-    real_time: float,
-    cpu_time: float,
-    target: float,
-    patience: int,
-) -> bool:
-    """
-    This function recieves as an input an expression for the stopping condition
-    and the truth variable of the possible stopping conditions and returns wether to stop or not.
-
-    Parameters
-    ----------
-    cond_parsed: List[str | List]
-        The list of tokens representing the parsed stopping condition.
-    neval: int
-        Number of function evaluations done.
-    ngen: int
-        Number of iterations done by the algorithm
-    real_time: float
-        Time since the start of the algorithm.
-    cpu_time: float
-        Time dedicated by the CPU to optimizing our function.
-    target: float
-        Fitness target.
-    patience: int
-        Number of time the algorithm has reached the same fitness value in a row.
-
-    Returns
-    -------
-    has_stopped: bool
-        Whether the algorithm has reached its end
-    """
-
-    result = None
-
-    if isinstance(cond_parsed, list):
-        if len(cond_parsed) == 3:
-            cond1 = process_condition(
-                cond_parsed[0], neval, ngen, real_time, cpu_time, target, patience
-            )
-            cond2 = process_condition(
-                cond_parsed[2], neval, ngen, real_time, cpu_time, target, patience
-            )
-
-            if cond_parsed[1] == "or":
-                result = cond1 or cond2
-            elif cond_parsed[1] == "and":
-                result = cond1 and cond2
-
-        elif len(cond_parsed) == 1:
-            result = process_condition(
-                cond_parsed[0], neval, ngen, real_time, cpu_time, target, patience
-            )
-
-    else:
-        if cond_parsed == "neval":
-            result = neval
-        elif cond_parsed == "ngen":
-            result = ngen
-        elif cond_parsed == "time_limit":
-            result = real_time
-        elif cond_parsed == "cpu_time_limit":
-            result = cpu_time
-        elif cond_parsed == "fit_target":
-            result = target
-        elif cond_parsed == "convergence":
-            result = patience
-
-    return result
-
-
-def process_progress(
-    cond_parsed: List[str | List],
-    neval: int,
-    ngen: int,
-    real_time: float,
-    cpu_time: float,
-    target: float,
-    patience: int,
-) -> float:
-    """
-    This function recieves as an input an expression for the stopping condition
-    and the truth variable of the possible stopping conditions and returns wether to stop or not.
-
-    Parameters
-    ----------
-    cond_parsed: List[str | List]
-        The list of tokens representing the parsed stopping condition.
-    neval: int
-        Number of function evaluations done.
-    ngen: int
-        Number of iterations done by the algorithm
-    real_time: float
-        Time since the start of the algorithm.
-    cpu_time: float
-        Time dedicated by the CPU to optimizing our function.
-    target: float
-        Fitness target.
-    patience: int
-        Number of time the algorithm has reached the same fitness value in a row.
-
-    Returns
-    -------
-    has_stopped: bool
-        Indicator of how close it the algorithm to finishing, 1 means the algorithm should be stopped.
-    """
-
-    result = None
-
-    if isinstance(cond_parsed, list):
-        if len(cond_parsed) == 3:
-            progress1 = process_progress(
-                cond_parsed[0], neval, ngen, real_time, cpu_time, target, patience
-            )
-            progress2 = process_progress(
-                cond_parsed[2], neval, ngen, real_time, cpu_time, target, patience
-            )
-
-            if cond_parsed[1] == "or":
-                result = max(progress1, progress2)
-            elif cond_parsed[1] == "and":
-                result = min(progress1, progress2)
-
-        elif len(cond_parsed) == 1:
-            result = process_progress(
-                cond_parsed[0], neval, ngen, real_time, cpu_time, target, patience
-            )
-    else:
-        if cond_parsed == "neval":
-            result = neval
-        elif cond_parsed == "ngen":
-            result = ngen
-        elif cond_parsed == "time_limit":
-            result = real_time
-        elif cond_parsed == "cpu_time_limit":
-            result = cpu_time
-        elif cond_parsed == "fit_target":
-            result = target
-        elif cond_parsed == "convergence":
-            result = patience
-
-    return result
diff --git a/src/metaheuristic_designer/SearchStrategy.py b/src/metaheuristic_designer/SearchStrategy.py
new file mode 100644
index 0000000..c2560be
--- /dev/null
+++ b/src/metaheuristic_designer/SearchStrategy.py
@@ -0,0 +1,244 @@
+from __future__ import annotations
+from abc import ABC, abstractmethod
+from .Individual import Individual
+from .ParamScheduler import ParamScheduler
+from .selectionMethods import ParentSelection, SurvivorSelection
+from .Operator import Operator
+
+
+class SearchStrategy(ABC):
+    """
+    This is the class that defines how the optimization will be carried out.
+
+    Parameters
+    ----------
+    pop_init: Initializer
+        Population initializer that will generate the initial population of the search strategy.
+    param: Union[ParamScheduler, dict]
+        Dictionary of parameters to define the stopping condition and output of the search strategy.
+    name: str, optional
+        The name that will be displayed for this search strategy in the reports.
+    """
+
+    def __init__(
+        self,
+        pop_init: Initializer,
+        params: Union[ParamScheduler, dict] = None,
+        name: str = "some strategy",
+    ):
+        """
+        Constructor of the SearchStrategy class
+        """
+
+        self.name = name
+        self.pop_init = pop_init
+
+        self.population = None
+
+        self.best = None
+
+        self.param_scheduler = None
+        if params is None:
+            self.params = {}
+        elif isinstance(params, ParamScheduler):
+            self.param_scheduler = params
+            self.params = self.param_scheduler.get_params()
+        else:
+            self.params = params
+
+        self._find_operator_attributes()
+
+    def _find_operator_attributes(self):
+        """
+        Saves the attributes that represent operators or other relevant information
+        about the search strategy.
+        """
+
+        attr_dict = vars(self).copy()
+
+        self.parent_sel = []
+        self.operators = []
+        self.surv_sel = []
+
+        for var_key in attr_dict:
+            attr = attr_dict[var_key]
+
+            if attr:
+                # We have a parent selection method
+                if isinstance(attr, ParentSelection):
+                    self.parent_sel.append(attr)
+
+                # We have an operator
+                if isinstance(attr, Operator):
+                    self.operators.append(attr)
+
+                # We have a survivor selection method
+                if isinstance(attr, SurvivorSelection):
+                    self.surv_sel.append(attr)
+
+                # We have a list of operators
+                if isinstance(attr, list) and isinstance(attr[0], Operator):
+                    self.operators += attr
+
+    @property
+    def pop_size(self):
+        """
+        Gets the amount of inidividuals in the population.
+        """
+
+        return self.pop_init.pop_size
+
+    def best_solution(self) -> Tuple[Individual, float]:
+        """
+        Returns the best solution found by the search strategy and its fitness.
+
+        Returns
+        -------
+        best_solution : Tuple[Individual, float]
+            A pair of the best individual with its fitness.
+        """
+
+        best_fitness = self.best.fitness
+        if self.best.objfunc.mode == "min":
+            best_fitness *= -1
+
+        return self.best.genotype, best_fitness
+
+    def initialize(self, objfunc: ObjectiveFunc):
+        """
+        Initializes the optimization search strategy.
+
+        Parameters
+        ----------
+        objfunc: ObjectiveFunc
+            Objective function to be optimized.
+        """
+
+        self.population = self.pop_init.generate_population(objfunc)
+
+        self.best = max(self.population, key=lambda x: x.fitness)
+
+    def select_parents(
+        self, population: List[Individual], **kwargs
+    ) -> Tuple[List[Individual], List[int]]:
+        """
+        Selects the individuals that will be perturbed in this generation to generate the offspring.
+
+        Parameters
+        ----------
+        population: List[Individual]
+            The current population of the search strategy.
+
+        Returns
+        -------
+        parents: Tuple[List[Individual], List[int]]
+            A pair of the list of individuals considered as parents and their position in the original population.
+        """
+
+        return population
+
+    @abstractmethod
+    def perturb(
+        self, parent_list: List[Individual], objfunc: ObjectiveFunc, **kwargs
+    ) -> List[Individual]:
+        """
+        Applies operators to the population to get the next generation of individuals.
+
+        Parameters
+        ----------
+        parent_list: List[Individual]
+            The current parents that will be used in the search strategy.
+        objfunc: ObjectiveFunc
+            Objective function to be optimized.
+
+        Returns
+        -------
+        offspring: List[Individual]
+            The list of individuals modified by the operators of the search strategy.
+        """
+
+    def select_individuals(
+        self, population: List[Individual], offspring: List[Individual], **kwargs
+    ) -> List[Individual]:
+        """
+        Selects the individuals that will pass to the next generation.
+
+        Parameters
+        ----------
+        population: List[Individual]
+            The current population of the search strategy.
+        offspring: List[Individual]
+            The list of individuals modified by the operators of the search strategy.
+
+        Returns
+        -------
+        offspring: List[Individual]
+            The list of individuals selected for the next generation.
+        """
+
+        return offspring
+
+    def update_params(self, **kwargs):
+        """
+        Updates the parameters of the search strategy and the operators.
+        """
+
+    def get_state(self, show_pop: bool = False, show_pop_details: bool = False) -> dict:
+        """
+        Gets the current state of the search strategy as a dictionary.
+
+        Parameters
+        ----------
+        show_pop: bool, optional
+            Save the current population.
+        show_pop_details: bool, optional
+            Save the complete details of each individual.
+
+        Returns
+        -------
+        state: dict
+            The complete state of the search strategy.
+        """
+
+        data = {
+            "name": self.name,
+            "population_size": self.pop_size,
+        }
+
+        if self.param_scheduler:
+            data["param_scheduler"] = self.param_scheduler.get_state()
+            data["params"] = self.param_scheduler.get_params()
+        elif self.params:
+            data["params"] = self.params
+
+        if self.parent_sel:
+            data["parent_sel"] = [par.get_state() for par in self.parent_sel]
+
+        if self.operators:
+            data["operators"] = [op.get_state() for op in self.operators]
+
+        if self.surv_sel:
+            data["survivor_sel"] = [surv.get_state() for surv in self.surv_sel]
+
+        if show_pop:
+            data["population"] = [
+                ind.get_state(show_speed=show_pop_details, show_best=show_pop_details)
+                for ind in self.population
+            ]
+
+        return data
+
+    def extra_step_info(self):
+        """
+        Specific information to report relevant to this search strategy each iteration.
+        """
+
+    def extra_report(self, show_plots: bool):
+        """
+        Specific information to display relevant to this search strategy at the end of the algorithm.
+
+        Parameters
+        ----------
+        show_plots: bool
+            Display plots specific to this search strategy.
+        """
diff --git a/src/metaheuristic_designer/__init__.py b/src/metaheuristic_designer/__init__.py
index 4b61848..5269de4 100644
--- a/src/metaheuristic_designer/__init__.py
+++ b/src/metaheuristic_designer/__init__.py
@@ -2,12 +2,12 @@
 
 from .ObjectiveFunc import ObjectiveFunc, ObjectiveVectorFunc, ObjectiveFromLambda
 
-from .Search import Search
-from . import searchMethods
-from .searchMethods import GeneralSearch, MemeticSearch
-
 from .Algorithm import Algorithm
 from . import algorithms
+from .algorithms import GeneralAlgorithm, MemeticAlgorithm
+
+from .SearchStrategy import SearchStrategy
+from . import strategies
 
 from .Individual import Individual
 
diff --git a/src/metaheuristic_designer/searchMethods/GeneralSearch.py b/src/metaheuristic_designer/algorithms/GeneralAlgorithm.py
similarity index 87%
rename from src/metaheuristic_designer/searchMethods/GeneralSearch.py
rename to src/metaheuristic_designer/algorithms/GeneralAlgorithm.py
index db0b4ff..69151a2 100644
--- a/src/metaheuristic_designer/searchMethods/GeneralSearch.py
+++ b/src/metaheuristic_designer/algorithms/GeneralAlgorithm.py
@@ -1,11 +1,10 @@
 from __future__ import annotations
-import numpy as np
-from matplotlib import pyplot as plt
-from ..Search import Search
 import time
+from matplotlib import pyplot as plt
+from ..Algorithm import Algorithm
 
 
-class GeneralSearch(Search):
+class GeneralAlgorithm(Algorithm):
     """
     General framework for metaheuristic algorithms
 
@@ -23,7 +22,7 @@ class GeneralSearch(Search):
     def __init__(
         self,
         objfunc: ObjectiveFunc,
-        search_strategy: Algorithm,
+        search_strategy: SearchStrategy,
         params: Union[ParamScheduler, dict] = None,
     ):
         """
@@ -33,22 +32,28 @@ def __init__(
         super().__init__(objfunc, search_strategy, params)
 
     def step(self, time_start=0, verbose=False):
+        # Get the population of this generation
         population = self.search_strategy.population
 
+        # Generate their parents
         parents = self.search_strategy.select_parents(
             population, progress=self.progress, history=self.best_history
         )
 
+        # Evolve the selected parents
         offspring = self.search_strategy.perturb(
             parents, self.objfunc, progress=self.progress, history=self.best_history
         )
 
+        # Select the individuals that remain for the next generation
         population = self.search_strategy.select_individuals(
             population, offspring, progress=self.progress, history=self.best_history
         )
 
+        # Assign the newly generate population
         self.search_strategy.population = population
 
+        # Get information about the algorithm to track it's progress
         best_individual, best_fitness = self.search_strategy.best_solution()
         self.search_strategy.update_params(progress=self.progress)
 
@@ -58,7 +63,7 @@ def step(self, time_start=0, verbose=False):
 
         return (best_individual, best_fitness)
 
-    def step_info(self, start_time):
+    def step_info(self, start_time=0):
         print(f"Optimizing {self.objfunc.name} using {self.search_strategy.name}:")
         print(f"\tReal time Spent: {round(time.time() - start_time,2)} s")
         print(f"\tCPU time Spent:  {round(time.time() - start_time,2)} s")
diff --git a/src/metaheuristic_designer/searchMethods/MemeticSearch.py b/src/metaheuristic_designer/algorithms/MemeticAlgorithm.py
similarity index 97%
rename from src/metaheuristic_designer/searchMethods/MemeticSearch.py
rename to src/metaheuristic_designer/algorithms/MemeticAlgorithm.py
index ce44b61..f6ebfea 100644
--- a/src/metaheuristic_designer/searchMethods/MemeticSearch.py
+++ b/src/metaheuristic_designer/algorithms/MemeticAlgorithm.py
@@ -1,11 +1,10 @@
 from __future__ import annotations
-import numpy as np
-from matplotlib import pyplot as plt
 import time
-from ..Search import Search
+from matplotlib import pyplot as plt
+from ..Algorithm import Algorithm
 
 
-class MemeticSearch(Search):
+class MemeticAlgorithm(Algorithm):
     """
     General framework for metaheuristic algorithms
 
@@ -126,7 +125,7 @@ def get_state(
 
         return data
 
-    def step_info(self, start_time):
+    def step_info(self, start_time=0):
         print(
             f"Optimizing {self.objfunc.name} using {self.search_strategy.name}+{self.local_search.name}:"
         )
diff --git a/src/metaheuristic_designer/algorithms/__init__.py b/src/metaheuristic_designer/algorithms/__init__.py
index 45603b0..057144a 100644
--- a/src/metaheuristic_designer/algorithms/__init__.py
+++ b/src/metaheuristic_designer/algorithms/__init__.py
@@ -1,11 +1,2 @@
-from .HillClimb import HillClimb
-from .LocalSearch import LocalSearch
-
-from .StaticPopulation import StaticPopulation
-from .VariablePopulation import VariablePopulation
-
-from .NoSearch import NoSearch
-
-from .Classic import *
-from .CRO import *
-from .VNS import *
+from .GeneralAlgorithm import GeneralAlgorithm
+from .MemeticAlgorithm import MemeticAlgorithm
diff --git a/src/metaheuristic_designer/searchMethods/__init__.py b/src/metaheuristic_designer/searchMethods/__init__.py
deleted file mode 100644
index 7163fa0..0000000
--- a/src/metaheuristic_designer/searchMethods/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-from .GeneralSearch import GeneralSearch
-from .MemeticSearch import MemeticSearch
diff --git a/src/metaheuristic_designer/simple/differential_evolution.py b/src/metaheuristic_designer/simple/differential_evolution.py
index 54f87dc..1f20838 100644
--- a/src/metaheuristic_designer/simple/differential_evolution.py
+++ b/src/metaheuristic_designer/simple/differential_evolution.py
@@ -1,13 +1,12 @@
 from __future__ import annotations
 from ..initializers import UniformVectorInitializer
-from ..operators import OperatorInt, OperatorReal, OperatorBinary
+from ..operators import OperatorReal
 from ..encodings import TypeCastEncoding
-from ..selectionMethods import SurvivorSelection, ParentSelection
-from ..algorithms import DE
-from ..searchMethods import GeneralSearch
+from ..strategies import DE
+from ..algorithms import GeneralAlgorithm
 
 
-def differential_evolution(objfunc: ObjectiveVectorFunc, params: dict) -> Search:
+def differential_evolution(objfunc: ObjectiveVectorFunc, params: dict) -> Algorithm:
     """
     Instantiates a differential evolution algorithm to optimize the given objective function.
 
@@ -20,7 +19,7 @@ def differential_evolution(objfunc: ObjectiveVectorFunc, params: dict) -> Search
 
     Returns
     -------
-    algorithm: Search
+    algorithm: Algorithm
         Configured optimization algorithm.
     """
 
@@ -28,7 +27,7 @@ def differential_evolution(objfunc: ObjectiveVectorFunc, params: dict) -> Search
         raise ValueError(
             f'You must specify the encoding in the params structure, the options are "real", "int" and "bin"'
         )
-    
+
     encoding_str = params["encoding"]
 
     if encoding_str.lower() == "real":
@@ -75,7 +74,7 @@ def _differential_evolution_real_vec(objfunc, params):
 
     search_strat = DE(pop_initializer, de_op)
 
-    return GeneralSearch(objfunc, search_strat, params=params)
+    return GeneralAlgorithm(objfunc, search_strat, params=params)
 
 
 def _differential_evolution_int_vec(objfunc, params):
@@ -115,7 +114,7 @@ def _differential_evolution_int_vec(objfunc, params):
 
     search_strat = DE(pop_initializer, de_op)
 
-    return GeneralSearch(objfunc, search_strat, params=params)
+    return GeneralAlgorithm(objfunc, search_strat, params=params)
 
 
 def _differential_evolution_bin_vec(objfunc, params):
@@ -155,4 +154,4 @@ def _differential_evolution_bin_vec(objfunc, params):
 
     search_strat = DE(pop_initializer, de_op)
 
-    return GeneralSearch(objfunc, search_strat, params=params)
+    return GeneralAlgorithm(objfunc, search_strat, params=params)
diff --git a/src/metaheuristic_designer/simple/evolution_strategy.py b/src/metaheuristic_designer/simple/evolution_strategy.py
index 4ad2588..9ef426c 100644
--- a/src/metaheuristic_designer/simple/evolution_strategy.py
+++ b/src/metaheuristic_designer/simple/evolution_strategy.py
@@ -3,11 +3,11 @@
 from ..operators import OperatorInt, OperatorReal, OperatorBinary
 from ..selectionMethods import SurvivorSelection, ParentSelection
 from ..encodings import TypeCastEncoding
-from ..algorithms import ES
-from ..searchMethods import GeneralSearch
+from ..strategies import ES
+from ..algorithms import GeneralAlgorithm
 
 
-def evolution_strategy(objfunc: ObjectiveVectorFunc, params: dict) -> Search:
+def evolution_strategy(objfunc: ObjectiveVectorFunc, params: dict) -> Algorithm:
     """
     Instantiates a evolution strategy to optimize the given objective function.
 
@@ -20,7 +20,7 @@ def evolution_strategy(objfunc: ObjectiveVectorFunc, params: dict) -> Search:
 
     Returns
     -------
-    algorithm: Search
+    algorithm: Algorithm
         Configured optimization algorithm.
     """
 
@@ -28,7 +28,7 @@ def evolution_strategy(objfunc: ObjectiveVectorFunc, params: dict) -> Search:
         raise ValueError(
             f'You must specify the encoding in the params structure, the options are "real", "int" and "bin"'
         )
-    
+
     encoding_str = params["encoding"]
 
     if encoding_str.lower() == "bin":
@@ -77,7 +77,7 @@ def _evolution_strategy_bin_vec(objfunc, params):
         {"offspringSize": offspring_size},
     )
 
-    return GeneralSearch(objfunc, search_strat, params=params)
+    return GeneralAlgorithm(objfunc, search_strat, params=params)
 
 
 def _evolution_strategy_int_vec(objfunc, params):
@@ -88,7 +88,6 @@ def _evolution_strategy_int_vec(objfunc, params):
 
     pop_size = params.get("pop_size", 100)
     offspring_size = params.get("offspring_size", 150)
-    n_parents = params.get("n_parents", 100)
     mutstr = params.get("mutstr", 1)
 
     pop_initializer = UniformVectorInitializer(
@@ -118,7 +117,7 @@ def _evolution_strategy_int_vec(objfunc, params):
         {"offspringSize": offspring_size},
     )
 
-    return GeneralSearch(objfunc, search_strat, params=params)
+    return GeneralAlgorithm(objfunc, search_strat, params=params)
 
 
 def _evolution_strategy_real_vec(objfunc, params):
@@ -129,7 +128,6 @@ def _evolution_strategy_real_vec(objfunc, params):
 
     pop_size = params.get("pop_size", 100)
     offspring_size = params.get("offspring_size", 150)
-    n_parents = params.get("n_parents", 100)
     mutstr = params.get("mutstr", 1e-5)
 
     pop_initializer = UniformVectorInitializer(
@@ -150,4 +148,4 @@ def _evolution_strategy_real_vec(objfunc, params):
         {"offspringSize": offspring_size},
     )
 
-    return GeneralSearch(objfunc, search_strat, params=params)
+    return GeneralAlgorithm(objfunc, search_strat, params=params)
diff --git a/src/metaheuristic_designer/simple/genetic_algorithm.py b/src/metaheuristic_designer/simple/genetic_algorithm.py
index dfe284b..4165b5f 100644
--- a/src/metaheuristic_designer/simple/genetic_algorithm.py
+++ b/src/metaheuristic_designer/simple/genetic_algorithm.py
@@ -3,11 +3,11 @@
 from ..operators import OperatorInt, OperatorReal, OperatorBinary
 from ..selectionMethods import SurvivorSelection, ParentSelection
 from ..encodings import TypeCastEncoding
-from ..algorithms import GA
-from ..searchMethods import GeneralSearch
+from ..strategies import GA
+from ..algorithms import GeneralAlgorithm
 
 
-def genetic_algorithm(objfunc: ObjectiveVectorFunc, params: dict) -> Search:
+def genetic_algorithm(objfunc: ObjectiveVectorFunc, params: dict) -> Algorithm:
     """
     Instantiates a genetic algorithm to optimize the given objective function.
 
@@ -20,7 +20,7 @@ def genetic_algorithm(objfunc: ObjectiveVectorFunc, params: dict) -> Search:
 
     Returns
     -------
-    algorithm: Search
+    algorithm: Algorithm
         Configured optimization algorithm.
     """
 
@@ -28,7 +28,7 @@ def genetic_algorithm(objfunc: ObjectiveVectorFunc, params: dict) -> Search:
         raise ValueError(
             f'You must specify the encoding in the params structure, the options are "real", "int" and "bin"'
         )
-    
+
     encoding_str = params["encoding"]
 
     if encoding_str.lower() == "bin":
@@ -79,7 +79,7 @@ def _genetic_algorithm_bin_vec(objfunc, params):
         {"pcross": pcross, "pmut": pmut},
     )
 
-    return GeneralSearch(objfunc, search_strat, params=params)
+    return GeneralAlgorithm(objfunc, search_strat, params=params)
 
 
 def _genetic_algorithm_int_vec(objfunc, params):
@@ -122,7 +122,7 @@ def _genetic_algorithm_int_vec(objfunc, params):
         {"pcross": pcross, "pmut": pmut},
     )
 
-    return GeneralSearch(objfunc, search_strat, params=params)
+    return GeneralAlgorithm(objfunc, search_strat, params=params)
 
 
 def _genetic_algorithm_real_vec(objfunc, params):
@@ -157,4 +157,4 @@ def _genetic_algorithm_real_vec(objfunc, params):
         {"pcross": pcross, "pmut": pmut},
     )
 
-    return GeneralSearch(objfunc, search_strat, params=params)
+    return GeneralAlgorithm(objfunc, search_strat, params=params)
diff --git a/src/metaheuristic_designer/simple/hill_climb.py b/src/metaheuristic_designer/simple/hill_climb.py
index 8be867d..49e7b17 100644
--- a/src/metaheuristic_designer/simple/hill_climb.py
+++ b/src/metaheuristic_designer/simple/hill_climb.py
@@ -1,12 +1,12 @@
 from __future__ import annotations
 from ..initializers import UniformVectorInitializer
 from ..operators import OperatorInt, OperatorReal, OperatorBinary
-from ..algorithms import HillClimb
 from ..encodings import TypeCastEncoding
-from ..searchMethods import GeneralSearch
+from ..strategies import HillClimb
+from ..algorithms import GeneralAlgorithm
 
 
-def hill_climb(objfunc: ObjectiveVectorFunc, params: dict) -> Search:
+def hill_climb(objfunc: ObjectiveVectorFunc, params: dict) -> Algorithm:
     """
     Instantiates a hill climbing algorithm to optimize the given objective function.
 
@@ -19,7 +19,7 @@ def hill_climb(objfunc: ObjectiveVectorFunc, params: dict) -> Search:
 
     Returns
     -------
-    algorithm: Search
+    algorithm: Algorithm
         Configured optimization algorithm.
     """
 
@@ -27,7 +27,7 @@ def hill_climb(objfunc: ObjectiveVectorFunc, params: dict) -> Search:
         raise ValueError(
             f'You must specify the encoding in the params structure, the options are "real", "int" and "bin"'
         )
-    
+
     encoding_str = params["encoding"]
 
     if encoding_str.lower() == "bin":
@@ -62,7 +62,7 @@ def _hill_climb_bin_vec(objfunc, params):
 
     search_strat = HillClimb(pop_initializer, mutation_op)
 
-    return GeneralSearch(objfunc, search_strat, params=params)
+    return GeneralAlgorithm(objfunc, search_strat, params=params)
 
 
 def _hill_climb_int_vec(objfunc, params):
@@ -89,7 +89,7 @@ def _hill_climb_int_vec(objfunc, params):
 
     search_strat = HillClimb(pop_initializer, mutation_op)
 
-    return GeneralSearch(objfunc, search_strat, params=params)
+    return GeneralAlgorithm(objfunc, search_strat, params=params)
 
 
 def _hill_climb_real_vec(objfunc, params):
@@ -108,4 +108,4 @@ def _hill_climb_real_vec(objfunc, params):
 
     search_strat = HillClimb(pop_initializer, mutation_op)
 
-    return GeneralSearch(objfunc, search_strat, params=params)
+    return GeneralAlgorithm(objfunc, search_strat, params=params)
diff --git a/src/metaheuristic_designer/simple/particle_swarm.py b/src/metaheuristic_designer/simple/particle_swarm.py
index 95f1513..c1f1f12 100644
--- a/src/metaheuristic_designer/simple/particle_swarm.py
+++ b/src/metaheuristic_designer/simple/particle_swarm.py
@@ -1,11 +1,11 @@
 from __future__ import annotations
 from ..initializers import UniformVectorInitializer
 from ..encodings import TypeCastEncoding
-from ..algorithms import PSO
-from ..searchMethods import GeneralSearch
+from ..strategies import PSO
+from ..algorithms import GeneralAlgorithm
 
 
-def particle_swarm(objfunc: ObjectiveVectorFunc, params: dict) -> Search:
+def particle_swarm(objfunc: ObjectiveVectorFunc, params: dict) -> Algorithm:
     """
     Instantiates a particle swarm algorithm to optimize the given objective function.
 
@@ -18,7 +18,7 @@ def particle_swarm(objfunc: ObjectiveVectorFunc, params: dict) -> Search:
 
     Returns
     -------
-    algorithm: Search
+    algorithm: Algorithm
         Configured optimization algorithm.
     """
 
@@ -26,7 +26,7 @@ def particle_swarm(objfunc: ObjectiveVectorFunc, params: dict) -> Search:
         raise ValueError(
             f'You must specify the encoding in the params structure, the options are "real", "int" and "bin"'
         )
-    
+
     encoding_str = params["encoding"]
 
     if encoding_str.lower() == "real":
@@ -60,7 +60,7 @@ def _particle_swarm_real_vec(objfunc, params):
 
     search_strat = PSO(pop_initializer, {"w": w, "c1": c1, "c2": c2})
 
-    return GeneralSearch(objfunc, search_strat, params=params)
+    return GeneralAlgorithm(objfunc, search_strat, params=params)
 
 
 def _particle_swarm_int_vec(objfunc, params):
@@ -87,7 +87,7 @@ def _particle_swarm_int_vec(objfunc, params):
 
     search_strat = PSO(pop_initializer, {"w": w, "c1": c1, "c2": c2})
 
-    return GeneralSearch(objfunc, search_strat, params=params)
+    return GeneralAlgorithm(objfunc, search_strat, params=params)
 
 
 def _particle_swarm_bin_vec(objfunc, params):
@@ -114,4 +114,4 @@ def _particle_swarm_bin_vec(objfunc, params):
 
     search_strat = PSO(pop_initializer, {"w": w, "c1": c1, "c2": c2})
 
-    return GeneralSearch(objfunc, search_strat, params=params)
+    return GeneralAlgorithm(objfunc, search_strat, params=params)
diff --git a/src/metaheuristic_designer/simple/random_search.py b/src/metaheuristic_designer/simple/random_search.py
index c657a4c..422e026 100644
--- a/src/metaheuristic_designer/simple/random_search.py
+++ b/src/metaheuristic_designer/simple/random_search.py
@@ -1,11 +1,11 @@
 from __future__ import annotations
 from ..initializers import UniformVectorInitializer
 from ..encodings import TypeCastEncoding
-from ..algorithms import RandomSearch
-from ..searchMethods import GeneralSearch
+from ..strategies import RandomSearch
+from ..algorithms import GeneralAlgorithm
 
 
-def random_search(objfunc: ObjectiveVectorFunc, params: dict) -> Search:
+def random_search(objfunc: ObjectiveVectorFunc, params: dict) -> Algorithm:
     """
     Instantiates a random search algorithm to optimize the given objective function.
 
@@ -18,7 +18,7 @@ def random_search(objfunc: ObjectiveVectorFunc, params: dict) -> Search:
 
     Returns
     -------
-    algorithm: Search
+    algorithm: Algorithm
         Configured optimization algorithm.
     """
 
@@ -26,7 +26,7 @@ def random_search(objfunc: ObjectiveVectorFunc, params: dict) -> Search:
         raise ValueError(
             f'You must specify the encoding in the params structure, the options are "real", "int" and "bin"'
         )
-    
+
     encoding_str = params["encoding"]
 
     if encoding_str.lower() == "bin":
@@ -57,7 +57,7 @@ def _random_search_bin_vec(objfunc, params):
 
     search_strat = RandomSearch(pop_initializer)
 
-    return GeneralSearch(objfunc, search_strat, params=params)
+    return GeneralAlgorithm(objfunc, search_strat, params=params)
 
 
 def _random_search_int_vec(objfunc, params):
@@ -72,7 +72,7 @@ def _random_search_int_vec(objfunc, params):
 
     search_strat = RandomSearch(pop_initializer)
 
-    return GeneralSearch(objfunc, search_strat, params=params)
+    return GeneralAlgorithm(objfunc, search_strat, params=params)
 
 
 def _random_search_real_vec(objfunc, params):
@@ -93,4 +93,4 @@ def _random_search_real_vec(objfunc, params):
 
     search_strat = RandomSearch(pop_initializer)
 
-    return GeneralSearch(objfunc, search_strat, params=params)
+    return GeneralAlgorithm(objfunc, search_strat, params=params)
diff --git a/src/metaheuristic_designer/simple/simulated_annealing.py b/src/metaheuristic_designer/simple/simulated_annealing.py
index 1d12dc9..10bc9f1 100644
--- a/src/metaheuristic_designer/simple/simulated_annealing.py
+++ b/src/metaheuristic_designer/simple/simulated_annealing.py
@@ -1,12 +1,12 @@
 from __future__ import annotations
 from ..initializers import UniformVectorInitializer
 from ..operators import OperatorInt, OperatorReal, OperatorBinary
-from ..algorithms import SA
 from ..encodings import TypeCastEncoding
-from ..searchMethods import GeneralSearch
+from ..strategies import SA
+from ..algorithms import GeneralAlgorithm
 
 
-def simulated_annealing(objfunc: ObjectiveVectorFunc, params: dict) -> Search:
+def simulated_annealing(objfunc: ObjectiveVectorFunc, params: dict) -> Algorithm:
     """
     Instantiates a simulated annealing algorithm to optimize the given objective function.
 
@@ -19,7 +19,7 @@ def simulated_annealing(objfunc: ObjectiveVectorFunc, params: dict) -> Search:
 
     Returns
     -------
-    algorithm: Search
+    algorithm: Algorithm
         Configured optimization algorithm.
     """
 
@@ -27,7 +27,7 @@ def simulated_annealing(objfunc: ObjectiveVectorFunc, params: dict) -> Search:
         raise ValueError(
             f'You must specify the encoding in the params structure, the options are "real", "int" and "bin"'
         )
-    
+
     encoding_str = params["encoding"]
 
     if encoding_str.lower() == "bin":
@@ -69,7 +69,7 @@ def _simulated_annealing_bin_vec(objfunc, params):
         {"iter": n_iter, "temp_init": temp_init, "alpha": alpha},
     )
 
-    return GeneralSearch(objfunc, search_strat, params=params)
+    return GeneralAlgorithm(objfunc, search_strat, params=params)
 
 
 def _simulated_annealing_int_vec(objfunc, params):
@@ -103,7 +103,7 @@ def _simulated_annealing_int_vec(objfunc, params):
         {"iter": n_iter, "temp_init": temp_init, "alpha": alpha},
     )
 
-    return GeneralSearch(objfunc, search_strat, params=params)
+    return GeneralAlgorithm(objfunc, search_strat, params=params)
 
 
 def _simulated_annealing_real_vec(objfunc, params):
@@ -129,4 +129,4 @@ def _simulated_annealing_real_vec(objfunc, params):
         {"iter": n_iter, "temp_init": temp_init, "alpha": alpha},
     )
 
-    return GeneralSearch(objfunc, search_strat, params=params)
+    return GeneralAlgorithm(objfunc, search_strat, params=params)
diff --git a/src/metaheuristic_designer/algorithms/CRO/CRO.py b/src/metaheuristic_designer/strategies/CRO/CRO.py
similarity index 77%
rename from src/metaheuristic_designer/algorithms/CRO/CRO.py
rename to src/metaheuristic_designer/strategies/CRO/CRO.py
index 9d2bf58..3b730ec 100644
--- a/src/metaheuristic_designer/algorithms/CRO/CRO.py
+++ b/src/metaheuristic_designer/strategies/CRO/CRO.py
@@ -1,14 +1,10 @@
 from __future__ import annotations
-import numpy as np
-import random
-from typing import Union, List
-from copy import copy, deepcopy
-from ...Individual import Individual
-from ...operators import OperatorReal, OperatorMeta
-from ...selectionMethods import SurvivorSelection, ParentSelection
+from typing import Union
+from copy import deepcopy
+from ...operators import OperatorMeta
+from ...selectionMethods import SurvivorSelection
 from ..StaticPopulation import StaticPopulation
 from ...ParamScheduler import ParamScheduler
-from ...Algorithm import Algorithm
 
 
 class CRO(StaticPopulation):
diff --git a/src/metaheuristic_designer/algorithms/CRO/CRO_SL.py b/src/metaheuristic_designer/strategies/CRO/CRO_SL.py
similarity index 87%
rename from src/metaheuristic_designer/algorithms/CRO/CRO_SL.py
rename to src/metaheuristic_designer/strategies/CRO/CRO_SL.py
index e00eeae..2fa6a8c 100644
--- a/src/metaheuristic_designer/algorithms/CRO/CRO_SL.py
+++ b/src/metaheuristic_designer/strategies/CRO/CRO_SL.py
@@ -1,18 +1,13 @@
 from __future__ import annotations
-import numpy as np
-import random
 from typing import Union, List
-from copy import copy, deepcopy
-from ...Individual import Individual
-from ...operators import OperatorReal, OperatorMeta
-from ...selectionMethods import SurvivorSelection, ParentSelection
-from ..StaticPopulation import StaticPopulation
+from copy import deepcopy
+from ...selectionMethods import SurvivorSelection
 from ...ParamScheduler import ParamScheduler
-from ...Algorithm import Algorithm
+from ...SearchStrategy import SearchStrategy
 from ...Operator import Operator
 
 
-class CRO_SL(Algorithm):
+class CRO_SL(SearchStrategy):
     """
     Coral Reef Optimization with Substrate Layers
     """
diff --git a/src/metaheuristic_designer/algorithms/CRO/DPCRO_SL.py b/src/metaheuristic_designer/strategies/CRO/DPCRO_SL.py
similarity index 96%
rename from src/metaheuristic_designer/algorithms/CRO/DPCRO_SL.py
rename to src/metaheuristic_designer/strategies/CRO/DPCRO_SL.py
index 9ecca4c..eda470d 100644
--- a/src/metaheuristic_designer/algorithms/CRO/DPCRO_SL.py
+++ b/src/metaheuristic_designer/strategies/CRO/DPCRO_SL.py
@@ -1,14 +1,8 @@
 from __future__ import annotations
-import numpy as np
 import random
 from typing import Union, List
-from copy import copy, deepcopy
-from ...Individual import Individual
-from ...operators import OperatorReal, OperatorMeta
-from ...selectionMethods import SurvivorSelection, ParentSelection
-from ..StaticPopulation import StaticPopulation
+import numpy as np
 from ...ParamScheduler import ParamScheduler
-from ...Algorithm import Algorithm
 from .CRO_SL import CRO_SL
 
 
@@ -115,7 +109,7 @@ def update_params(self, **kwargs):
         super().update_params(progress=progress)
 
     def extra_step_info(self):
-        print(f"\n\tSubstrate probability:")
+        print("\n\tSubstrate probability:")
         op_names = [i.name for i in self.operator_list]
         weights = [round(i, 6) for i in self.operator_weight]
         adjust = max([len(i) for i in op_names])
diff --git a/src/metaheuristic_designer/algorithms/CRO/PCRO_SL.py b/src/metaheuristic_designer/strategies/CRO/PCRO_SL.py
similarity index 79%
rename from src/metaheuristic_designer/algorithms/CRO/PCRO_SL.py
rename to src/metaheuristic_designer/strategies/CRO/PCRO_SL.py
index 7fa4d62..c7ffdab 100644
--- a/src/metaheuristic_designer/algorithms/CRO/PCRO_SL.py
+++ b/src/metaheuristic_designer/strategies/CRO/PCRO_SL.py
@@ -1,14 +1,7 @@
 from __future__ import annotations
-import numpy as np
-import random
 from typing import Union, List
-from copy import copy, deepcopy
-from ...Individual import Individual
-from ...operators import OperatorReal, OperatorMeta
-from ...selectionMethods import SurvivorSelection, ParentSelection
-from ..StaticPopulation import StaticPopulation
+import random
 from ...ParamScheduler import ParamScheduler
-from ...Algorithm import Algorithm
 from .CRO_SL import CRO_SL
 
 
diff --git a/src/metaheuristic_designer/algorithms/CRO/__init__.py b/src/metaheuristic_designer/strategies/CRO/__init__.py
similarity index 100%
rename from src/metaheuristic_designer/algorithms/CRO/__init__.py
rename to src/metaheuristic_designer/strategies/CRO/__init__.py
diff --git a/src/metaheuristic_designer/algorithms/Classic/CMA_ES.py b/src/metaheuristic_designer/strategies/Classic/CMA_ES.py
similarity index 100%
rename from src/metaheuristic_designer/algorithms/Classic/CMA_ES.py
rename to src/metaheuristic_designer/strategies/Classic/CMA_ES.py
diff --git a/src/metaheuristic_designer/algorithms/Classic/DE.py b/src/metaheuristic_designer/strategies/Classic/DE.py
similarity index 95%
rename from src/metaheuristic_designer/algorithms/Classic/DE.py
rename to src/metaheuristic_designer/strategies/Classic/DE.py
index c425f8f..09cac9e 100644
--- a/src/metaheuristic_designer/algorithms/Classic/DE.py
+++ b/src/metaheuristic_designer/strategies/Classic/DE.py
@@ -1,5 +1,5 @@
 from __future__ import annotations
-from typing import Union, List
+from typing import Union
 from ...selectionMethods import SurvivorSelection
 from ..StaticPopulation import StaticPopulation
 
diff --git a/src/metaheuristic_designer/algorithms/Classic/ES.py b/src/metaheuristic_designer/strategies/Classic/ES.py
similarity index 96%
rename from src/metaheuristic_designer/algorithms/Classic/ES.py
rename to src/metaheuristic_designer/strategies/Classic/ES.py
index 4269b29..944aaf1 100644
--- a/src/metaheuristic_designer/algorithms/Classic/ES.py
+++ b/src/metaheuristic_designer/strategies/Classic/ES.py
@@ -1,5 +1,5 @@
 from __future__ import annotations
-from typing import Union, List
+from typing import Union
 from ...operators import OperatorMeta
 from ..VariablePopulation import VariablePopulation
 
diff --git a/src/metaheuristic_designer/algorithms/Classic/GA.py b/src/metaheuristic_designer/strategies/Classic/GA.py
similarity index 97%
rename from src/metaheuristic_designer/algorithms/Classic/GA.py
rename to src/metaheuristic_designer/strategies/Classic/GA.py
index 870f84a..49dac4f 100644
--- a/src/metaheuristic_designer/algorithms/Classic/GA.py
+++ b/src/metaheuristic_designer/strategies/Classic/GA.py
@@ -1,6 +1,6 @@
 from __future__ import annotations
+from typing import Union
 import numpy as np
-from typing import Union, List
 from ...operators import OperatorReal, OperatorMeta
 from ..VariablePopulation import VariablePopulation
 
diff --git a/src/metaheuristic_designer/algorithms/Classic/HS.py b/src/metaheuristic_designer/strategies/Classic/HS.py
similarity index 97%
rename from src/metaheuristic_designer/algorithms/Classic/HS.py
rename to src/metaheuristic_designer/strategies/Classic/HS.py
index bc67075..79a845b 100644
--- a/src/metaheuristic_designer/algorithms/Classic/HS.py
+++ b/src/metaheuristic_designer/strategies/Classic/HS.py
@@ -1,5 +1,5 @@
 from __future__ import annotations
-from typing import Union, List
+from typing import Union
 from ...operators import OperatorReal, OperatorMeta
 from ...selectionMethods import SurvivorSelection, ParentSelection
 from ..VariablePopulation import VariablePopulation
diff --git a/src/metaheuristic_designer/algorithms/Classic/PSO.py b/src/metaheuristic_designer/strategies/Classic/PSO.py
similarity index 97%
rename from src/metaheuristic_designer/algorithms/Classic/PSO.py
rename to src/metaheuristic_designer/strategies/Classic/PSO.py
index b8fb36d..a47674f 100644
--- a/src/metaheuristic_designer/algorithms/Classic/PSO.py
+++ b/src/metaheuristic_designer/strategies/Classic/PSO.py
@@ -1,6 +1,6 @@
 from __future__ import annotations
 import numpy as np
-from typing import Union, List
+from typing import Union
 from ...operators import OperatorReal
 from ...selectionMethods import SurvivorSelection
 from ..StaticPopulation import StaticPopulation
diff --git a/src/metaheuristic_designer/algorithms/Classic/RandomSearch.py b/src/metaheuristic_designer/strategies/Classic/RandomSearch.py
similarity index 77%
rename from src/metaheuristic_designer/algorithms/Classic/RandomSearch.py
rename to src/metaheuristic_designer/strategies/Classic/RandomSearch.py
index 96ccb43..8fe32ef 100644
--- a/src/metaheuristic_designer/algorithms/Classic/RandomSearch.py
+++ b/src/metaheuristic_designer/strategies/Classic/RandomSearch.py
@@ -1,6 +1,5 @@
 from __future__ import annotations
-from typing import Union, List
-from ...operators import OperatorReal, OperatorMeta
+from ...operators import OperatorReal
 from ..HillClimb import HillClimb
 
 
diff --git a/src/metaheuristic_designer/algorithms/Classic/SA.py b/src/metaheuristic_designer/strategies/Classic/SA.py
similarity index 93%
rename from src/metaheuristic_designer/algorithms/Classic/SA.py
rename to src/metaheuristic_designer/strategies/Classic/SA.py
index 4bb13a3..73befb9 100644
--- a/src/metaheuristic_designer/algorithms/Classic/SA.py
+++ b/src/metaheuristic_designer/strategies/Classic/SA.py
@@ -1,14 +1,13 @@
 from __future__ import annotations
+from typing import Union
 import random
 import numpy as np
-from typing import Union
 from ...ParamScheduler import ParamScheduler
-from ...Algorithm import Algorithm
+from ...SearchStrategy import SearchStrategy
 from ...Operator import Operator
-from ..HillClimb import HillClimb
 
 
-class SA(Algorithm):
+class SA(SearchStrategy):
     """
     Simulated annealing
     """
@@ -31,7 +30,7 @@ def __init__(
 
     def perturb(self, indiv_list, objfunc, **kwargs):
         indiv = indiv_list[0]
-        for j in range(self.iter):
+        for _ in range(self.iter):
             new_indiv = self.perturb_op(
                 indiv, indiv_list, objfunc, self.best, self.pop_init
             )
diff --git a/src/metaheuristic_designer/algorithms/Classic/__init__.py b/src/metaheuristic_designer/strategies/Classic/__init__.py
similarity index 100%
rename from src/metaheuristic_designer/algorithms/Classic/__init__.py
rename to src/metaheuristic_designer/strategies/Classic/__init__.py
diff --git a/src/metaheuristic_designer/algorithms/HillClimb.py b/src/metaheuristic_designer/strategies/HillClimb.py
similarity index 94%
rename from src/metaheuristic_designer/algorithms/HillClimb.py
rename to src/metaheuristic_designer/strategies/HillClimb.py
index 245bb8c..908f07e 100644
--- a/src/metaheuristic_designer/algorithms/HillClimb.py
+++ b/src/metaheuristic_designer/strategies/HillClimb.py
@@ -2,13 +2,13 @@
 from typing import Union
 from copy import copy
 from ..ParamScheduler import ParamScheduler
-from ..Algorithm import Algorithm
+from ..SearchStrategy import SearchStrategy
 from ..Operator import Operator
 from ..operators import OperatorReal
 from ..selectionMethods import SurvivorSelection
 
 
-class HillClimb(Algorithm):
+class HillClimb(SearchStrategy):
     """
     Hill Climbing algorithm
     """
@@ -35,7 +35,7 @@ def __init__(
 
     def perturb(self, indiv_list, objfunc, **kwargs):
         next_indiv_list = copy(indiv_list)
-        for i in range(self.iterations):
+        for _ in range(self.iterations):
             offspring = []
             for indiv in next_indiv_list:
                 # Perturb individual
diff --git a/src/metaheuristic_designer/algorithms/LocalSearch.py b/src/metaheuristic_designer/strategies/LocalSearch.py
similarity index 93%
rename from src/metaheuristic_designer/algorithms/LocalSearch.py
rename to src/metaheuristic_designer/strategies/LocalSearch.py
index de699fe..4f0dd3a 100644
--- a/src/metaheuristic_designer/algorithms/LocalSearch.py
+++ b/src/metaheuristic_designer/strategies/LocalSearch.py
@@ -2,13 +2,13 @@
 from typing import Union
 from copy import copy
 from ..ParamScheduler import ParamScheduler
-from ..Algorithm import Algorithm
+from ..SearchStrategy import SearchStrategy
 from ..Operator import Operator
 from ..operators import OperatorReal
 from ..selectionMethods import SurvivorSelection
 
 
-class LocalSearch(Algorithm):
+class LocalSearch(SearchStrategy):
     """
     Local search algorithm
     """
@@ -35,7 +35,7 @@ def __init__(
 
     def perturb(self, indiv_list, objfunc, **kwargs):
         next_indiv_list = copy(indiv_list)
-        for i in range(self.iterations):
+        for _ in range(self.iterations):
             offspring = []
             for indiv in indiv_list:
                 # Perturb individual
diff --git a/src/metaheuristic_designer/algorithms/NoSearch.py b/src/metaheuristic_designer/strategies/NoSearch.py
similarity index 80%
rename from src/metaheuristic_designer/algorithms/NoSearch.py
rename to src/metaheuristic_designer/strategies/NoSearch.py
index c073bc9..b6c8b08 100644
--- a/src/metaheuristic_designer/algorithms/NoSearch.py
+++ b/src/metaheuristic_designer/strategies/NoSearch.py
@@ -1,8 +1,8 @@
 from __future__ import annotations
-from ..Algorithm import Algorithm
+from ..SearchStrategy import SearchStrategy
 
 
-class NoSearch(Algorithm):
+class NoSearch(SearchStrategy):
     """
     Debug Algorithm that does nothing
     """
diff --git a/src/metaheuristic_designer/algorithms/StaticPopulation.py b/src/metaheuristic_designer/strategies/StaticPopulation.py
similarity index 96%
rename from src/metaheuristic_designer/algorithms/StaticPopulation.py
rename to src/metaheuristic_designer/strategies/StaticPopulation.py
index 63376cf..632b0b7 100644
--- a/src/metaheuristic_designer/algorithms/StaticPopulation.py
+++ b/src/metaheuristic_designer/strategies/StaticPopulation.py
@@ -1,11 +1,11 @@
 from __future__ import annotations
 from ..ParamScheduler import ParamScheduler
 from ..selectionMethods import SurvivorSelection, ParentSelection
-from ..Algorithm import Algorithm
+from ..SearchStrategy import SearchStrategy
 from ..Operator import Operator
 
 
-class StaticPopulation(Algorithm):
+class StaticPopulation(SearchStrategy):
     """
     Population-based algorithm where each individual is iteratively evolved with a given operator
     """
diff --git a/src/metaheuristic_designer/algorithms/VNS/RVNS.py b/src/metaheuristic_designer/strategies/VNS/RVNS.py
similarity index 96%
rename from src/metaheuristic_designer/algorithms/VNS/RVNS.py
rename to src/metaheuristic_designer/strategies/VNS/RVNS.py
index ae371bc..2472f61 100644
--- a/src/metaheuristic_designer/algorithms/VNS/RVNS.py
+++ b/src/metaheuristic_designer/strategies/VNS/RVNS.py
@@ -1,16 +1,14 @@
 from __future__ import annotations
 from typing import Union
-from copy import copy
 import warnings
 from ...ParamScheduler import ParamScheduler
-from ...Algorithm import Algorithm
+from ...SearchStrategy import SearchStrategy
 from ...Operator import Operator
 from ...operators import OperatorMeta
 from ...selectionMethods import SurvivorSelection
-import time
 
 
-class RVNS(Algorithm):
+class RVNS(SearchStrategy):
     """
     Reduced Variable Neighborhood Search
 
diff --git a/src/metaheuristic_designer/algorithms/VNS/VND.py b/src/metaheuristic_designer/strategies/VNS/VND.py
similarity index 96%
rename from src/metaheuristic_designer/algorithms/VNS/VND.py
rename to src/metaheuristic_designer/strategies/VNS/VND.py
index 30a838d..90884e9 100644
--- a/src/metaheuristic_designer/algorithms/VNS/VND.py
+++ b/src/metaheuristic_designer/strategies/VNS/VND.py
@@ -3,15 +3,14 @@
 from copy import copy
 import warnings
 from ...ParamScheduler import ParamScheduler
-from ...Algorithm import Algorithm
+from ...SearchStrategy import SearchStrategy
 from ...Operator import Operator
 from ...operators import OperatorMeta
 from ...selectionMethods import SurvivorSelection
 from .vns_neighborhood_changes import *
-import time
 
 
-class VND(Algorithm):
+class VND(SearchStrategy):
     """
     Variable Neighborhood Descent
 
@@ -57,7 +56,7 @@ def __init__(
 
     def perturb(self, indiv_list, objfunc, **kwargs):
         next_indiv_list = copy(indiv_list)
-        for i in range(self.iterations):
+        for _ in range(self.iterations):
             offspring = []
             for indiv in indiv_list:
                 # Perturb individual
diff --git a/src/metaheuristic_designer/algorithms/VNS/VNS.py b/src/metaheuristic_designer/strategies/VNS/VNS.py
similarity index 88%
rename from src/metaheuristic_designer/algorithms/VNS/VNS.py
rename to src/metaheuristic_designer/strategies/VNS/VNS.py
index 5672811..33833c7 100644
--- a/src/metaheuristic_designer/algorithms/VNS/VNS.py
+++ b/src/metaheuristic_designer/strategies/VNS/VNS.py
@@ -1,16 +1,15 @@
 from __future__ import annotations
 from typing import Union
-from copy import copy
 import warnings
 from ...ParamScheduler import ParamScheduler
-from ...Algorithm import Algorithm
+from ...SearchStrategy import SearchStrategy
 from ...Operator import Operator
 from ...operators import OperatorMeta
 from ...selectionMethods import SurvivorSelection
 from .vns_neighborhood_changes import *
 
 
-class VNS(Algorithm):
+class VNS(SearchStrategy):
     """
     Variable neighborhood search
     """
@@ -19,7 +18,7 @@ def __init__(
         self,
         pop_init: Initializer,
         op_list: List[Operator],
-        local_search=Algorithm,
+        local_search: Algorithm,
         selection_op: SurvivorSelection = None,
         params: Union[ParamScheduler, dict] = {},
         name: str = "VNS",
@@ -67,16 +66,12 @@ def perturb(self, indiv_list, objfunc, **kwargs):
             population = [new_indiv]
             self.local_search.perturb_op = self.perturb_op
             for _ in range(self.iterations):
-                parents, _ = self.local_search.select_parents(
-                    population, progress, history
-                )
+                parents, _ = self.local_search.select_parents(population, kwargs)
 
-                offspring = self.local_search.perturb(
-                    parents, objfunc, progress, history
-                )
+                offspring = self.local_search.perturb(parents, objfunc, kwargs)
 
                 population = self.local_search.select_individuals(
-                    population, offspring, progress, history
+                    population, offspring, kwargs
                 )
 
                 self.local_search.update_params()
diff --git a/src/metaheuristic_designer/algorithms/VNS/__init__.py b/src/metaheuristic_designer/strategies/VNS/__init__.py
similarity index 100%
rename from src/metaheuristic_designer/algorithms/VNS/__init__.py
rename to src/metaheuristic_designer/strategies/VNS/__init__.py
diff --git a/src/metaheuristic_designer/algorithms/VNS/vns_neighborhood_changes.py b/src/metaheuristic_designer/strategies/VNS/vns_neighborhood_changes.py
similarity index 100%
rename from src/metaheuristic_designer/algorithms/VNS/vns_neighborhood_changes.py
rename to src/metaheuristic_designer/strategies/VNS/vns_neighborhood_changes.py
diff --git a/src/metaheuristic_designer/algorithms/VariablePopulation.py b/src/metaheuristic_designer/strategies/VariablePopulation.py
similarity index 91%
rename from src/metaheuristic_designer/algorithms/VariablePopulation.py
rename to src/metaheuristic_designer/strategies/VariablePopulation.py
index 2fd567c..8da8d23 100644
--- a/src/metaheuristic_designer/algorithms/VariablePopulation.py
+++ b/src/metaheuristic_designer/strategies/VariablePopulation.py
@@ -1,14 +1,14 @@
 from __future__ import annotations
+import random
 from ..ParamScheduler import ParamScheduler
 from ..selectionMethods import SurvivorSelection, ParentSelection
-from ..Algorithm import Algorithm
+from ..SearchStrategy import SearchStrategy
 from ..Operator import Operator
-import random
 
 
-class VariablePopulation(Algorithm):
+class VariablePopulation(SearchStrategy):
     """
-    Population-based optimization algorithm where the number of individuals generated is different from the size of the population
+    Population-based optimization strategy where the number of individuals generated is different from the size of the population
     """
 
     def __init__(
diff --git a/src/metaheuristic_designer/strategies/__init__.py b/src/metaheuristic_designer/strategies/__init__.py
new file mode 100644
index 0000000..45603b0
--- /dev/null
+++ b/src/metaheuristic_designer/strategies/__init__.py
@@ -0,0 +1,11 @@
+from .HillClimb import HillClimb
+from .LocalSearch import LocalSearch
+
+from .StaticPopulation import StaticPopulation
+from .VariablePopulation import VariablePopulation
+
+from .NoSearch import NoSearch
+
+from .Classic import *
+from .CRO import *
+from .VNS import *
diff --git a/tutorials/complete_tutorial.ipynb b/tutorials/complete_tutorial.ipynb
index 36454ea..ae9fa54 100644
--- a/tutorials/complete_tutorial.ipynb
+++ b/tutorials/complete_tutorial.ipynb
@@ -703,7 +703,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.11.5"
+   "version": "3.11.4"
   },
   "orig_nbformat": 4
  },
diff --git a/tutorials/create_algorithm.ipynb b/tutorials/create_algorithm.ipynb
deleted file mode 100644
index c0f25c1..0000000
--- a/tutorials/create_algorithm.ipynb
+++ /dev/null
@@ -1,622 +0,0 @@
-{
- "cells": [
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "# Creating an algorithm"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "In this notebook, we are going to explain how to implement a new optimization algorithm using the metaheuristic-designer framework.\n",
-    "\n",
-    "For this example, we are going to implement a basic evolutionary strategy."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 15,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "import random\n",
-    "import metaheuristic_designer as mhd\n",
-    "from metaheuristic_designer import GeneralSearch\n",
-    "from metaheuristic_designer.selectionMethods import SurvivorSelection, ParentSelection\n",
-    "from metaheuristic_designer.operators import OperatorReal\n",
-    "from metaheuristic_designer.initializers import UniformVectorInitializer\n",
-    "from metaheuristic_designer.benchmarks import Sphere"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "For simplicity, we will assume we are working with real coded vectors.\n",
-    "\n",
-    "We will also predefine the operators, but in real situations it might be wiser to let the user specify the user they want to use.\n",
-    "\n",
-    "To configure our evolution strategy, we will need to specify the number of parents and offpring in each generation.\n",
-    "The operator will be a gaussian mutation, it will have a standard deviation associated which will be another parameter.\n",
-    "\n",
-    "To create the algorithm, we will make a class that inherits from ```Algorithm``` and will implement its methods.\n",
-    "\n",
-    "In this case we will implement the ```select_parents``` method that chooses the individuals to be chosen for mutation, the ```perturb``` method that will perform a mutation on the selected indivuals, the ```select_individuals``` that will choose the individuals that will remain for the next generation.\n",
-    "\n",
-    "Here, we will make extensive use of already implemented components, like ```ParentSelection```, ```SurvivorSelection```, ```Operator```, but you can provide your own implementation of those, which will be explained in different notebooks."
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "The ```Algorithm``` class has some attributes that must be used for the \n",
-    "algorithm to work correctly.\n",
-    "\n",
-    "The algorithm will have a ```name```, if unspecified, a default name will be chosen. This is the name of the algorithm showed in logs.\n",
-    "\n",
-    "A population initialization module ```pop_init``` must be present to perform the initialization of the algorithm (an explanation will be present in its respective notebook). It will also specify the size of the initialized population.\n",
-    "\n",
-    "The algorithm has a list of individuals called ```population``` which holds. It is a standard python list with variable size.\n",
-    "\n",
-    "We also have a ```best``` attribute that holds the best individual in each generation.\n",
-    "\n",
-    "You can optionally store the parameters of the algorithm in a dictionary or an instance of ```ParamScheduler``` in the attribute ```params```. It is recomended to use the latter because it allows parameters to change over time. We will not worry about this in this example.\n",
-    "\n",
-    "All of these attributes are generated on the ```__init__``` method of the ```Algorithm``` class."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 16,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "# ES algorithm class\n",
-    "class BasicES(mhd.Algorithm):\n",
-    "    # Class constructor\n",
-    "    def __init__(self, pop_init, parent_size, offspring_size, sigma):\n",
-    "        self.parent_size = parent_size\n",
-    "        self.offspring_size = offspring_size\n",
-    "\n",
-    "        # Create the mutation operator for use later\n",
-    "        self.mutate_op = OperatorReal(\n",
-    "            \"MutRand\", {\"method\": \"Gauss\", \"F\": sigma, \"N\": 1}\n",
-    "        )\n",
-    "\n",
-    "        # Force pop_init to agree with the population size, this is not mandatory.\n",
-    "        pop_init.pop_size = parent_size\n",
-    "\n",
-    "        # Create the parent selection module, select the best half of the parents\n",
-    "        self.parent_sel_op = ParentSelection(\"Best\", {\"amount\": parent_size // 2})\n",
-    "\n",
-    "        # Create the parent selection module, select the best half of the parents\n",
-    "        self.surv_sel_op = SurvivorSelection(\"keepbest\", {\"amount\": parent_size})\n",
-    "\n",
-    "        super().__init__(pop_init, name=\"Basic ES\")\n",
-    "\n",
-    "    # This method receives the population from the previous generation\n",
-    "    # and some extra information (that we don't need here) and returns\n",
-    "    # a list of selected individuals.\n",
-    "    def select_parents(self, population, **kwargs):\n",
-    "        return self.parent_sel_op(population)\n",
-    "\n",
-    "    # This method receives the parents that we are going to mutate,\n",
-    "    # the objective function class and some extra information that we\n",
-    "    # are not going to use.\n",
-    "    def perturb(self, parent_list, objfunc, **kwargs):\n",
-    "        offspring = []\n",
-    "\n",
-    "        # Iterate until the list of individuals has the\n",
-    "        # size we want.\n",
-    "        while len(offspring) < self.offspring_size:\n",
-    "            # Choose an individual from the parent list.\n",
-    "            indiv = random.choice(parent_list)\n",
-    "\n",
-    "            # Apply the operator.\n",
-    "            new_indiv = self.mutate_op(\n",
-    "                indiv, parent_list, objfunc, self.best, self.pop_init\n",
-    "            )\n",
-    "\n",
-    "            # Repair the solution to keep the vector within the bounds\n",
-    "            # of the problem.\n",
-    "            new_indiv.genotype = objfunc.repair_solution(new_indiv.genotype)\n",
-    "\n",
-    "            # Add the individual to the offspring list.\n",
-    "            offspring.append(new_indiv)\n",
-    "\n",
-    "        # Update the best solution\n",
-    "        current_best = max(offspring, key=lambda x: x.fitness)\n",
-    "        if self.best.fitness < current_best.fitness:\n",
-    "            self.best = current_best\n",
-    "\n",
-    "        return offspring\n",
-    "\n",
-    "    # This method selects the individuals that will be chosen for the next\n",
-    "    # generation, it gets the original population along with the newly\n",
-    "    # generated individuals.\n",
-    "    def select_individuals(self, prev_population, offspring, **kwargs):\n",
-    "        return self.surv_sel_op(prev_population, offspring)"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "To begin with the optimization we need one more component, the ```SearchMethod```. This is mostly the same for all algorithms, so it is recomended that you use the already implemented ```GeneralSearch``` class for this purpose unless you REALLY need something different. If this is the case, you have a ```Search``` base class available that you can inherit from.\n",
-    "\n",
-    "We will be using one of the benchmark functions already implemented in this framework that consist on adding the square of the vector components."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 17,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Initializing optimization of Sphere function using Basic ES\n",
-      "-----------------------------------------------------------\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 0.0 s\n",
-      "\tCPU time Spent:  0.0 s\n",
-      "\tGeneration: 0\n",
-      "\tBest fitness: 474.26900015044083\n",
-      "\tEvaluations of fitness: 50\n",
-      "\n"
-     ]
-    },
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 2.0 s\n",
-      "\tCPU time Spent:  2.0 s\n",
-      "\tGeneration: 522\n",
-      "\tBest fitness: 445.6753418571568\n",
-      "\tEvaluations of fitness: 130550\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 4.0 s\n",
-      "\tCPU time Spent:  4.0 s\n",
-      "\tGeneration: 1036\n",
-      "\tBest fitness: 418.89163192004537\n",
-      "\tEvaluations of fitness: 259050\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 6.0 s\n",
-      "\tCPU time Spent:  6.0 s\n",
-      "\tGeneration: 1557\n",
-      "\tBest fitness: 392.8736899354275\n",
-      "\tEvaluations of fitness: 389300\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 8.01 s\n",
-      "\tCPU time Spent:  8.01 s\n",
-      "\tGeneration: 2073\n",
-      "\tBest fitness: 367.91964310765144\n",
-      "\tEvaluations of fitness: 518300\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 10.01 s\n",
-      "\tCPU time Spent:  10.01 s\n",
-      "\tGeneration: 2587\n",
-      "\tBest fitness: 344.0850492752297\n",
-      "\tEvaluations of fitness: 646800\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 12.01 s\n",
-      "\tCPU time Spent:  12.01 s\n",
-      "\tGeneration: 3086\n",
-      "\tBest fitness: 321.77287522907795\n",
-      "\tEvaluations of fitness: 771550\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 14.01 s\n",
-      "\tCPU time Spent:  14.01 s\n",
-      "\tGeneration: 3605\n",
-      "\tBest fitness: 299.4967622962263\n",
-      "\tEvaluations of fitness: 901300\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 16.01 s\n",
-      "\tCPU time Spent:  16.01 s\n",
-      "\tGeneration: 4112\n",
-      "\tBest fitness: 278.45527333944773\n",
-      "\tEvaluations of fitness: 1028050\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 18.02 s\n",
-      "\tCPU time Spent:  18.02 s\n",
-      "\tGeneration: 4631\n",
-      "\tBest fitness: 258.0268992956653\n",
-      "\tEvaluations of fitness: 1157800\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 20.02 s\n",
-      "\tCPU time Spent:  20.02 s\n",
-      "\tGeneration: 5147\n",
-      "\tBest fitness: 238.55865505316766\n",
-      "\tEvaluations of fitness: 1286800\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 22.02 s\n",
-      "\tCPU time Spent:  22.02 s\n",
-      "\tGeneration: 5657\n",
-      "\tBest fitness: 220.09785758580568\n",
-      "\tEvaluations of fitness: 1414300\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 24.02 s\n",
-      "\tCPU time Spent:  24.02 s\n",
-      "\tGeneration: 6155\n",
-      "\tBest fitness: 202.67605451430904\n",
-      "\tEvaluations of fitness: 1538800\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 26.02 s\n",
-      "\tCPU time Spent:  26.02 s\n",
-      "\tGeneration: 6650\n",
-      "\tBest fitness: 186.28377520391257\n",
-      "\tEvaluations of fitness: 1662550\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 28.03 s\n",
-      "\tCPU time Spent:  28.03 s\n",
-      "\tGeneration: 7161\n",
-      "\tBest fitness: 170.15562402287517\n",
-      "\tEvaluations of fitness: 1790300\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 30.03 s\n",
-      "\tCPU time Spent:  30.03 s\n",
-      "\tGeneration: 7655\n",
-      "\tBest fitness: 155.38952680822632\n",
-      "\tEvaluations of fitness: 1913800\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 32.03 s\n",
-      "\tCPU time Spent:  32.03 s\n",
-      "\tGeneration: 8171\n",
-      "\tBest fitness: 140.6143770091562\n",
-      "\tEvaluations of fitness: 2042800\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 34.03 s\n",
-      "\tCPU time Spent:  34.03 s\n",
-      "\tGeneration: 8690\n",
-      "\tBest fitness: 126.68228254171893\n",
-      "\tEvaluations of fitness: 2172550\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 36.04 s\n",
-      "\tCPU time Spent:  36.04 s\n",
-      "\tGeneration: 9215\n",
-      "\tBest fitness: 113.36831450203461\n",
-      "\tEvaluations of fitness: 2303800\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 38.04 s\n",
-      "\tCPU time Spent:  38.04 s\n",
-      "\tGeneration: 9731\n",
-      "\tBest fitness: 101.10213882406848\n",
-      "\tEvaluations of fitness: 2432800\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 40.04 s\n",
-      "\tCPU time Spent:  40.04 s\n",
-      "\tGeneration: 10250\n",
-      "\tBest fitness: 89.42460275114755\n",
-      "\tEvaluations of fitness: 2562550\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 42.04 s\n",
-      "\tCPU time Spent:  42.04 s\n",
-      "\tGeneration: 10764\n",
-      "\tBest fitness: 78.50760053778954\n",
-      "\tEvaluations of fitness: 2691050\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 44.04 s\n",
-      "\tCPU time Spent:  44.04 s\n",
-      "\tGeneration: 11280\n",
-      "\tBest fitness: 68.37978185973749\n",
-      "\tEvaluations of fitness: 2820050\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 46.05 s\n",
-      "\tCPU time Spent:  46.05 s\n",
-      "\tGeneration: 11794\n",
-      "\tBest fitness: 58.99786004781749\n",
-      "\tEvaluations of fitness: 2948550\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 48.05 s\n",
-      "\tCPU time Spent:  48.05 s\n",
-      "\tGeneration: 12298\n",
-      "\tBest fitness: 50.376761934240456\n",
-      "\tEvaluations of fitness: 3074550\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 50.05 s\n",
-      "\tCPU time Spent:  50.05 s\n",
-      "\tGeneration: 12816\n",
-      "\tBest fitness: 42.22669206686289\n",
-      "\tEvaluations of fitness: 3204050\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 52.05 s\n",
-      "\tCPU time Spent:  52.05 s\n",
-      "\tGeneration: 13332\n",
-      "\tBest fitness: 34.88279395584162\n",
-      "\tEvaluations of fitness: 3333050\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 54.05 s\n",
-      "\tCPU time Spent:  54.05 s\n",
-      "\tGeneration: 13851\n",
-      "\tBest fitness: 28.24160820445085\n",
-      "\tEvaluations of fitness: 3462800\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 56.06 s\n",
-      "\tCPU time Spent:  56.06 s\n",
-      "\tGeneration: 14367\n",
-      "\tBest fitness: 22.31592553100657\n",
-      "\tEvaluations of fitness: 3591800\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 58.06 s\n",
-      "\tCPU time Spent:  58.06 s\n",
-      "\tGeneration: 14884\n",
-      "\tBest fitness: 17.154596268280304\n",
-      "\tEvaluations of fitness: 3721050\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 60.06 s\n",
-      "\tCPU time Spent:  60.06 s\n",
-      "\tGeneration: 15402\n",
-      "\tBest fitness: 12.602964800830804\n",
-      "\tEvaluations of fitness: 3850550\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 62.06 s\n",
-      "\tCPU time Spent:  62.06 s\n",
-      "\tGeneration: 15919\n",
-      "\tBest fitness: 8.68720171293756\n",
-      "\tEvaluations of fitness: 3979800\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 64.07 s\n",
-      "\tCPU time Spent:  64.07 s\n",
-      "\tGeneration: 16442\n",
-      "\tBest fitness: 5.483073214201059\n",
-      "\tEvaluations of fitness: 4110550\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 66.07 s\n",
-      "\tCPU time Spent:  66.07 s\n",
-      "\tGeneration: 16961\n",
-      "\tBest fitness: 3.0518548944608503\n",
-      "\tEvaluations of fitness: 4240300\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 68.07 s\n",
-      "\tCPU time Spent:  68.07 s\n",
-      "\tGeneration: 17479\n",
-      "\tBest fitness: 1.3265745603534682\n",
-      "\tEvaluations of fitness: 4369800\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 70.07 s\n",
-      "\tCPU time Spent:  70.07 s\n",
-      "\tGeneration: 18002\n",
-      "\tBest fitness: 0.3075037855308809\n",
-      "\tEvaluations of fitness: 4500550\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 72.07 s\n",
-      "\tCPU time Spent:  72.07 s\n",
-      "\tGeneration: 18525\n",
-      "\tBest fitness: 3.711100170023667e-11\n",
-      "\tEvaluations of fitness: 4631300\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 74.07 s\n",
-      "\tCPU time Spent:  74.07 s\n",
-      "\tGeneration: 19045\n",
-      "\tBest fitness: 1.0858869571486062e-13\n",
-      "\tEvaluations of fitness: 4761300\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 76.08 s\n",
-      "\tCPU time Spent:  76.08 s\n",
-      "\tGeneration: 19565\n",
-      "\tBest fitness: 4.019675684606048e-14\n",
-      "\tEvaluations of fitness: 4891300\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 78.08 s\n",
-      "\tCPU time Spent:  78.08 s\n",
-      "\tGeneration: 20084\n",
-      "\tBest fitness: 1.5080629277858004e-14\n",
-      "\tEvaluations of fitness: 5021050\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 80.08 s\n",
-      "\tCPU time Spent:  80.08 s\n",
-      "\tGeneration: 20606\n",
-      "\tBest fitness: 6.631750492233388e-15\n",
-      "\tEvaluations of fitness: 5151550\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 82.08 s\n",
-      "\tCPU time Spent:  82.08 s\n",
-      "\tGeneration: 21127\n",
-      "\tBest fitness: 6.631750492233388e-15\n",
-      "\tEvaluations of fitness: 5281800\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 84.09 s\n",
-      "\tCPU time Spent:  84.09 s\n",
-      "\tGeneration: 21644\n",
-      "\tBest fitness: 5.478004747378101e-15\n",
-      "\tEvaluations of fitness: 5411050\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 86.09 s\n",
-      "\tCPU time Spent:  86.09 s\n",
-      "\tGeneration: 22163\n",
-      "\tBest fitness: 3.125636490386383e-15\n",
-      "\tEvaluations of fitness: 5540800\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 88.09 s\n",
-      "\tCPU time Spent:  88.09 s\n",
-      "\tGeneration: 22683\n",
-      "\tBest fitness: 2.4151940423116095e-15\n",
-      "\tEvaluations of fitness: 5670800\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 90.09 s\n",
-      "\tCPU time Spent:  90.09 s\n",
-      "\tGeneration: 23201\n",
-      "\tBest fitness: 2.4151940423116095e-15\n",
-      "\tEvaluations of fitness: 5800300\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 92.1 s\n",
-      "\tCPU time Spent:  92.1 s\n",
-      "\tGeneration: 23725\n",
-      "\tBest fitness: 2.4151940423116095e-15\n",
-      "\tEvaluations of fitness: 5931300\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 94.1 s\n",
-      "\tCPU time Spent:  94.1 s\n",
-      "\tGeneration: 24246\n",
-      "\tBest fitness: 2.4151940423116095e-15\n",
-      "\tEvaluations of fitness: 6061550\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 96.1 s\n",
-      "\tCPU time Spent:  96.1 s\n",
-      "\tGeneration: 24768\n",
-      "\tBest fitness: 2.1893065780301543e-15\n",
-      "\tEvaluations of fitness: 6192050\n",
-      "\n",
-      "Optimizing Sphere function using Basic ES:\n",
-      "\tReal time Spent: 98.1 s\n",
-      "\tCPU time Spent:  98.1 s\n",
-      "\tGeneration: 25285\n",
-      "\tBest fitness: 7.612488702166364e-16\n",
-      "\tEvaluations of fitness: 6321300\n",
-      "\n"
-     ]
-    }
-   ],
-   "source": [
-    "# Define the parameters of the optimization process\n",
-    "params = {\"stop_cond\": \"time_limit\", \"time_limit\": 100.0, \"verbose\": True, \"v_timer\": 2}\n",
-    "\n",
-    "# Define the parameters of the algorithm\n",
-    "n_parents = 50\n",
-    "n_offspring = 250\n",
-    "\n",
-    "# Define the objective function\n",
-    "objfunc = Sphere(3)\n",
-    "\n",
-    "# Define a population initialization module\n",
-    "pop_init = UniformVectorInitializer(\n",
-    "    objfunc.vecsize, objfunc.low_lim, objfunc.up_lim, pop_size=n_parents\n",
-    ")\n",
-    "\n",
-    "# Instanciate the newly created algorithm\n",
-    "algorithm = BasicES(pop_init, n_parents, n_offspring, 1e-3)\n",
-    "\n",
-    "# Define a Search method\n",
-    "search = GeneralSearch(objfunc, algorithm, params)\n",
-    "\n",
-    "# Optimize the objective function\n",
-    "best_solution, best_fitness = search.optimize()"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 18,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Best solution: [-1.79028782e-08  1.76993574e-08  1.12901980e-08]\n",
-      "Solution fitness: 7.612488702166364e-16\n",
-      "\n",
-      "Number of generations: 25775\n",
-      "Real time spent: 100.00265s\n",
-      "CPU time spent: 99.92333s\n",
-      "Number of fitness evaluations: 6443800\n",
-      "Best fitness: 7.612488702166364e-16\n"
-     ]
-    },
-    {
-     "data": {
-      "image/png": "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0aVLF1544QVmzZpFRkaGXadU4BwOGD/eWp49G44ft7ceERERV2Z72Bk6dChdu3YlJiYmx/qNGzdy4cKFHOtr165NxYoVSUhIACAhIYH69esTHh7u3KdTp06kpqay3c1nzezSxRp7Jy1Nd3dERESuxdawM3/+fH788UdiY2Mv25aYmIiPjw+hoaE51oeHh5OYmOjc549BJ3t79rarSU9PJzU1NcejqHE4YMIEa3nWLN3dERERuRrbws7hw4d5/PHHef/99/Hz8yvU946NjSUkJMT5qFChQqG+f37p2hWaNIFz5+CVV+yuRkRExDXZFnY2btxIcnIyTZo0wcvLCy8vL1avXs3MmTPx8vIiPDycjIwMTp8+neN1SUlJREREABAREXFZ76zs59n7XMmYMWNISUlxPg4X0QFrHI5L4+68/jqcOGFvPSIiIq7ItrDToUMHtm7dyubNm52PZs2a0adPH+eyt7c3y5cvd75m165dHDp0iOjoaACio6PZunUrycnJzn3i4+MJDg6mbt26V31vX19fgoODczyKqr/+FRo1grNnNe6OiIjIlXjZ9cZBQUHUq1cvx7qAgABKlSrlXD9w4EBGjBhBWFgYwcHBPProo0RHR9OyZUsAOnbsSN26denbty9TpkwhMTGRsWPHMnToUHx9fQv9nOzg4QHPPw/du8Nrr8ETT0DZsnZXJSIi4jps7411LdOnT6dbt2707NmTtm3bEhERwaeffurc7unpyeLFi/H09CQ6Opr777+ffv36MXHiRBurLnx//Ss0a2a13Zkyxe5qREREXIvDGGPsLsJuqamphISEkJKSkm9faaWlpVG9enUA9u7di7+/f74c92qWLoXbbwc/P9i/HyIjC/TtREREbJfbv98ufWdHcq9zZ2jZEs6fh5desrsaERER16Gw4yYcDsj+9m7OHPjtN3vrERERcRUKO24kJgbatIH0dJg0ye5qREREXIPCjhv5492duXPh0CF76xEREXEFCjtupn17uOUWuHABXnzR7mpERETsp7DjhrLv7rzzDhw4YG8tIiIidlPYcUOtW0PHjnDxIrzwgt3ViIiI2Ethx01l3935979hzx57axEREbGTwo6batHCmhU9M1N3d0REpHhT2HFjzz9v/Xz/fdi5095aRERE7KKw48aaNrUmCM3KgnHj7K5GRETEHgo7bm7iRGv8nYUL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9dVXcTgcOBwODh48eMWvsT755BP+8pe/4OvrS+XKlXnllVdy1Fe5cmUmTZrEgw8+SFBQEBUrVuTNN990bs/IyGDYsGFERkbi5+dHpUqViI2NzYf/AiJyTYUyA5eIuLWHHnrIVKpUyXzzzTdm69at5s477zRBQUHm8ccfd26/+eabzZo1a8zevXvN1KlTja+vr9m9e7cxxph58+YZb29vExMTY9avX282btxo6tSpY3r37u18j/fee89ERkaaTz75xOzfv9988sknJiwszMTFxRljjDlw4IABTOXKlZ37HDlyxPz6669m6tSpZtOmTWbfvn1m5syZxtPT06xbt84YY802Hh0dbQYNGuScEfrixYvOyT9PnTpljDFmw4YNxsPDw0ycONHs2rXLzJs3z5QoUSLHZIeVKlUyYWFhZtasWWbPnj0mNjbWeHh4mJ07dxpjjJk6daqpUKGCWbNmjTl48KD59ttvzQcffFDA/3VERGFHRG5Iamqq8fb2NgsXLnSuO336tPH39zePP/64+eWXX4ynp6f57bffcryuQ4cOZsyYMcYYK+wAOWa9nzVrlgkPD3c+r1at2mXB4IUXXjDR0dHGmEthZ8aMGdetuWvXrmbkyJHO5+3atXMGs2z/G3Z69+5tbrvtthz7jB492tStW9f5vFKlSub+++93Ps/KyjJly5Y1s2fPNsYY8+ijj5pbb73VZGVlXbdGEck/XrbeVhKRIm///v1cuHCB5s2bO9eFhIRQq1YtALZu3UpmZiY1a9bM8br09HRKlSrlfO7v70+1atWczyMjI0lOTgbg3Llz7Nu3j4EDBzJo0CDnPhcvXiQkJCTHcZs1a5bjeWZmJpMmTWLBggX89ttvZGRkkJ6ejr+/f57O8+eff6Z79+451rVq1YoZM2aQmZmJp6cnAA0aNHBudzgcREREOM9jwIAB3HbbbdSqVYvOnTvTrVs3OnbsmKc6RCTvFHZEpECdPXsWT09PNm7c6AwE2QIDA53L3t7eObY5HA7M/3cWPXv2LABz586lRYsWOfb732MGBATkeD516lReffVVZsyYQf369QkICGD48OFkZGTc2IldxZXOIysrC4AmTZpw4MABli5dyjfffMM999xDTEwMH3/8cYHUIiIWhR0RuSFVq1bF29ub9evXU7FiRQBSUlLYvXs3bdu2pXHjxmRmZpKcnEybNm3+1HuEh4cTFRXF/v376dOnT55eu3btWrp37879998PQFZWFrt376Zu3brOfXx8fMjMzLzmcerUqcPatWsvO3bNmjUvC1zXEhwcTK9evejVqxd33303nTt35uTJk4SFheXhrEQkLxR2ROSGBAUF0b9/f0aPHk1YWBhly5Zl/PjxeHh44HA4qFmzJn369KFfv3688sorNG7cmGPHjrF8+XIaNGhA165dc/U+zz//PI899hghISF07tyZ9PR0NmzYwKlTpxgxYsRVX1ejRg0+/vhjvv/+e0qWLMm0adNISkrKEXYqV67MunXrOHjwIIGBgVcMHiNHjuSmm27ihRdeoFevXiQkJPD666/n6BF2PdOmTSMyMpLGjRvj4eHBwoULiYiIIDQ0NNfHEJG8U9dzEblh06ZNIzo6mm7duhETE0OrVq2cXcQB5s2bR79+/Rg5ciS1atWiR48eOe4E5cZDDz3EW2+9xbx586hfvz7t2rUjLi6OKlWqXPN1Y8eOpUmTJnTq1In27dsTERFBjx49cuwzatQoPD09qVu3LmXKlOHQoUOXHadJkyYsWLCA+fPnU69ePcaNG8fEiRMZMGBArs8hKCiIKVOm0KxZM2666SYOHjzIkiVL8PDQR7FIQdIIyiKS786dO0e5cuV45ZVXGDhwoN3liEgxp6+xROSGbdq0iZ07d9K8eXNSUlKYOHEiwGW9l0RE7KCwIyL54uWXX2bXrl34+PjQtGlTvv32W0qXLm13WSIi+hpLRERE3JtaxYmIiIhbU9gRERERt6awIyIiIm5NYUdERETcmsKOiIiIuDWFHREREXFrCjsiIiLi1hR2RERExK0p7IiIiIhb+z/wR5KwdPGYVAAAAABJRU5ErkJggg==",
-      "text/plain": [
-       "<Figure size 640x480 with 1 Axes>"
-      ]
-     },
-     "metadata": {},
-     "output_type": "display_data"
-    }
-   ],
-   "source": [
-    "print(f\"Best solution: {best_solution}\")\n",
-    "print(f\"Solution fitness: {best_fitness}\\n\")\n",
-    "search.display_report()"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": []
-  }
- ],
- "metadata": {
-  "kernelspec": {
-   "display_name": "Python 3",
-   "language": "python",
-   "name": "python3"
-  },
-  "language_info": {
-   "codemirror_mode": {
-    "name": "ipython",
-    "version": 3
-   },
-   "file_extension": ".py",
-   "mimetype": "text/x-python",
-   "name": "python",
-   "nbconvert_exporter": "python",
-   "pygments_lexer": "ipython3",
-   "version": "3.11.4"
-  },
-  "orig_nbformat": 4,
-  "vscode": {
-   "interpreter": {
-    "hash": "e7370f93d1d0cde622a1f8e1c04877d8463912d04d973331ad4851f04de6915a"
-   }
-  }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
diff --git a/tutorials/create_encoding.ipynb b/tutorials/create_encoding.ipynb
index 16a98c0..8e55ff3 100644
--- a/tutorials/create_encoding.ipynb
+++ b/tutorials/create_encoding.ipynb
@@ -4,7 +4,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "# Defining custom operators"
+    "# Defining custom encodings"
    ]
   },
   {
@@ -18,16 +18,17 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 9,
+   "execution_count": 74,
    "metadata": {},
    "outputs": [],
    "source": [
     "import metaheuristic_designer as mhd\n",
-    "from metaheuristic_designer import GeneralSearch, Operator\n",
-    "from metaheuristic_designer.operators import OperatorLambda\n",
-    "from metaheuristic_designer.algorithms import HillClimb\n",
+    "from metaheuristic_designer import GeneralAlgorithm, Encoding\n",
+    "from metaheuristic_designer.encodings import LambdaEncoding\n",
+    "from metaheuristic_designer.operators import OperatorReal\n",
+    "from metaheuristic_designer.strategies import HillClimb\n",
     "from metaheuristic_designer.initializers import UniformVectorInitializer\n",
-    "from metaheuristic_designer.benchmarks import Sphere\n",
+    "from metaheuristic_designer.benchmarks import *\n",
     "from copy import copy\n",
     "import numpy as np\n",
     "import random"
@@ -37,61 +38,57 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "## With an already defined function"
+    "## With already defined functions"
    ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "Let's say you have an already programmed function that will serve as a mutation or a cross operator for an algorithm. To use it in this framework, it will need to accept 4 parameters:\n",
-    "- An individual that we are attempting to modify.\n",
-    "- A population of individuals that are the parents selected for mutation.\n",
-    "- The objective function we are optimizing.\n",
-    "- A dictionary with other additional parameters.\n",
+    "You can define an encoding by providing both an encoding and decoding functions, the encoding function will transform the representation inside the optimization algorithm (genotype) to the representation used in the objective function (phenotype), the decoding function will perform the inverse transformation.\n",
     "\n",
-    "Here's an example.\n"
+    "Here's an example."
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 10,
+   "execution_count": 75,
    "metadata": {},
    "outputs": [],
    "source": [
-    "def mutate_custom(indiv, population, objfunc, **params):\n",
-    "    vector = indiv.genotype\n",
-    "    return vector + np.random.normal(0, params[\"F\"], vector.shape)"
+    "def encode_round(vector):\n",
+    "    return np.round(vector).astype(int)\n",
+    "\n",
+    "def decode_round(vector):\n",
+    "    return vector.astype(float)"
    ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "To convert it into an operator, we will pass it to the ```OperatorLambda``` class to along with its name and other parameters."
+    "To convert it into an operator, we will pass it to the ```LambdaEncoding``` class to along with its name and other parameters."
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 11,
+   "execution_count": 76,
    "metadata": {},
    "outputs": [],
    "source": [
-    "operator = OperatorLambda(\n",
-    "    mutate_custom, name=\"GaussianNoise_lambda\", params={\"F\": 1e-3}\n",
-    ")"
+    "round_encoding = LambdaEncoding(encode_round, decode_round)"
    ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "Now we can directly use it with any algorithm we want, in this case, we will use it in a Hill Climb algorithm."
+    "Now we can directly use it with any algorithm we want, in this case, we will use it in a genetic algorithm."
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 12,
+   "execution_count": 77,
    "metadata": {},
    "outputs": [
     {
@@ -105,63 +102,53 @@
       "\tReal time Spent: 0.0 s\n",
       "\tCPU time Spent:  0.0 s\n",
       "\tGeneration: 0\n",
-      "\tBest fitness: 5415.286292004781\n",
-      "\tEvaluations of fitness: 1\n",
-      "\n"
-     ]
-    },
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Optimizing Sphere function using HillClimb:\n",
-      "\tReal time Spent: 2.0 s\n",
-      "\tCPU time Spent:  2.0 s\n",
-      "\tGeneration: 133069\n",
-      "\tBest fitness: 412.2064937741036\n",
-      "\tEvaluations of fitness: 133070\n",
+      "\tBest fitness: 5317115\n",
+      "\tEvaluations of fitness: 100\n",
       "\n",
       "Optimizing Sphere function using HillClimb:\n",
-      "\tReal time Spent: 4.0 s\n",
-      "\tCPU time Spent:  4.0 s\n",
-      "\tGeneration: 259371\n",
-      "\tBest fitness: 1.2397215290188667e-09\n",
-      "\tEvaluations of fitness: 259372\n",
+      "\tReal time Spent: 0.5 s\n",
+      "\tCPU time Spent:  0.5 s\n",
+      "\tGeneration: 259\n",
+      "\tBest fitness: 9566\n",
+      "\tEvaluations of fitness: 26000\n",
       "\n",
       "Optimizing Sphere function using HillClimb:\n",
-      "\tReal time Spent: 6.0 s\n",
-      "\tCPU time Spent:  6.0 s\n",
-      "\tGeneration: 392311\n",
-      "\tBest fitness: 1.1174567301937887e-09\n",
-      "\tEvaluations of fitness: 392312\n",
+      "\tReal time Spent: 1.0 s\n",
+      "\tCPU time Spent:  1.0 s\n",
+      "\tGeneration: 508\n",
+      "\tBest fitness: 2725\n",
+      "\tEvaluations of fitness: 50900\n",
       "\n",
       "Optimizing Sphere function using HillClimb:\n",
-      "\tReal time Spent: 8.0 s\n",
-      "\tCPU time Spent:  8.0 s\n",
-      "\tGeneration: 525680\n",
-      "\tBest fitness: 1.1174567301937887e-09\n",
-      "\tEvaluations of fitness: 525681\n",
+      "\tReal time Spent: 1.5 s\n",
+      "\tCPU time Spent:  1.5 s\n",
+      "\tGeneration: 756\n",
+      "\tBest fitness: 232\n",
+      "\tEvaluations of fitness: 75700\n",
       "\n"
      ]
     }
    ],
    "source": [
     "# Define the parameters of the optimization process\n",
-    "params = {\"stop_cond\": \"time_limit\", \"time_limit\": 10.0, \"verbose\": True, \"v_timer\": 2}\n",
+    "params = {\"stop_cond\": \"time_limit or convergence\", \"time_limit\": 10.0, \"patience\": 100, \"verbose\": True, \"v_timer\": 0.5}\n",
     "\n",
     "# Define the objective function\n",
     "objfunc = Sphere(3)\n",
     "\n",
     "# Define a population initialization module\n",
     "pop_init = UniformVectorInitializer(\n",
-    "    objfunc.vecsize, objfunc.low_lim, objfunc.up_lim, pop_size=1\n",
+    "    objfunc.vecsize, objfunc.low_lim*100, objfunc.up_lim*100, pop_size=100, encoding=round_encoding\n",
     ")\n",
     "\n",
+    "# Define the operator to be used\n",
+    "mutation = OperatorReal(\"MutNoise\", {\"method\": \"Normal\", \"F\": 1, \"N\": 1})\n",
+    "\n",
     "# Instanciate the newly created algorithm\n",
-    "algorithm = HillClimb(pop_init, operator)\n",
+    "algorithm = HillClimb(pop_init, mutation)\n",
     "\n",
     "# Define a Search method\n",
-    "search = GeneralSearch(objfunc, algorithm, params)\n",
+    "search = GeneralAlgorithm(objfunc, algorithm, params)\n",
     "\n",
     "# Optimize the objective function\n",
     "best_solution, best_fitness = search.optimize()"
@@ -169,26 +156,26 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 13,
+   "execution_count": 78,
    "metadata": {},
    "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Best solution: [ 4.43236770e-06 -2.22897807e-06  2.18093450e-05]\n",
-      "Solution fitness: 5.002617550341376e-10\n",
+      "Best solution: [-0.10143305  0.02204575  0.49450797]\n",
+      "Solution fitness: 0\n",
       "\n",
-      "Number of generations: 658842\n",
-      "Real time spent: 10.00002s\n",
-      "CPU time spent: 9.99193s\n",
-      "Number of fitness evaluations: 658843\n",
-      "Best fitness: 5.002617550341376e-10\n"
+      "Number of generations: 995\n",
+      "Real time spent: 1.99277s\n",
+      "CPU time spent: 1.99272s\n",
+      "Number of fitness evaluations: 99600\n",
+      "Best fitness: 0\n"
      ]
     },
     {
      "data": {
-      "image/png": "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ZLsYiIio1j3yyCMAgK+++krhSqoynX250bFjx+7qTts3u/mu25a65557AAD+/v6Ii4ur8jKNWrux/dSpU/Hzzz/j0KFDqKiowPvvv2/WpkuXLnj77bexb98+fP311zh8+DCWLVt2V3US2TMGIiKqdXq9Hn379sWSJUuwZs2aKusrKirw4osv1n1hANasWYOzZ8/K7/fs2YP09HT069fPat/h6emJoqKiO/58fHw8dDod3nnnnWr7/ZiG6JeVleHq1atm6+655x54e3ujvLwcgHQZ7uYzZe3btwcAuQ2RGrEPERHVif/+97/o06cPBg4ciEceeQS9evWCp6cnjh8/jmXLluH8+fN39VyxOxUREYFu3brh2WefRXl5OebPn48GDRpg+vTpVvuOjh07YvHixfjnP/+JiIgI+Pv7/2V/oOrodDosXrwYw4cPR3R0NJ588kk0atQIeXl5WLduHbp27YqPP/4Yx44dQ69evfDEE08gKioKLi4uWL16NQoKCvDkk08CAL744gssWrQIAwYMwD333IOSkhJ8/vnn0Ol0eOihh6y2z0T2hoGIiOpEo0aNsGvXLixatAjLly/HK6+8goqKCoSGhuLRRx/FCy+8oEhdI0aMgJOTE+bPn4/CwkJ07twZH3/8MYKCgqz2HTNnzsTp06cxZ84clJSUoEePHhYFIgAYOnQogoOD8e6772Lu3LkoLy9H48aN0b17d4wePRqA1JF8yJAh2Lx5M7788ku4uLggMjISK1askG+I2aNHD+zZswfLli1DQUEBfHx80LlzZ3z99dcIDw+32j4T2RuNsNVehkRERER1hH2IiIiISPUYiIiIiEj1GIiIiIhI9RiIiIiISPUYiIiIiEj1GIiIiIhI9XgfohowGo04d+4cvL297/oW/ERERFQ3hBAoKSlBcHAwnJxufQ6IgagGzp07V+XJ2URERGQfzpw5gyZNmtyyDQNRDXh7ewOQDqhOp7PadsvKyuRnCGVmZsLDw8Nq2yYiIlI7g8GAkJAQ+e/4rTAQ1YDpMplOp7NqIHJxcZFP4el0OgYiIiKiWlCT7i7sVE1ERESqx0BEREREqsdARERERKrHQERERESqx0BEREREqsdARERERKrHQERERESqx0BEREREqsdARERERKrHQERERESqx0BEREREqsdARERERKrHh7sqzGj0RWWlv9JlEBER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zdrdvE1PT0+z93PnzsWCBQswf/58tGnTBp6enpg0aRIqKirubsf+QnX7YTQaAQDR0dHIycnBhg0b8Msvv+CJJ55AXFwcVq1aVSu1EJGEgYiIal2zZs3g6uqKvXv3omnTpgCA4uJiHDt2DPfffz86dOiAyspKFBYWonv37nf0HQEBAQgODsapU6cwbNgwiz67c+dOPPbYY3jqqacAAEajEceOHUNUVJTcxs3NDZWVlbfcTsuWLbFz584q227evHmVUHYrOp0OgwcPxuDBg/H444+jb9++uHjxIurXr2/BXhGRJRiIiKjWeXt7Y+TIkZg2bRrq168Pf39/zJo1C05OTtBoNGjevDmGDRuGESNG4P3330eHDh3w+++/Y/PmzWjbti0SEhJq9D1vvPEGnn/+efj4+KBv374oLy/Hvn37cOnSJUyZMuUvP3fvvfdi1apV2LVrF/z8/PDBBx+goKDALBCFhYUhPT0dubm58PLyqjacTJ06FZ06dcJbb72FwYMHIy0tDR9//LHZSLfb+eCDDxAUFIQOHTrAyckJK1euRGBgIHx9fWu8DSKyHIfdE1Gd+OCDD6DX6/Hwww8jLi4OXbt2lYfHA8DSpUsxYsQITJ06FS1atED//v3NzijVxLhx47BkyRIsXboUbdq0QY8ePZCUlITw8PBbfu7VV19FdHQ04uPj0bNnTwQGBqJ///5mbV588UU4OzsjKioKjRo1Ql5eXpXtREdHY8WKFVi2bBlat26NmTNn4s0338SoUaNqvA/e3t6YM2cOYmJi0KlTJ+Tm5mL9+vVwcuKva6LaxDtVE5EiSktL0bhxY7z//vsYO3as0uUQkcrxkhkR1Yn9+/fjt99+Q+fOnVFcXIw333wTAKqMyiIiUgIDERHVmX/961/Izs6Gm5sbOnbsiO3bt6Nhw4ZKl0VExEtmREREROylR0RERKrHQERERESqx0BEREREqsdARERERKrHQERERESqx0BEREREqsdARERERKrHQERERESqx0BEREREqvd/mUOer2yus5oAAAAASUVORK5CYII=",
+      "image/png": "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",
       "text/plain": [
        "<Figure size 640x480 with 1 Axes>"
       ]
@@ -207,66 +194,44 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "## With an operator class"
+    "## With an Encoding class"
    ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "If we want a little bit more control of how our operator will be applied, we can make a class that inherits from the base ```Operator``` class.\n",
+    "If we want more control on the encoding, we can make a class that inherits from the base ```Encoding``` class.\n",
     "\n",
-    "We will need to implement the ```evolve``` method, which will receive a number of parameters shown below."
+    "To do this, we will implement the ```encode``` and ```decode``` methods."
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 14,
+   "execution_count": 79,
    "metadata": {},
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "'GaussianNoise_Class'"
-      ]
-     },
-     "execution_count": 14,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
+   "outputs": [],
    "source": [
-    "class OperatorCustom(Operator):\n",
-    "    def __init__(self, sigma, params=None, name=None):\n",
-    "        self.sigma = sigma\n",
-    "        super().__init__(params, name)\n",
+    "class RoundEncoding(Encoding):\n",
+    "    def encode(self, phenotype):\n",
+    "        return phenotype.astype(float)\n",
     "\n",
-    "    def evolve(self, indiv, population, objfunc, global_best, initializer):\n",
-    "        # It is good practice to always make a copy of the individual to ensure that we don't\n",
-    "        # modify it directly\n",
-    "        new_indiv = copy(indiv)\n",
+    "    def decode(self, genotype):\n",
+    "        return np.round(genotype).astype(int)\n",
     "\n",
-    "        # We apply a mutation to the individual\n",
-    "        vector = new_indiv.genotype\n",
-    "        new_indiv.genotype = vector + np.random.normal(0, self.sigma, vector.shape)\n",
-    "\n",
-    "        return new_indiv\n",
-    "\n",
-    "\n",
-    "op_custom = OperatorCustom(1e-3, name=\"GaussianNoise_Class\")\n",
-    "op_custom.name"
+    "custom_encoding = RoundEncoding()"
    ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "We can once again use this operator as normal."
+    "We can once again use this encoding as normal."
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 17,
+   "execution_count": 80,
    "metadata": {},
    "outputs": [
     {
@@ -280,57 +245,53 @@
       "\tReal time Spent: 0.0 s\n",
       "\tCPU time Spent:  0.0 s\n",
       "\tGeneration: 0\n",
-      "\tBest fitness: 4837.711925988624\n",
-      "\tEvaluations of fitness: 1\n",
+      "\tBest fitness: 13362114\n",
+      "\tEvaluations of fitness: 100\n",
       "\n",
       "Optimizing Sphere function using HillClimb:\n",
-      "\tReal time Spent: 2.0 s\n",
-      "\tCPU time Spent:  2.0 s\n",
-      "\tGeneration: 126770\n",
-      "\tBest fitness: 360.528564563992\n",
-      "\tEvaluations of fitness: 126771\n",
+      "\tReal time Spent: 0.5 s\n",
+      "\tCPU time Spent:  0.5 s\n",
+      "\tGeneration: 265\n",
+      "\tBest fitness: 11665\n",
+      "\tEvaluations of fitness: 26600\n",
       "\n",
       "Optimizing Sphere function using HillClimb:\n",
-      "\tReal time Spent: 4.0 s\n",
-      "\tCPU time Spent:  4.0 s\n",
-      "\tGeneration: 257540\n",
-      "\tBest fitness: 9.136899843218854e-10\n",
-      "\tEvaluations of fitness: 257541\n",
+      "\tReal time Spent: 1.0 s\n",
+      "\tCPU time Spent:  1.0 s\n",
+      "\tGeneration: 540\n",
+      "\tBest fitness: 3363\n",
+      "\tEvaluations of fitness: 54100\n",
       "\n",
       "Optimizing Sphere function using HillClimb:\n",
-      "\tReal time Spent: 6.0 s\n",
-      "\tCPU time Spent:  6.0 s\n",
-      "\tGeneration: 388027\n",
-      "\tBest fitness: 9.136899843218854e-10\n",
-      "\tEvaluations of fitness: 388028\n",
-      "\n",
-      "Optimizing Sphere function using HillClimb:\n",
-      "\tReal time Spent: 8.0 s\n",
-      "\tCPU time Spent:  8.0 s\n",
-      "\tGeneration: 521886\n",
-      "\tBest fitness: 1.0248925258923705e-10\n",
-      "\tEvaluations of fitness: 521887\n",
+      "\tReal time Spent: 1.5 s\n",
+      "\tCPU time Spent:  1.5 s\n",
+      "\tGeneration: 809\n",
+      "\tBest fitness: 16\n",
+      "\tEvaluations of fitness: 81000\n",
       "\n"
      ]
     }
    ],
    "source": [
     "# Define the parameters of the optimization process\n",
-    "params = {\"stop_cond\": \"time_limit\", \"time_limit\": 10.0, \"verbose\": True, \"v_timer\": 2}\n",
+    "params = {\"stop_cond\": \"time_limit or convergence\", \"time_limit\": 10.0, \"patience\": 100, \"verbose\": True, \"v_timer\": 0.5}\n",
     "\n",
     "# Define the objective function\n",
     "objfunc = Sphere(3)\n",
     "\n",
     "# Define a population initialization module\n",
     "pop_init = UniformVectorInitializer(\n",
-    "    objfunc.vecsize, objfunc.low_lim, objfunc.up_lim, pop_size=1\n",
+    "    objfunc.vecsize, objfunc.low_lim*100, objfunc.up_lim*100, pop_size=100, encoding=custom_encoding\n",
     ")\n",
     "\n",
+    "# Define the operator to be used\n",
+    "mutation = OperatorReal(\"MutNoise\", {\"method\": \"Normal\", \"F\": 1, \"N\": 1})\n",
+    "\n",
     "# Instanciate the newly created algorithm\n",
-    "algorithm = HillClimb(pop_init, operator)\n",
+    "algorithm = HillClimb(pop_init, mutation)\n",
     "\n",
     "# Define a Search method\n",
-    "search = GeneralSearch(objfunc, algorithm, params)\n",
+    "search = GeneralAlgorithm(objfunc, algorithm, params)\n",
     "\n",
     "# Optimize the objective function\n",
     "best_solution, best_fitness = search.optimize()"
@@ -338,26 +299,26 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 18,
+   "execution_count": 81,
    "metadata": {},
    "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Best solution: [ 8.06079626e-06  3.11855865e-06 -5.27137631e-06]\n",
-      "Solution fitness: 1.0248925258923705e-10\n",
+      "Best solution: [-0.10828564  0.25732665  0.02291018]\n",
+      "Solution fitness: 0\n",
       "\n",
-      "Number of generations: 653847\n",
-      "Real time spent: 10.00002s\n",
-      "CPU time spent: 9.99331s\n",
-      "Number of fitness evaluations: 653848\n",
-      "Best fitness: 1.0248925258923705e-10\n"
+      "Number of generations: 935\n",
+      "Real time spent: 1.73156s\n",
+      "CPU time spent: 1.74693s\n",
+      "Number of fitness evaluations: 93600\n",
+      "Best fitness: 0\n"
      ]
     },
     {
      "data": {
-      "image/png": "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SmS9GIiIyOIeeeQRAMBnn32mcCXVGc++XO/o0aN3NdL2jW4cdbuuWrRoAQDw8/NDZGRktZfxrrXr20+dOhU//PADDh06hPLycrz99tsmbXr27Il///vf2LdvH1auXImsrCysWrXqruoksmUMRERkcXq9HgMHDsTy5cvxzTffVFtfXl6Ol156qf4LA/DNN9/g9OnT8vs9e/YgLS0NgwYNMtt3eHh4oKio6I4/HxUVBa1WizfffLPGfj/GW/RLS0tx9epVk3UtWrSAl5cXysrKAEiX4W48U9a5c2cAkNsQOSL2ISKievHJJ59gwIABGDp0KB555BH0798fHh4eOHbsGFatWoWzZ8/e1XPF7lRYWBh69+6N5557DmVlZVi4cCEaNWqE6dOnm+07unXrhqVLl+Jf//oXwsLC4Ofnd9P+QDXRarVYunQpRo0aha5du+LJJ59EkyZNkJeXhw0bNqBXr1547733cPToUfTv3x9PPPEEwsPD4eLignXr1qGgoABPPvkkAODjjz/GkiVLMGTIELRo0QIlJSX48MMPodVq8dBDD5ltn4lsDQMREdWLJk2aYNeuXViyZAm+/PJLvPzyyygvL0dISAgeffRRvPjii4rUNXr0aDg5OWHhwoUoLCxEjx498N577yEgIMBs3zFnzhycPHkS8+bNQ0lJCfr27VunQAQAI0eORGBgIN566y3Mnz8fZWVlaNq0Kfr06YOxY8cCkDqSjxgxAsnJyfj000/h4uKCNm3aYPXq1fKAmH379sWePXuwatUqFBQUwNvbGz169MDKlSsRGhpqtn0msjUqYa29DImIiIjqCfsQERERkcNjICIiIiKHx0BEREREDo+BiIiIiBweAxERERE5PAYiIiIicngch6gWqqqqcObMGXh5ed31EPxERERUP4QQKCkpQWBgIJycbn0OiIGoFs6cOVPtydlERERkG06dOoVmzZrdso2igejVV1/Fa6+9ZrKsdevWOHLkCADg6tWrmDp1KlatWoWysjJERUVhyZIl8Pf3l9vn5eXhueeew7Zt2+Dp6YnY2FgkJCTAxeWvXUtJSUF8fDyysrIQFBSE2bNnY8yYMbWu08vLC4B0QLVa7V3ssanS0lL5GUIZGRlwd3c327aJiIgcncFgQFBQkPx3/FYUP0PUrl07/Pjjj/L764PMlClTsGHDBqxZswbe3t6YOHEi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a1fk5ORg06ZN+PHHH/HEE08gMjISa9eutUgtRCRhICIii7vnnnvg6uqKvXv3Ijg4GABQXFyMo0eP4r777kOXLl1QWVmJwsJC9OnT546+w9/fH4GBgThx4gRiYmLq9NmdO3fisccew1NPPQUAqKqqwtGjRxEeHi63UavVqKysvOV22rZti507d1bbdqtWraqFslvRarUYPnw4hg8fjscffxwDBw7EhQsX0LBhwzrsFRHVBQMREVmcl5cXYmNjMW3aNDRs2BB+fn6YO3cunJycoFKp0KpVK8TExGD06NF4++230aVLF/zxxx9ITk5Gx44dER0dXavvee211/DCCy/A29sbAwcORFlZGfbt24eLFy8iPj7+pp9r2bIl1q5di127dsHX1xfvvPMOCgoKTAJR8+bNkZaWhtzcXHh6etYYTqZOnYp7770Xb7zxBoYPH47U1FS89957Jne63c4777yDgIAAdOnSBU5OTlizZg10Oh18fHxqvQ0iqjvedk9E9eKdd96BXq/Hww8/jMjISPTq1Uu+PR4AVqxYgdGjR2Pq1Klo3bo1Bg8ebHJGqTbGjx+P5cuXY8WKFejQoQP69u2LxMREhIaG3vJzs2fPRteuXREVFYV+/fpBp9Nh8ODBJm1eeuklODs7Izw8HE2aNEFeXl617XTt2hWrV6/GqlWr0L59e8yZMwevv/46xowZU+t98PLywrx589C9e3fce++9yM3NxcaNG+HkxF/XRJbEkaqJSBGXL19G06ZN8fbbb2PcuHFKl0NEDo6XzIioXhw4cABHjhxBjx49UFxcjNdffx0Aqt2VRUSkBAYiIqo3//3vf5GdnQ21Wo1u3brhp59+QuPGjZUui4iIl8yIiIiI2EuPiIiIHB4DERERETk8BiIiIiJyeAxERERE5PAYiIiIiMjhMRARERGRw2MgIiIiIofHQEREREQOj4GIiIiIHN7/AxQKm692jwkmAAAAAElFTkSuQmCC",
+      "image/png": "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",
       "text/plain": [
        "<Figure size 640x480 with 1 Axes>"
       ]
diff --git a/tutorials/create_operators.ipynb b/tutorials/create_operators.ipynb
index a5ad127..86083f9 100644
--- a/tutorials/create_operators.ipynb
+++ b/tutorials/create_operators.ipynb
@@ -18,14 +18,14 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": 9,
    "metadata": {},
    "outputs": [],
    "source": [
     "import metaheuristic_designer as mhd\n",
-    "from metaheuristic_designer import GeneralSearch, Operator\n",
+    "from metaheuristic_designer import GeneralAlgorithm, Operator\n",
     "from metaheuristic_designer.operators import OperatorLambda\n",
-    "from metaheuristic_designer.algorithms import HillClimb\n",
+    "from metaheuristic_designer.strategies import HillClimb\n",
     "from metaheuristic_designer.initializers import UniformVectorInitializer\n",
     "from metaheuristic_designer.benchmarks import Sphere\n",
     "from copy import copy\n",
@@ -55,7 +55,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": 10,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -73,7 +73,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": 11,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -91,7 +91,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": 12,
    "metadata": {},
    "outputs": [
     {
@@ -105,36 +105,42 @@
       "\tReal time Spent: 0.0 s\n",
       "\tCPU time Spent:  0.0 s\n",
       "\tGeneration: 0\n",
-      "\tBest fitness: 7247.989947214412\n",
+      "\tBest fitness: 9103.999254463915\n",
       "\tEvaluations of fitness: 1\n",
-      "\n",
+      "\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
       "Optimizing Sphere function using HillClimb:\n",
       "\tReal time Spent: 2.0 s\n",
       "\tCPU time Spent:  2.0 s\n",
-      "\tGeneration: 126804\n",
-      "\tBest fitness: 1187.1022955410133\n",
-      "\tEvaluations of fitness: 126805\n",
+      "\tGeneration: 127382\n",
+      "\tBest fitness: 1995.9386713981532\n",
+      "\tEvaluations of fitness: 127383\n",
       "\n",
       "Optimizing Sphere function using HillClimb:\n",
       "\tReal time Spent: 4.0 s\n",
       "\tCPU time Spent:  4.0 s\n",
-      "\tGeneration: 257474\n",
-      "\tBest fitness: 3.4401817585912525e-10\n",
-      "\tEvaluations of fitness: 257475\n",
+      "\tGeneration: 255499\n",
+      "\tBest fitness: 7.154708405749166e-10\n",
+      "\tEvaluations of fitness: 255500\n",
       "\n",
       "Optimizing Sphere function using HillClimb:\n",
       "\tReal time Spent: 6.0 s\n",
       "\tCPU time Spent:  6.0 s\n",
-      "\tGeneration: 390801\n",
-      "\tBest fitness: 3.4401817585912525e-10\n",
-      "\tEvaluations of fitness: 390802\n",
+      "\tGeneration: 385403\n",
+      "\tBest fitness: 5.61497588630145e-10\n",
+      "\tEvaluations of fitness: 385404\n",
       "\n",
       "Optimizing Sphere function using HillClimb:\n",
       "\tReal time Spent: 8.0 s\n",
       "\tCPU time Spent:  8.0 s\n",
-      "\tGeneration: 521464\n",
-      "\tBest fitness: 3.4401817585912525e-10\n",
-      "\tEvaluations of fitness: 521465\n",
+      "\tGeneration: 515757\n",
+      "\tBest fitness: 5.61497588630145e-10\n",
+      "\tEvaluations of fitness: 515758\n",
       "\n"
      ]
     }
@@ -155,7 +161,7 @@
     "algorithm = HillClimb(pop_init, operator)\n",
     "\n",
     "# Define a Search method\n",
-    "search = GeneralSearch(objfunc, algorithm, params)\n",
+    "search = GeneralAlgorithm(objfunc, algorithm, params)\n",
     "\n",
     "# Optimize the objective function\n",
     "best_solution, best_fitness = search.optimize()"
@@ -163,26 +169,26 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": 13,
    "metadata": {},
    "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Best solution: [ 6.14504540e-06  2.34705093e-06 -1.73420859e-05]\n",
-      "Solution fitness: 3.4401817585912525e-10\n",
+      "Best solution: [ 1.79577549e-05 -1.50864831e-05  3.37855780e-06]\n",
+      "Solution fitness: 5.61497588630145e-10\n",
       "\n",
-      "Number of generations: 653005\n",
-      "Real time spent: 10.00002s\n",
-      "CPU time spent: 9.9849s\n",
-      "Number of fitness evaluations: 653006\n",
-      "Best fitness: 3.4401817585912525e-10\n"
+      "Number of generations: 645119\n",
+      "Real time spent: 10.00001s\n",
+      "CPU time spent: 9.99401s\n",
+      "Number of fitness evaluations: 645120\n",
+      "Best fitness: 5.61497588630145e-10\n"
      ]
     },
     {
      "data": {
-      "image/png": "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",
+      "image/png": "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rFkzHT58uJj3FPBeBCIAxe7mm2+WJL3//vs2V5Jf3tmX023duvWiRto+05mjbhfVpZdeKkmKjIxUYmJivlfeXWuntx8xYoT++9//atOmTTpx4oReeeUVtzYtW7bUCy+8oDVr1uiDDz7Q5s2bNX369IuqEyjNCEQAil1CQoI6dOigt99+W59//nm+9SdOnNDDDz9c8oVJ+vzzz7V3717X+1WrViklJUUdO3b02HeUL19e6enpF/z5pKQkhYaG6sUXXyyw30/eLfpHjx7V8ePH3dZdeumlqlixorKzsyVZl+HOPFN21VVXSZKrDeCL6EMEoES8++67at++vW699VbdfPPNateuncqXL69t27Zp+vTp2r9//0U9V+xC1alTR61bt9YDDzyg7OxsTZgwQZUrV9ajjz7qse9o1qyZJk2apOeff1516tRRZGTkWfsDFSQ0NFSTJk3SnXfeqaZNm6pnz56qWrWqdu/erblz56pVq1Z64403tHXrVrVr107du3dXw4YNFRAQoFmzZiktLU09e/aUJL3zzjuaOHGiunbtqksvvVRZWVl66623FBoaqptuuslj+wyUNgQiACWiatWq+vbbbzVx4kR9/PHHevzxx3XixAnFxcXpb3/7m4YMGWJLXX379pWfn58mTJigAwcOqEWLFnrjjTcUExPjse946qmn9Ouvv2rs2LHKyspS27ZtixSIJKl3796qVq2aXnrpJY0bN07Z2dmqXr262rRpo/79+0uyOpL36tVLCxcu1HvvvaeAgADVr19fM2bMcA2I2bZtW61atUrTp09XWlqawsLC1KJFC33wwQeqXbu2x/YZKG0cxlt7GQIAAJQQ+hABAACfRyACAAA+j0AEAAB8HoEIAAD4PAIRAADweQQiAADg8xiHqBByc3O1b98+VaxY8aKH4AcAACXDGKOsrCxVq1ZNfn7nPgdEICqEffv25XtyNgAAKB327NmjGjVqnLMNgagQKlasKMk6oKGhoR7b7tGjR13PEFq/fr1CQkI8tm0AAHxdZmamYmNjXX/Hz4VAVAh5l8lCQ0M9GogCAgJcp/BCQ0MJRAAAFIPCdHehUzUAAPB5BCIAAODzCEQAAMDnEYgAAIDPIxABAACfRyACAAA+j0AEAAB8HoEIAAD4PAIRAADweQQiAADg8whEAADA5xGIAACAz+PhrjbLza2onJw4u8sAAMCnEYhs9MMPDqWl/SQ/v0Myxu5qAADwXVwys1H9+kbSCeXmVta2bQ67ywEAwGcRiGzkdEqBgd9LkpYu9be5GgAAfBeByGaBgd9IkpYu5T8FAAB24a+wzZzOFZKkZcv8lZtrczEAAPgoApHNypVbJ4fjqP7806GffrK7GgAAfBOByGYOxymVK2f1I1qyxN5aAADwVQQiL+B0LpckJSfbXAgAAD6KQOQF8jpWL18u+hEBAGADApEXKFduoypUMDp4UNqwwe5qAADwPQQiL+BwnFJCgnVqiH5EAACUPAKRl7j22hxJ0qJFNhcCAIAPIhB5ieuvtwLR0qXSqVM2FwMAgI8hEHmJK64wCg+XMjOltWvtrgYAAN9CIPIS/v7SdddZ81w2AwCgZBGIvEi7dtaUQAQAQMkiEHmRG26wpt98Ix0/bm8tAAD4EgKRF2nQQIqOtsLQd9/ZXQ0AAL6DQORFHI6/zhItXGhvLQAA+BICkZehHxEAACWPQORl8s4QrVolZWXZWwsAAL6CQORlatWSate2BmdcvtzuagAA8A0EIi/EZTMAAEoWgcgL0bEaAICSRSDyQnmBaP166c8/bS0FAACfQCDyQlFR0uWXW/OLF9tbCwAAvoBA5KXyzhLRjwgAgOJHIPJSdKwGAKDkEIi8VNu2kp+ftGWLtHev3dUAAFC2EYi8VHi41KyZNc9ZIgAAiheByItx+z0AACWDQOTF8voRLVwoGWNvLQAAlGUEIi/WqpXkdEq//SZt3Wp3NQAAlF0EIi8WEiIlJFjzjEcEAEDxIRB5ubx+RAQiAACKD4HIy11/vTVdvFjKzbW3FgAAyioCkZdr0cK6dPb779LmzXZXAwBA2WRrIMrJydGTTz6p2rVrKzg4WJdeeqmee+45mdNuqTLG6KmnnlJMTIyCg4OVmJiobdu2uW3n4MGD6tOnj0JDQxUeHq4BAwbo8OHDbm02bNigNm3aKCgoSLGxsRo7dmyJ7OPFCgyU2rSx5rlsBgBA8bA1EL388suaNGmS3njjDf300096+eWXNXbsWP3zn/90tRk7dqxef/11TZ48WSkpKSpfvrySkpJ0/PhxV5s+ffpo8+bNSk5O1pw5c7Rs2TLde++9rvWZmZlq37694uLitHbtWo0bN05PP/20pkyZUqL7e6HyLpsxQCMAAMXE2KhTp07m7rvvdlt26623mj59+hhjjMnNzTXR0dFm3LhxrvXp6enG6XSajz76yBhjzI8//mgkmdWrV7vazJ8/3zgcDrN3715jjDETJ040ERERJjs729XmscceM/Xq1StUnRkZGUaSycjIuLAdPYsjR46YmJgYExMTY44cOXLWdqtWGSMZEx5uzKlTHi0BAIAyqyh/v209Q3TNNddo4cKF2vq/QXZ++OEHffPNN+rYsaMkaefOnUpNTVViYqLrM2FhYYqPj9fKlSslSStXrlR4eLiaN2/uapOYmCg/Pz+lpKS42lx77bUKDAx0tUlKStKWLVt06NChYt/Pi9WkiRQaKqWnS+vX210NAABlT4CdXz5y5EhlZmaqfv368vf3V05Ojl544QX16dNHkpSamipJioqKcvtcVFSUa11qaqoiIyPd1gcEBKhSpUpubWrXrp1vG3nrIiIi3NZlZ2crOzvb9T4zM/Nid/WiBARYD3v98kurH1HeM84AAIBn2HqGaMaMGfrggw/04Ycf6vvvv9c777yjf/zjH3rnnXfsLEtjxoxRWFiY6xUbG2trPdJf4xHRjwgAAM+zNRA98sgjGjlypHr27KnGjRvrzjvv1LBhwzRmzBhJUnR0tCQpLS3N7XNpaWmuddHR0Tpw4IDb+lOnTungwYNubQraxunfcbpRo0YpIyPD9dqzZ48H9vbi5AWiJUukY8dsLQUAgDLH1kB09OhR+fm5l+Dv76/c/41AWLt2bUVHR2vhaY97z8zMVEpKihL+90yLhIQEpaena+3ata42ixYtUm5uruLj411tli1bppMnT7raJCcnq169evkul0mS0+lUaGio28tujRtLNWpYYeibb+yuBgCAssXWQHTzzTfrhRde0Ny5c7Vr1y7NmjVLr776qrp27SpJcjgcGjp0qJ5//nl98cUX2rhxo/r27atq1aqpS5cukqQGDRqoQ4cOGjhwoFatWqUVK1Zo8ODB6tmzp6pVqyZJ6t27twIDAzVgwABt3rxZH3/8sV577TUNHz7crl0vModDyutbnpxsby0AAJQ5JXDX21llZmaaIUOGmJo1a5qgoCBzySWXmMcff9zt9vjc3Fzz5JNPmqioKON0Ok27du3Mli1b3Lbz559/ml69epkKFSqY0NBQ079/f5OVleXW5ocffjCtW7c2TqfTVK9e3bz00kuFrtPu2+7zvPeedft9s2YeLQMAgDKpKH+/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HYhycnK0fv16HTp0yBP1wAvdfrs1XbFC2rPH3loAACgORQ5EQ4cO1b///W9JVhhq27atmjZtqtjYWC1ZssTT9cELVK8utW5tzX/yib21AABQHIociGbOnKkrr7xSkvTll19q586d+vnnnzVs2DA9/vjjHi8Q3iHvstmHH9pbBwAAxaHIgeiPP/5QdHS0JGnevHm6/fbbVbduXd19993auHGjxwuEd+jRQypXTlq7Vtq61e5qAADwrCIHoqioKP3444/KycnRggULdOONN0qSjh49Kn9/f48XCO9Qtap07bXW/Gef2VsLAACeVuRA1L9/f3Xv3l2NGjWSw+FQYmKiJCklJUX169f3eIHwHj17WtOPPrK3DgAAPC2gqB94+umn1ahRI+3Zs0e33367nE6nJMnf318jR470eIHwHrfeKj3wgLRhg7R9u1Snjt0VAQDgGUUORJJ02223ub1PT09Xv379PFIQvFelStJ110lff23dbTZqlN0VAQDgGUW+ZPbyyy/r49NG6OvevbsqV66sGjVqaMOGDR4tDt4n77LZu+9ao1cDAFAWFDkQTZ48WbGxsZKk5ORkJScna/78+erQoYMefvhhjxcI73L77VJIiPTzz9J339ldDQAAnlHkQJSamuoKRHPmzFH37t3Vvn17Pfroo1q9erXHC4R3CQ2VunWz5t97z95aAADwlCIHooiICO353/MbFixY4LrLzBijnJwcz1YHr3TnndZ0xgzp1Cl7awEAwBOKHIhuvfVW9e7dWzfeeKP+/PNPdezYUZK0bt061eG2I59w/fVS5crSn39KCxfaXQ0AABevyIFo/PjxGjx4sBo2bKjk5GRVqFBBkrR//379/e9/93iB8D4BAX91ruayGQCgLHAYw71C55OZmamwsDBlZGQoNDTUY9s9evSo66za9u3bFRIS4rFtF7eUFKllSyk4WEpLkypWtLsiAADcFeXvd5HPEEnSe++9p9atW6tatWr69ddfJUkTJkzQ7NmzL2RzKIVatLAGZjx2TPryS7urAQDg4hQ5EE2aNEnDhw9Xx44dlZ6e7upIHR4ergkTJni6Pngph0Pq08ea//e/7a0FAICLVeRA9M9//lNvvfWWHn/8cbeHuTZv3pyn3fuYu+6ypkuWSAcO2FkJAAAXp8iBaOfOnWrSpEm+5U6nU0eOHPFIUSgdatWSmjWTcnOl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ZcuWkqT27durYcOGuvPOOzV27FilpqbqiSee0KBBg1xneO6//3698cYbevTRR3X33Xdr0aJFmjFjhubOneuR/cD5de1q3WG2c6d159m119pdEQAA7rz63+rjx49X586d1a1bN1177bWKjo7WZ5995lrv7++vOXPmyN/fXwkJCbrjjjvUt29fPfvss642tWvX1ty5c5WcnKwrr7xSr7zyit5++23GICpB5ctbYxJJkofyNAAAHlWocYh8HeMQXbwVK6TWra1wlJoqnfZsYAAAioXHxyECLtY110h16lhjEk2fbnc1AAC4IxChRDgc0r33WvNTpthbCwAAZyIQocT06ycFBEirV0v/G0gcAACvQCBCiYmMlG6+2ZqfONHeWgAAOB2BCCXq73+3ph98IJ3lySkAAJQ4AhFK1A03WKNXZ2RIM2faXQ0AABYCEUqUn99fnavffNPeWgAAyEMgQokbMEDy95dSUqSff7a7GgAACESwQVSU1LGjNf/22/bWAgCARCCCTQYOtKbvvCNlZ9tbCwAABCLY4qabpOrVpT/+kD791O5qAAC+jkAEWwQE/HWWiMtmAAC7EYhgm/79rUd6LF4sbd1qdzUAAF9GIIJtatb8q3P1v/9tby0AAN9GIIKtBgywpu++K506ZW8tAADfRSCCrTp3lqpUkVJTpfnz7a4GAOCrCESwVWCg1K+fNT9pkr21AAB8F4EItrv/fmu6YIH0yy/21gIA8E0EItiuTh2pQwfJGGnyZLurAQD4IgIRvMLf/25N//Mf6dgxe2sBAPgeAhG8wk03SXFx0sGD0owZdlcDAPA1BCJ4BX//v/oSTZxoby0AAN9DIILXuPtu666zVauklBS7qwEA+BICEbxGZKTUq5c1/9pr9tYCAPAtBCJ4lQcftKaffCL99pu9tQAAfAeBCF6lWTPp2mutx3i88Ybd1QAAfAWBCF5nxAhrOnmylJVlby0AAN9AIILX6dxZuuwyKSPDeugrAADFjUAEr+PnJz30kDU/YYKUm2trOQAAH0Agglfq318KC5O2b5fmzLG7GgBAWUcgglcqX1667z5r/tVX7a0FAFD2EYjgtQYPlgICpKVLpTVr7K4GAFCWEYjgtWJjpR49rHkGagQAFCcCEbza0KHWdPp0BmoEABQfAhG8WvPmUps21kCN77xjdzUAgLKKQASvd8891nTiROnk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Sy+9JIfDoaFDhxapnrJ2bJ5++mk5HA63V/369YtUR1k7Jnn27t2rO+64Q5UrV1ZwcLAaN26sNWvWuNb74u9djzKwxfTp001gYKD5z3/+YzZv3mwGDhxowsPDTVpamt2lFcq8efPM448/bj777DMjycyaNctt/UsvvWTCwsLM559/bn744Qfzt7/9zdSuXdscO3bM1aZDhw7myiuvNN99951Zvny5qVOnjunVq5drfUZGhomKijJ9+vQxmzZtMh999JEJDg42//rXv1xtVqxYYfz9/c3YsWPNjz/+aJ544glTrlw5s3HjxiLV4glJSUlm6tSpZtOmTWb9+vXmpptuMjVr1jSHDx92tbn//vtNbGysWbhwoVmzZo1p2bKlueaaa1zrT506ZRo1amQSExPNunXrzLx580yVKlXMqFGjXG127NhhQkJCzPDhw82PP/5o/vnPfxp/f3+zYMECV5vC/HydrxZP+eKLL8zcuXPN1q1bzZYtW8z//d//mXLlyplNmzb57DE506pVq0ytWrXMFVdcYYYMGVLoesrisRk9erS5/PLLzf79+12v33//3aePiTHGHDx40MTFxZm77rrLpKSkmB07dpivvvrKbN++3dXGF3/vehKByCYtWrQwgwYNcr3Pyckx1apVM2PGjLGxqgtzZiDKzc010dHRZty4ca5l6enpxul0mo8++sgYY8yPP/5oJJnVq1e72syfP984HA6zd+9eY4wxEydONBERESY7O9vV5rHHHjP16tVzve/evbvp1KmTWz3x8fHmvvvuK3QtxeXAgQNGklm6dKnre8uVK2c++eQTV5uffvrJSDIrV640xlhB08/Pz6SmprraTJo0yYSGhrqOw6OPPmouv/xyt+/q0aOHSUpKcr0/389XYWopThEREebtt9/mmBhjsrKyzGWXXWaSk5NN27ZtXYHIV4/N6NGjzZVXXlngOl89JsZYv/tat2591vX83r14XDKzwYkTJ7R27VolJia6lvn5+SkxMVErV660sTLP2Llzp1JTU932LywsTPHx8a79W7lypcLDw9W8eXNXm8TERPn5+SklJcXV5tprr1VgYKCrTVJSkrZs2aJDhw652pz+PXlt8r6nMLUUl4yMDElSpUqVJElr167VyZMn3WqpX7++atas6XZcGjdurKioKLf9yczM1ObNm11tzrXPhfn5KkwtxSEnJ0fTp0/XkSNHlJCQwDGRNGjQIHXq1Clf/b58bLZt26Zq1arpkksuUZ8+fbR79+5C11FWj8kXX3yh5s2b6/bbb1dkZKSaNGmit956y7We37sXj0Bkgz/++EM5OTlu/8NKUlRUlFJTU22qynPy9uFc+5eamqrIyEi39QEBAapUqZJbm4K2cfp3nK3N6evPV0txyM3N1dChQ9WqVSs1atTIVUtgYKDCw8PPWe+F7nNmZqaOHTtWqJ+vwtTiSRs3blSFChXkdDp1//33a9asWWrYsKFPHxNJmj59ur7//nuNGTMm3zpfPTbx8fGaNm2aFixYoEmTJmnnzp1q06aNsrKyfPaYSNKOHTs0adIkXXbZZfrqq6/0wAMP6KGHHtI777zjtm++/Hv3YvG0e6AYDBo0SJs2bdI333xjdyleoV69elq/fr0yMjI0c+ZM9evXT0uXLrW7LFvt2bNHQ4YMUXJysoKCguwux2t07NjRNX/FFVcoPj5ecXFxmjFjhoKDg22szF65ublq3ry5XnzxRUlSkyZNtGnTJk2ePFn9+vWzubqygTNENqhSpYr8/f3z3Y2Qlpam6Ohom6rynLx9ONf+RUdH68CBA27rT506pYMHD7q1KWgbp3/H2dqcvv58tXja4MGDNWfOHC1evFg1atRwLY+OjtaJEyeUnp5+znovdJ9DQ0MVHBxcqJ+vwtTiSYGBgapTp46aNWumMWPG6Morr9Rrr73m08dk7dq1OnDggJo2baqAgAAFBARo6dKlev311xUQEKCoqCifPTanCw8PV926dbV9+3af/nmJiYlRw4YN3ZY1aNDAdTnR13/vegKByAaBgYFq1qyZFi5c6FqWm5urhQsXKiEhwcbKPKN27dqKjo5227/MzEylpKS49i8hIUHp6elau3atq82iRYuUm5ur+Ph4V5tly5bp5MmTrjbJycmqV6+eIiIiXG1O/568NnnfU5haPMUYo8GDB2vWrFlatGiRateu7ba+WbNmKleunFstW7Zs0e7du92Oy8aNG91+aSUnJys0NNT1y/B8+1yYn6/C1FKccnNzlZ2d7dPHpF27dtq4caPWr1/vejVv3lx9+vRxzfvqsTnd4cOH9csvvygmJsanf15atWqVbxiPrVu3Ki4uTpLv/t71KLt7dfuq6dOnG6fTaaZNm2Z+/PFHc++995rw8HC3OyO8WVZWllm3bp1Zt26dkWReffVVs27dOvPrr78aY6xbLsPDw83s2bPNhg0bzC233FLg7Z9NmjQxKSkp5ptvvjGXXXaZ2+2f6enpJioqytx5551m06ZNZvr06SYkJCTf7Z8BAQHmH//4h/npp5/M6NGjC7z983y1eMIDDzxgwsLCzJIlS9xuGT569Kirzf33329q1qxpFi1aZNasWWMSEhJMQkKCa33eLcPt27c369evNwsWLDBVq1Yt8JbhRx55xPz000/mzTffLPCW4fP9fJ2vFk8ZOXKkWbp0qdm5c6fZsGGDGTlypHE4HOa///2vzx6Tszn9LrPC1FMWj82IESPMkiVLzM6dO82KFStMYmKiqVKlijlw4IDPHhNjrKEZAgICzAsvvGC2bdtmPvjgAxMSEmLef/99Vxtf/L3rSQQiG/3zn/80NWvWNIGBgaZFixbmu+++s7ukQlu8eLGRlO/Vr18/Y4x12+WTTz5poqKijNPpNO3atTNbtmxx28aff/5pevXqZSpUqGBCQ0NN//79TVZWllubH374wbRu3do4nU5TvXp189JLL+WrZcaMGaZu3bomMDDQXH755Wbu3Llu6wtTiycUdDwkmalTp7raHDt2zPz97383ERERJiQkxHTt2tXs37/fbTu7du0yHTt2NMHBwaZKlSpmxIgR5uTJk25tFi9ebK666ioTGBhoLrnkErfvyHO+n6/C1OIJd999t4mLizOBgYGmatWqpl27dq4wVNg6ytoxOZszA5EvHpsePXqYmJgYExgYaKpXr2569OjhNtaOLx6TPF9++aVp1KiRcTqdpn79+mbKlClu633x964nOYwxxp5zUwAAAN6BPkQAAMDnEYgAAIDPIxABAACfRyACAAA+j0AEAAB8HoEIAAD4PAIRAADweQQiALhAS5YskcPhyPc8KwClDwMzAkAhXHfddbrqqqs0YcIE17ITJ07o4MGDioqKksPhsK84ABeNM0QAfNrpD7EsqsDAQEVHRxOGgDKAQASgRGRlZalPnz4qX768YmJiNH78eF133XUaOnSoJCk7O1sPP/ywqlevrvLlyys+Pl5LlixxfX7atGkKDw/XV199pQYNGqhChQrq0KGD9u/f7/Y9b7/9tho0aKCgoCDVr19fEydOdK3btWuXHA6HPv74Y7Vt21ZBQUH64IMP9Oeff6pXr16qXr26QkJC1LhxY3300Ueuz911111aunSpXnvtNTkcDjkcDu3atavAS2affvqpLr/8cjmdTtWqVUuvvPKKW321atXSiy++qLvvvlsVK1ZUzZo1NWXKFNf6EydOaPDgwYqJiVFQUJDi4uI0ZswYD/wXAHBO9j5KDYCvuOeee0xcXJz5+uuvzcaNG03Xrl1NxYoVXQ8zveeee8w111xjli1bZrZv327GjRtnnE6n2bp1qzHGmKlTp5py5cqZxMREs3r1arN27VrToEED07t3b9d3vP/++yYmJsZ8+umnZseOHebTTz81lSpVMtOmTTPGGLNz504jydSqVcvVZt++fea3334z48aNM+vWrTO//PKLef31142/v79JSUkxxlhPAE9ISDADBw40+/fvN/v37zenTp1yPeT40KFDxhhj1qxZY/z8/Myzzz5rtmzZYqZOnWqCg4PdHhwaFxdnKlWqZN58802zbds2M2bMGOPn52d+/vlnY4wx48aNM7GxsWbZsmVm165dZvny5ebDDz8s5v86AAhEAIpdZmamKVeunPnkk09cy9LT001ISIgZMmSI+fXXX42/v7/Zu3ev2+fatWtnRo0aZYyxApEktyefv/nmmyYqKsr1/tJLL80XHp577jmTkJBgjPkrEE2YMOG8NXfq1MmMGDHC9f7MJ9EbY/IFot69e5sbb7zRrc0jjzxiGjZs6HofFxdn7rjjDtf73NxcExkZaSZNmmSMMebBBx80N9xwg8nNzT1vjQA8J8DW01MAfMKOHTt08uRJtWjRwrUsLCxM9erVkyRt3LhROTk5qlu3rtvnsrOzVblyZdf7kJAQXXrppa73MTExOnDggCTpyJEj+uWXXzRgwAANHDjQ1ebUqVMKCwtz227z5s3d3ufk5OjFF1/UjBkztHfvXp04cULZ2dkKCQkp0n7+9NNPuuWWW9yWtWrVShMmTFBOTo78/f0lSVdccYVrvcPhUHR0tGs/7rrrLt14442qV6+eOnTooM6dO6t9+/ZFqgNA0RGIANju8OHD8vf319q1a12hIU+FChVc8+XKlXNb53A4ZP53o+zhw4clSW+99Zbi4+Pd2p25zfLly7u9HzdunF577TVNmDBBjRs3Vvny5TV06FCdOHHi4nbsLAraj9zcXElS06ZNtXPnTs2fP19ff/21unfvrsTERM2cObNYagFgIRABKHaXXHKJypUrp9WrV6tmzZqSpIyMDG3dulXXXnutmjRpopycHB04cEBt2rS5oO+IiopStWrVtGPHDvXp06dIn12xYoVuueUW3XHHHZKk3Nxcbd26VQ0bNnS1CQwMVE5Ozjm306BBA61YsSLftuvWrZsvlJ1LaGioevTooR49eui2225Thw4ddPDgQVWqVKkIewWgKAhEAIpdxYoV1a9fPz3yyCOqVKmSIiMjNXr0aPn5+cnhcKhu3brq06eP+vbtq1deeUVNmjTR77//roULF+qKK65Qp06dCvU9zzzzjB566CGFhYWpQ4cOys7O1po1a3To0CENHz78rJ+77LLLNHPmTH377beKiIjQq6++qrS0NLdAVKtWLaWkpGjXrl2qUKFCgeFkxIgRuvrqq/Xcc8+pR48eWrlypd544w23O93O59VXX1VMTIyaNGkiPz8/ffLJJ4qOjlZ4eHihtwGg6LjtHkCJePXVV5WQkKDOnTsrMTFRrVq1ct0eL0lTp05V3759NWLECNWrV09dunRxO6NUGPfcc4/efvttTZ06VY0bN1bbtm01bdo01a5d+5yfe+KJJ9S0aVMlJSXpuuuuU3R0tLp06eLW5uGHH5a/v78aNmyoqlWravfu3fm207RpU82YMUPTp09Xo0aN9NRTT+nZZ5/VXXfdVeh9qFixosaOHavmzZvr6quv1q5duzRv3jz5+fHrGihOjFQNwBZHjhxR9erV9corr2jAgAF2lwPAx3HJDECJWLdunX7++We1aNFCGRkZevbZZyUp311ZAGAHAhGAEvOPf/xDW7ZsUWBgoJo1a6bly5erSpUqdpcFAFwyAwAAoJceAADweQQiAADg8whEAADA5xGIAACAzyMQAQAAn0cgAgAAPo9ABAAAfB6BCAAA+DwCEQAA8Hn/D8PKIBCXz5TqAAAAAElFTkSuQmCC",
       "text/plain": [
        "<Figure size 640x480 with 1 Axes>"
       ]
@@ -215,7 +221,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": 14,
    "metadata": {},
    "outputs": [
     {
@@ -224,7 +230,7 @@
        "'GaussianNoise_Class'"
       ]
      },
-     "execution_count": 6,
+     "execution_count": 14,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -260,7 +266,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": 17,
    "metadata": {},
    "outputs": [
     {
@@ -274,42 +280,36 @@
       "\tReal time Spent: 0.0 s\n",
       "\tCPU time Spent:  0.0 s\n",
       "\tGeneration: 0\n",
-      "\tBest fitness: 11580.664753311505\n",
+      "\tBest fitness: 13773.584888614803\n",
       "\tEvaluations of fitness: 1\n",
-      "\n"
-     ]
-    },
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
+      "\n",
       "Optimizing Sphere function using HillClimb:\n",
       "\tReal time Spent: 2.0 s\n",
       "\tCPU time Spent:  2.0 s\n",
-      "\tGeneration: 129226\n",
-      "\tBest fitness: 3140.3453083655336\n",
-      "\tEvaluations of fitness: 129227\n",
+      "\tGeneration: 125501\n",
+      "\tBest fitness: 4498.541396850342\n",
+      "\tEvaluations of fitness: 125502\n",
       "\n",
       "Optimizing Sphere function using HillClimb:\n",
       "\tReal time Spent: 4.0 s\n",
       "\tCPU time Spent:  4.0 s\n",
-      "\tGeneration: 256369\n",
-      "\tBest fitness: 26.386176996621234\n",
-      "\tEvaluations of fitness: 256370\n",
+      "\tGeneration: 252965\n",
+      "\tBest fitness: 262.85757098555604\n",
+      "\tEvaluations of fitness: 252966\n",
       "\n",
       "Optimizing Sphere function using HillClimb:\n",
       "\tReal time Spent: 6.0 s\n",
       "\tCPU time Spent:  6.0 s\n",
-      "\tGeneration: 387606\n",
-      "\tBest fitness: 4.311855373529104e-10\n",
-      "\tEvaluations of fitness: 387607\n",
+      "\tGeneration: 381477\n",
+      "\tBest fitness: 1.4983805606745078e-09\n",
+      "\tEvaluations of fitness: 381478\n",
       "\n",
       "Optimizing Sphere function using HillClimb:\n",
       "\tReal time Spent: 8.0 s\n",
       "\tCPU time Spent:  8.0 s\n",
-      "\tGeneration: 519880\n",
-      "\tBest fitness: 1.1344859990074184e-10\n",
-      "\tEvaluations of fitness: 519881\n",
+      "\tGeneration: 508968\n",
+      "\tBest fitness: 8.868069044880022e-10\n",
+      "\tEvaluations of fitness: 508969\n",
       "\n"
      ]
     }
@@ -330,7 +330,7 @@
     "algorithm = HillClimb(pop_init, operator)\n",
     "\n",
     "# Define a Search method\n",
-    "search = GeneralSearch(objfunc, algorithm, params)\n",
+    "search = GeneralAlgorithm(objfunc, algorithm, params)\n",
     "\n",
     "# Optimize the objective function\n",
     "best_solution, best_fitness = search.optimize()"
@@ -338,26 +338,26 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": 18,
    "metadata": {},
    "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Best solution: [ 6.86495357e-06 -5.11245020e-06  6.33907448e-06]\n",
-      "Solution fitness: 1.1344859990074184e-10\n",
+      "Best solution: [7.28811950e-06 1.39950153e-05 1.22249128e-05]\n",
+      "Solution fitness: 3.984256309032014e-10\n",
       "\n",
-      "Number of generations: 650301\n",
-      "Real time spent: 10.00001s\n",
-      "CPU time spent: 9.99535s\n",
-      "Number of fitness evaluations: 650302\n",
-      "Best fitness: 1.1344859990074184e-10\n"
+      "Number of generations: 637019\n",
+      "Real time spent: 10.00002s\n",
+      "CPU time spent: 9.9883s\n",
+      "Number of fitness evaluations: 637020\n",
+      "Best fitness: 3.984256309032014e-10\n"
      ]
     },
     {
      "data": {
-      "image/png": "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",
+      "image/png": "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",
       "text/plain": [
        "<Figure size 640x480 with 1 Axes>"
       ]
diff --git a/tutorials/create_strategy.ipynb b/tutorials/create_strategy.ipynb
new file mode 100644
index 0000000..0cc6a8f
--- /dev/null
+++ b/tutorials/create_strategy.ipynb
@@ -0,0 +1,616 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Creating an algorithm"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "In this notebook, we are going to explain how to implement a new optimization algorithm using the metaheuristic-designer framework.\n",
+    "\n",
+    "For this example, we are going to implement a basic evolutionary strategy."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import random\n",
+    "import metaheuristic_designer as mhd\n",
+    "from metaheuristic_designer import GeneralAlgorithm\n",
+    "from metaheuristic_designer.selectionMethods import SurvivorSelection, ParentSelection\n",
+    "from metaheuristic_designer.operators import OperatorReal\n",
+    "from metaheuristic_designer.initializers import UniformVectorInitializer\n",
+    "from metaheuristic_designer.benchmarks import Sphere"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "For simplicity, we will assume we are working with real coded vectors.\n",
+    "\n",
+    "We will also predefine the operators, but in real situations it might be wiser to let the user specify the user they want to use.\n",
+    "\n",
+    "To configure our evolution strategy, we will need to specify the number of parents and offpring in each generation.\n",
+    "The operator will be a gaussian mutation, it will have a standard deviation associated which will be another parameter.\n",
+    "\n",
+    "To create the algorithm, we will make a class that inherits from ```SearchStrategy``` and will implement its methods.\n",
+    "\n",
+    "In this case we will implement the ```select_parents``` method that chooses the individuals to be chosen for mutation, the ```perturb``` method that will perform a mutation on the selected indivuals, the ```select_individuals``` that will choose the individuals that will remain for the next generation.\n",
+    "\n",
+    "Here, we will make extensive use of already implemented components, like ```ParentSelection```, ```SurvivorSelection```, ```Operator```, but you can provide your own implementation of those, which will be explained in different notebooks."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "The ```SearchStrategy``` class has some attributes that must be used for the \n",
+    "algorithm to work correctly.\n",
+    "\n",
+    "The algorithm will have a ```name```, if unspecified, a default name will be chosen. This is the name of the algorithm showed in logs.\n",
+    "\n",
+    "A population initialization module ```pop_init``` must be present to perform the initialization of the algorithm (an explanation will be present in its respective notebook). It will also specify the size of the initialized population.\n",
+    "\n",
+    "The algorithm has a list of individuals called ```population``` which holds. It is a standard python list with variable size.\n",
+    "\n",
+    "We also have a ```best``` attribute that holds the best individual in each generation.\n",
+    "\n",
+    "You can optionally store the parameters of the algorithm in a dictionary or an instance of ```ParamScheduler``` in the attribute ```params```. It is recomended to use the latter because it allows parameters to change over time. We will not worry about this in this example.\n",
+    "\n",
+    "All of these attributes are generated on the ```__init__``` method of the ```SearchStrategy``` class."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# ES search strategy class\n",
+    "class BasicES(mhd.SearchStrategy):\n",
+    "    # Class constructor\n",
+    "    def __init__(self, pop_init, parent_size, offspring_size, sigma):\n",
+    "        self.parent_size = parent_size\n",
+    "        self.offspring_size = offspring_size\n",
+    "\n",
+    "        # Create the mutation operator for use later\n",
+    "        self.mutate_op = OperatorReal(\n",
+    "            \"MutRand\", {\"method\": \"Gauss\", \"F\": sigma, \"N\": 1}\n",
+    "        )\n",
+    "\n",
+    "        # Force pop_init to agree with the population size, this is not mandatory.\n",
+    "        pop_init.pop_size = parent_size\n",
+    "\n",
+    "        # Create the parent selection module, select the best half of the parents\n",
+    "        self.parent_sel_op = ParentSelection(\"Best\", {\"amount\": parent_size // 2})\n",
+    "\n",
+    "        # Create the parent selection module, select the best half of the parents\n",
+    "        self.surv_sel_op = SurvivorSelection(\"keepbest\", {\"amount\": parent_size})\n",
+    "\n",
+    "        super().__init__(pop_init, name=\"Basic ES\")\n",
+    "\n",
+    "    # This method receives the population from the previous generation\n",
+    "    # and some extra information (that we don't need here) and returns\n",
+    "    # a list of selected individuals.\n",
+    "    def select_parents(self, population, **kwargs):\n",
+    "        return self.parent_sel_op(population)\n",
+    "\n",
+    "    # This method receives the parents that we are going to mutate,\n",
+    "    # the objective function class and some extra information that we\n",
+    "    # are not going to use.\n",
+    "    def perturb(self, parent_list, objfunc, **kwargs):\n",
+    "        offspring = []\n",
+    "\n",
+    "        # Iterate until the list of individuals has the\n",
+    "        # size we want.\n",
+    "        while len(offspring) < self.offspring_size:\n",
+    "            # Choose an individual from the parent list.\n",
+    "            indiv = random.choice(parent_list)\n",
+    "\n",
+    "            # Apply the operator.\n",
+    "            new_indiv = self.mutate_op(\n",
+    "                indiv, parent_list, objfunc, self.best, self.pop_init\n",
+    "            )\n",
+    "\n",
+    "            # Repair the solution to keep the vector within the bounds\n",
+    "            # of the problem.\n",
+    "            new_indiv.genotype = objfunc.repair_solution(new_indiv.genotype)\n",
+    "\n",
+    "            # Add the individual to the offspring list.\n",
+    "            offspring.append(new_indiv)\n",
+    "\n",
+    "        # Update the best solution\n",
+    "        current_best = max(offspring, key=lambda x: x.fitness)\n",
+    "        if self.best.fitness < current_best.fitness:\n",
+    "            self.best = current_best\n",
+    "\n",
+    "        return offspring\n",
+    "\n",
+    "    # This method selects the individuals that will be chosen for the next\n",
+    "    # generation, it gets the original population along with the newly\n",
+    "    # generated individuals.\n",
+    "    def select_individuals(self, prev_population, offspring, **kwargs):\n",
+    "        return self.surv_sel_op(prev_population, offspring)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "To begin with the optimization we need one more component, the ```Algorithm```. This is mostly the same for all algorithms, so it is recomended that you use the already implemented ```GeneralAlgorithm``` class for this purpose unless you REALLY need something different. If this is the case, you have an ```Algorithm``` base class available that you can inherit from.\n",
+    "\n",
+    "We will be using one of the benchmark functions already implemented in this framework that consist on adding the square of the vector components."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Initializing optimization of Sphere function using Basic ES\n",
+      "-----------------------------------------------------------\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 0.0 s\n",
+      "\tCPU time Spent:  0.0 s\n",
+      "\tGeneration: 0\n",
+      "\tBest fitness: 216.04589161959848\n",
+      "\tEvaluations of fitness: 50\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 2.0 s\n",
+      "\tCPU time Spent:  2.0 s\n",
+      "\tGeneration: 488\n",
+      "\tBest fitness: 198.45718277887545\n",
+      "\tEvaluations of fitness: 122050\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 4.0 s\n",
+      "\tCPU time Spent:  4.0 s\n",
+      "\tGeneration: 981\n",
+      "\tBest fitness: 181.32343270028673\n",
+      "\tEvaluations of fitness: 245300\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 6.0 s\n",
+      "\tCPU time Spent:  6.0 s\n",
+      "\tGeneration: 1471\n",
+      "\tBest fitness: 164.98316815473146\n",
+      "\tEvaluations of fitness: 367800\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 8.0 s\n",
+      "\tCPU time Spent:  8.0 s\n",
+      "\tGeneration: 1962\n",
+      "\tBest fitness: 149.40630698384481\n",
+      "\tEvaluations of fitness: 490550\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 10.01 s\n",
+      "\tCPU time Spent:  10.01 s\n",
+      "\tGeneration: 2453\n",
+      "\tBest fitness: 134.6356063303501\n",
+      "\tEvaluations of fitness: 613300\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 12.01 s\n",
+      "\tCPU time Spent:  12.01 s\n",
+      "\tGeneration: 2945\n",
+      "\tBest fitness: 120.5262405469118\n",
+      "\tEvaluations of fitness: 736300\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 14.01 s\n",
+      "\tCPU time Spent:  14.01 s\n",
+      "\tGeneration: 3403\n",
+      "\tBest fitness: 108.17855058407092\n",
+      "\tEvaluations of fitness: 850800\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 16.02 s\n",
+      "\tCPU time Spent:  16.02 s\n",
+      "\tGeneration: 3892\n",
+      "\tBest fitness: 95.6035555117675\n",
+      "\tEvaluations of fitness: 973050\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 18.02 s\n",
+      "\tCPU time Spent:  18.02 s\n",
+      "\tGeneration: 4386\n",
+      "\tBest fitness: 83.60912299670267\n",
+      "\tEvaluations of fitness: 1096550\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 20.02 s\n",
+      "\tCPU time Spent:  20.02 s\n",
+      "\tGeneration: 4883\n",
+      "\tBest fitness: 72.57500516615414\n",
+      "\tEvaluations of fitness: 1220800\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 22.02 s\n",
+      "\tCPU time Spent:  22.02 s\n",
+      "\tGeneration: 5371\n",
+      "\tBest fitness: 62.45317472704477\n",
+      "\tEvaluations of fitness: 1342800\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 24.03 s\n",
+      "\tCPU time Spent:  24.03 s\n",
+      "\tGeneration: 5863\n",
+      "\tBest fitness: 53.002707364798226\n",
+      "\tEvaluations of fitness: 1465800\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 26.03 s\n",
+      "\tCPU time Spent:  26.03 s\n",
+      "\tGeneration: 6355\n",
+      "\tBest fitness: 44.41571113982488\n",
+      "\tEvaluations of fitness: 1588800\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 28.03 s\n",
+      "\tCPU time Spent:  28.03 s\n",
+      "\tGeneration: 6849\n",
+      "\tBest fitness: 36.550583950314056\n",
+      "\tEvaluations of fitness: 1712300\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 30.03 s\n",
+      "\tCPU time Spent:  30.03 s\n",
+      "\tGeneration: 7333\n",
+      "\tBest fitness: 29.64118836232614\n",
+      "\tEvaluations of fitness: 1833300\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 32.03 s\n",
+      "\tCPU time Spent:  32.03 s\n",
+      "\tGeneration: 7777\n",
+      "\tBest fitness: 23.8715593645004\n",
+      "\tEvaluations of fitness: 1944300\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 34.04 s\n",
+      "\tCPU time Spent:  34.04 s\n",
+      "\tGeneration: 8240\n",
+      "\tBest fitness: 18.581209578036564\n",
+      "\tEvaluations of fitness: 2060050\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 36.04 s\n",
+      "\tCPU time Spent:  36.04 s\n",
+      "\tGeneration: 8740\n",
+      "\tBest fitness: 13.643731169033614\n",
+      "\tEvaluations of fitness: 2185050\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 38.04 s\n",
+      "\tCPU time Spent:  38.04 s\n",
+      "\tGeneration: 9235\n",
+      "\tBest fitness: 9.534962039728967\n",
+      "\tEvaluations of fitness: 2308800\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 40.05 s\n",
+      "\tCPU time Spent:  40.05 s\n",
+      "\tGeneration: 9727\n",
+      "\tBest fitness: 6.183825274770362\n",
+      "\tEvaluations of fitness: 2431800\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 42.05 s\n",
+      "\tCPU time Spent:  42.05 s\n",
+      "\tGeneration: 10218\n",
+      "\tBest fitness: 3.5869269633698404\n",
+      "\tEvaluations of fitness: 2554550\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 44.05 s\n",
+      "\tCPU time Spent:  44.05 s\n",
+      "\tGeneration: 10707\n",
+      "\tBest fitness: 1.7573294796192598\n",
+      "\tEvaluations of fitness: 2676800\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 46.05 s\n",
+      "\tCPU time Spent:  46.05 s\n",
+      "\tGeneration: 11198\n",
+      "\tBest fitness: 0.5859595393248187\n",
+      "\tEvaluations of fitness: 2799550\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 48.05 s\n",
+      "\tCPU time Spent:  48.05 s\n",
+      "\tGeneration: 11689\n",
+      "\tBest fitness: 0.04578172253428994\n",
+      "\tEvaluations of fitness: 2922300\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 50.05 s\n",
+      "\tCPU time Spent:  50.05 s\n",
+      "\tGeneration: 12185\n",
+      "\tBest fitness: 1.8032981463591784e-13\n",
+      "\tEvaluations of fitness: 3046300\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 52.05 s\n",
+      "\tCPU time Spent:  52.05 s\n",
+      "\tGeneration: 12684\n",
+      "\tBest fitness: 9.079135923900804e-14\n",
+      "\tEvaluations of fitness: 3171050\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 54.06 s\n",
+      "\tCPU time Spent:  54.06 s\n",
+      "\tGeneration: 13182\n",
+      "\tBest fitness: 4.1647538854708614e-14\n",
+      "\tEvaluations of fitness: 3295550\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 56.06 s\n",
+      "\tCPU time Spent:  56.06 s\n",
+      "\tGeneration: 13680\n",
+      "\tBest fitness: 7.825868815943842e-15\n",
+      "\tEvaluations of fitness: 3420050\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 58.06 s\n",
+      "\tCPU time Spent:  58.06 s\n",
+      "\tGeneration: 14164\n",
+      "\tBest fitness: 1.7677065945729698e-15\n",
+      "\tEvaluations of fitness: 3541050\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 60.07 s\n",
+      "\tCPU time Spent:  60.07 s\n",
+      "\tGeneration: 14650\n",
+      "\tBest fitness: 1.1037884464896895e-15\n",
+      "\tEvaluations of fitness: 3662550\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 62.07 s\n",
+      "\tCPU time Spent:  62.07 s\n",
+      "\tGeneration: 15145\n",
+      "\tBest fitness: 8.625240888838379e-16\n",
+      "\tEvaluations of fitness: 3786300\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 64.07 s\n",
+      "\tCPU time Spent:  64.07 s\n",
+      "\tGeneration: 15635\n",
+      "\tBest fitness: 8.625240888838379e-16\n",
+      "\tEvaluations of fitness: 3908800\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 66.07 s\n",
+      "\tCPU time Spent:  66.07 s\n",
+      "\tGeneration: 16130\n",
+      "\tBest fitness: 8.625240888838379e-16\n",
+      "\tEvaluations of fitness: 4032550\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 68.07 s\n",
+      "\tCPU time Spent:  68.07 s\n",
+      "\tGeneration: 16622\n",
+      "\tBest fitness: 8.625240888838379e-16\n",
+      "\tEvaluations of fitness: 4155550\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 70.07 s\n",
+      "\tCPU time Spent:  70.07 s\n",
+      "\tGeneration: 17092\n",
+      "\tBest fitness: 8.625240888838379e-16\n",
+      "\tEvaluations of fitness: 4273050\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 72.08 s\n",
+      "\tCPU time Spent:  72.08 s\n",
+      "\tGeneration: 17576\n",
+      "\tBest fitness: 8.625240888838379e-16\n",
+      "\tEvaluations of fitness: 4394050\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 74.08 s\n",
+      "\tCPU time Spent:  74.08 s\n",
+      "\tGeneration: 18060\n",
+      "\tBest fitness: 8.625240888838379e-16\n",
+      "\tEvaluations of fitness: 4515050\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 76.08 s\n",
+      "\tCPU time Spent:  76.08 s\n",
+      "\tGeneration: 18556\n",
+      "\tBest fitness: 8.625240888838379e-16\n",
+      "\tEvaluations of fitness: 4639050\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 78.08 s\n",
+      "\tCPU time Spent:  78.08 s\n",
+      "\tGeneration: 19048\n",
+      "\tBest fitness: 8.625240888838379e-16\n",
+      "\tEvaluations of fitness: 4762050\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 80.08 s\n",
+      "\tCPU time Spent:  80.08 s\n",
+      "\tGeneration: 19537\n",
+      "\tBest fitness: 8.625240888838379e-16\n",
+      "\tEvaluations of fitness: 4884300\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 82.09 s\n",
+      "\tCPU time Spent:  82.09 s\n",
+      "\tGeneration: 20028\n",
+      "\tBest fitness: 8.625240888838379e-16\n",
+      "\tEvaluations of fitness: 5007050\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 84.09 s\n",
+      "\tCPU time Spent:  84.09 s\n",
+      "\tGeneration: 20525\n",
+      "\tBest fitness: 6.579305962874872e-16\n",
+      "\tEvaluations of fitness: 5131300\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 86.09 s\n",
+      "\tCPU time Spent:  86.09 s\n",
+      "\tGeneration: 21025\n",
+      "\tBest fitness: 6.579305962874872e-16\n",
+      "\tEvaluations of fitness: 5256300\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 88.09 s\n",
+      "\tCPU time Spent:  88.09 s\n",
+      "\tGeneration: 21525\n",
+      "\tBest fitness: 6.579305962874872e-16\n",
+      "\tEvaluations of fitness: 5381300\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 90.09 s\n",
+      "\tCPU time Spent:  90.09 s\n",
+      "\tGeneration: 22023\n",
+      "\tBest fitness: 6.579305962874872e-16\n",
+      "\tEvaluations of fitness: 5505800\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 92.1 s\n",
+      "\tCPU time Spent:  92.1 s\n",
+      "\tGeneration: 22511\n",
+      "\tBest fitness: 6.579305962874872e-16\n",
+      "\tEvaluations of fitness: 5627800\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 94.1 s\n",
+      "\tCPU time Spent:  94.1 s\n",
+      "\tGeneration: 22980\n",
+      "\tBest fitness: 4.98908645579392e-16\n",
+      "\tEvaluations of fitness: 5745050\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 96.1 s\n",
+      "\tCPU time Spent:  96.1 s\n",
+      "\tGeneration: 23476\n",
+      "\tBest fitness: 4.98908645579392e-16\n",
+      "\tEvaluations of fitness: 5869050\n",
+      "\n",
+      "Optimizing Sphere function using Basic ES:\n",
+      "\tReal time Spent: 98.11 s\n",
+      "\tCPU time Spent:  98.11 s\n",
+      "\tGeneration: 23976\n",
+      "\tBest fitness: 4.560429407606584e-18\n",
+      "\tEvaluations of fitness: 5994050\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "# Define the parameters of the optimization process\n",
+    "params = {\"stop_cond\": \"time_limit\", \"time_limit\": 100.0, \"verbose\": True, \"v_timer\": 2}\n",
+    "\n",
+    "# Define the parameters of the algorithm\n",
+    "n_parents = 50\n",
+    "n_offspring = 250\n",
+    "\n",
+    "# Define the objective function\n",
+    "objfunc = Sphere(3)\n",
+    "\n",
+    "# Define a population initialization module\n",
+    "pop_init = UniformVectorInitializer(\n",
+    "    objfunc.vecsize, objfunc.low_lim, objfunc.up_lim, pop_size=n_parents\n",
+    ")\n",
+    "\n",
+    "# Instanciate the newly created algorithm\n",
+    "algorithm = BasicES(pop_init, n_parents, n_offspring, 1e-3)\n",
+    "\n",
+    "# Define a Search method\n",
+    "search = GeneralAlgorithm(objfunc, algorithm, params)\n",
+    "\n",
+    "# Optimize the objective function\n",
+    "best_solution, best_fitness = search.optimize()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Best solution: [-1.02680397e-09  1.47654867e-09 -1.15148037e-09]\n",
+      "Solution fitness: 4.560429407606584e-18\n",
+      "\n",
+      "Number of generations: 24449\n",
+      "Real time spent: 100.0022s\n",
+      "CPU time spent: 99.92299s\n",
+      "Number of fitness evaluations: 6112300\n",
+      "Best fitness: 4.560429407606584e-18\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "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qQVeT01NJSoq6qzvcTqdOJ3OQq+HhIS4tbzk7zJz93xFREQEzpw549b5ef0p+UFBQbRo0YIlS5a4XsvLy2PJkiXEx8fbmExERES8iddvKQIYPXo0t9xyCy1btqRVq1ZMmTKFkydPMmTIELujiYiIiJfwiVI0YMAADh8+zPjx40lJSeHyyy9n8eLFhQ6+FhERETkXn7hO0cXSxRtFRES8j7u/v73+mCIRERERd1ApEhEREUGlSERERARQKRIREREBVIpEREREAJUiEREREUClSERERARQKRIREREBVIpEREREAB+5zcfFyr+od2ZmptvmmZWVRV5enmu+7r6Tr4iISGmX/73trptzqBQBx48fByA2NrZY5h8dHV0s8xURERHrezwsLOyi56N7nwF5eXkcPHiQ8uXL43A43DbfzMxMYmNj2b9/v9vuqSbnpvVd8rTOS5bWd8nS+i5Zf2d9G2M4fvw4MTEx+Pld/BFB2lIE+Pn5Ua1atWKbf2hoqP6DKkFa3yVP67xkaX2XLK3vklXU9e2OLUT5dKC1iIiICCpFIiIiIoBKUbFyOp1MmDABp9Npd5RSQeu75Gmdlyyt75Kl9V2yPGF960BrEREREbSlSERERARQKRIREREBVIpEREREAJUiEREREUClqFhNnTqVmjVrEhwcTFxcHN99953dkTzeY489hsPhKPBo0KCBa/ypU6cYMWIEFStWpFy5cvTr14/U1NQC89i3bx/du3cnJCSEKlWqcP/99xe699zy5ctp3rw5TqeTunXrMmPGjJJYPNutXLmSf/zjH8TExOBwOPj0008LjDfGMH78eKKjoylTpgwJCQns3LmzwDTHjh1j0KBBhIaGEh4eztChQzlx4kSBaTZt2kTbtm0JDg4mNjaW5557rlCWOXPm0KBBA4KDg2nSpAkLFy50+/La7Xzr+9Zbby30771r164FptH6vnATJ07kiiuuoHz58lSpUoXevXuzffv2AtOU5N8QX/8OuJD13aFDh0L/xu+8884C03jU+jZSLD788EMTFBRk3n33XfPjjz+aYcOGmfDwcJOammp3NI82YcIEc+mll5pDhw65HocPH3aNv/POO01sbKxZsmSJWbdunWndurW58sorXePPnDljGjdubBISEswPP/xgFi5caCpVqmTGjRvnmmbPnj0mJCTEjB492vz000/mlVdeMf7+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lStXmr1795qvv/7afPDBB8X82xGRC6VSJCIXJTMz0wQGBpo5c+a4XktPTzchISHm3nvvNT///LPx9/c3v/zyS4H3dezY0YwbN84YY5UiwOzatcs1furUqSYyMtL1c506dQoViCeffNLEx8cbY34vRVOmTDlv5u7du5sxY8a4fm7fvr2rwOX7cym68cYbTadOnQpMc//995tGjRq5fq5Ro4a56aabXD/n5eWZKlWqmNdee80YY8zdd99trrnmGpOXl3fejCJS8gJs3UwlIl5vz549nD59mlatWrleCwsLo379+gBs3ryZ3Nxc6tWrV+B92dnZVKxY0fVzSEgIderUcf0cHR1NWloaACdPnmT37t0MHTqUYcOGuaY5c+YMYWFhBebbsmXLAj/n5ubyzDPPMHv2bH755RdycnLIzs4mJCSkSMu5detWevXqVeC1q666iilTppCbm4u/vz8ATZs2dY13OBxERUW5luPWW2+lU6dO1K9fn65du9KjRw86d+5cpBwiUnxUikSkWJ04cQJ/f3/Wr1/vKg75ypUr5xoODAwsMM7hcGD+/+TYEydOAPDWW28RFxdXYLo/z7Ns2bIFfn7++ed56aWXmDJlCk2aNKFs2bKMGjWKnJyci1uwczjbcuTl5QHQvHlzkpOTWbRoEV999RX9+/cnISGBuXPnFksWESkalSIRuSi1a9cmMDCQtWvXUr16dQAyMjLYsWMH7dq1o1mzZuTm5pKWlkbbtm3/1mdERkYSExPDnj17GDRoUJHeu2rVKnr16sVNN90EQF5eHjt27KBRo0auaYKCgsjNzf3L+TRs2JBVq1YVmne9evUKFbO/EhoayoABAxgwYADXXXcdXbt25dixY0RERBRhqUSkOKgUichFKV++PLfccgv3338/ERERVKlShQkTJuDn54fD4aBevXoMGjSIwYMH88ILL9CsWTMOHz7MkiVLaNq0Kd27d7+gz3n88ce55557CAsLo2vXrmRnZ7Nu3Tp+/fVXRo8efc73XXLJJcydO5dvv/2WChUq8OKLL5KamlqgFNWsWZM1a9awd+9eypUrd9aCMmbMGK644gqefPJJBgwYQFJSEq+++mqBM+DO58UXXyQ6OppmzZrh5+fHnDlziIqKIjw8/ILnISLFR6fki8hFe/HFF4mPj6dHjx4kJCRw1VVXuU6dB5g+fTqDBw9mzJgx1K9fn969exfYsnQhbr/9dt5++22mT59OkyZNaN++PTNmzKBWrVp/+b5HHnmE5s2b06VLFzp06EBUVBS9e/cuMM3YsWPx9/enUaNGVK5cmX379hWaT/PmzZk9ezYffvghjRs3Zvz48TzxxBPceuutF7wM5cuX57nnnqNly5ZcccUV7N27l4ULF+Lnpz/FIp5AV7QWEbc7efIkVatW5YUXXmDo0KF2xxERuSDafSYiF+2HH35g27ZttGrVioyMDJ544gmAQmdriYh4MpUiEXGLSZMmsX37doKCgmjRogVff/01lSpVsjuWiMgF0+4zEREREXSgtYiIiAigUiQiIiICqBSJiIiIACpFIiIiIoBKkYiIiAigUiQiIiICqBSJiIiIACpFIiIiIoBKkYiIiAgA/wchuultmXzcVwAAAABJRU5ErkJggg==",
+      "text/plain": [
+       "<Figure size 640x480 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "print(f\"Best solution: {best_solution}\")\n",
+    "print(f\"Solution fitness: {best_fitness}\\n\")\n",
+    "search.display_report()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.11.4"
+  },
+  "orig_nbformat": 4,
+  "vscode": {
+   "interpreter": {
+    "hash": "e7370f93d1d0cde622a1f8e1c04877d8463912d04d973331ad4851f04de6915a"
+   }
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}


Test patch:
diff --git a/tests/test_real_vector.py b/tests/test_real_vector.py
index 4acd2f1..8f4ea26 100644
--- a/tests/test_real_vector.py
+++ b/tests/test_real_vector.py
@@ -6,10 +6,10 @@
 
 from metaheuristic_designer import ObjectiveFunc, ParamScheduler
 from metaheuristic_designer.selectionMethods import ParentSelection, SurvivorSelection
-from metaheuristic_designer.searchMethods import GeneralSearch, MemeticSearch
+from metaheuristic_designer.algorithms import GeneralAlgorithm, MemeticAlgorithm
 from metaheuristic_designer.operators import OperatorReal
 from metaheuristic_designer.initializers import UniformVectorInitializer
-from metaheuristic_designer.algorithms import *
+from metaheuristic_designer.strategies import *
 from metaheuristic_designer.benchmarks import Sphere
 
 import metaheuristic_designer as mhd
@@ -51,7 +51,7 @@ def test_hillclimb_empty():
 
 def test_hillclimb():
     search_strat = HillClimb(pop_init_single, mutation_op)
-    alg = GeneralSearch(objfunc, search_strat, params=test_params)
+    alg = GeneralAlgorithm(objfunc, search_strat, params=test_params)
     ind, fit = alg.optimize()
     assert alg.fit_history[0] > alg.fit_history[-1]
     assert search_strat.pop_size == 1
@@ -63,7 +63,7 @@ def test_localseach_empty():
 
 def test_localseach():
     search_strat = LocalSearch(pop_init_single, mutation_op)
-    alg = GeneralSearch(objfunc, search_strat, params=test_params)
+    alg = GeneralAlgorithm(objfunc, search_strat, params=test_params)
     ind, fit = alg.optimize()
     assert alg.fit_history[0] > alg.fit_history[-1]
     assert search_strat.pop_size == 1
@@ -71,7 +71,7 @@ def test_localseach():
 
 def test_sa():
     search_strat = SA(pop_init_single, mutation_op)
-    alg = GeneralSearch(objfunc, search_strat, params=test_params)
+    alg = GeneralAlgorithm(objfunc, search_strat, params=test_params)
     ind, fit = alg.optimize()
     assert alg.fit_history[0] > alg.fit_history[-1]
     assert search_strat.pop_size == 1
@@ -79,7 +79,7 @@ def test_sa():
 
 def test_random():
     search_strat = RandomSearch(pop_init)
-    alg = GeneralSearch(objfunc, search_strat, params=test_params)
+    alg = GeneralAlgorithm(objfunc, search_strat, params=test_params)
     ind, fit = alg.optimize()
     assert alg.fit_history[0] > alg.fit_history[-1]
     assert search_strat.pop_size == pop_init.pop_size
@@ -87,14 +87,14 @@ def test_random():
 
 def test_nosearch():
     search_strat = NoSearch(pop_init)
-    alg = GeneralSearch(objfunc, search_strat, params=test_params)
+    alg = GeneralAlgorithm(objfunc, search_strat, params=test_params)
     ind, fit = alg.optimize()
     assert search_strat.pop_size == pop_init.pop_size
 
 
 def test_staticpop():
     search_strat = StaticPopulation(pop_init, mutation_op, parent_sel_op, selection_op)
-    alg = GeneralSearch(objfunc, search_strat, params=test_params)
+    alg = GeneralAlgorithm(objfunc, search_strat, params=test_params)
     ind, fit = alg.optimize()
     assert alg.fit_history[0] > alg.fit_history[-1]
     assert search_strat.pop_size == pop_init.pop_size
@@ -104,7 +104,7 @@ def test_varpop():
     search_strat = VariablePopulation(
         pop_init, mutation_op, parent_sel_op, selection_op, 200
     )
-    alg = GeneralSearch(objfunc, search_strat, params=test_params)
+    alg = GeneralAlgorithm(objfunc, search_strat, params=test_params)
     ind, fit = alg.optimize()
     assert alg.fit_history[0] > alg.fit_history[-1]
     assert search_strat.pop_size == pop_init.pop_size
@@ -119,7 +119,7 @@ def test_es():
         selection_op,
         {"offspringSize": 200},
     )
-    alg = GeneralSearch(objfunc, search_strat, params=test_params)
+    alg = GeneralAlgorithm(objfunc, search_strat, params=test_params)
     ind, fit = alg.optimize()
     assert alg.fit_history[0] > alg.fit_history[-1]
     assert search_strat.pop_size == pop_init.pop_size
@@ -127,7 +127,7 @@ def test_es():
 
 def test_ga():
     search_strat = GA(pop_init, mutation_op, cross_op, parent_sel_op, selection_op)
-    alg = GeneralSearch(objfunc, search_strat, params=test_params)
+    alg = GeneralAlgorithm(objfunc, search_strat, params=test_params)
     ind, fit = alg.optimize()
     assert alg.fit_history[0] > alg.fit_history[-1]
     assert search_strat.pop_size == pop_init.pop_size
@@ -135,7 +135,7 @@ def test_ga():
 
 def test_hs():
     search_strat = HS(pop_init, {"HMCR": 0.8, "BW": 0.5, "PAR": 0.2})
-    alg = GeneralSearch(objfunc, search_strat, params=test_params)
+    alg = GeneralAlgorithm(objfunc, search_strat, params=test_params)
     ind, fit = alg.optimize()
     assert alg.fit_history[0] > alg.fit_history[-1]
     assert search_strat.pop_size == pop_init.pop_size
@@ -143,7 +143,7 @@ def test_hs():
 
 def test_de():
     search_strat = DE(pop_init, de_op)
-    alg = GeneralSearch(objfunc, search_strat, params=test_params)
+    alg = GeneralAlgorithm(objfunc, search_strat, params=test_params)
     ind, fit = alg.optimize()
     assert alg.fit_history[0] > alg.fit_history[-1]
     assert search_strat.pop_size == pop_init.pop_size
@@ -151,7 +151,7 @@ def test_de():
 
 def test_pso():
     search_strat = PSO(pop_init, {"w": 0.7, "c1": 1.5, "c2": 1.5})
-    alg = GeneralSearch(objfunc, search_strat, params=test_params)
+    alg = GeneralAlgorithm(objfunc, search_strat, params=test_params)
     ind, fit = alg.optimize()
     assert alg.fit_history[0] > alg.fit_history[-1]
     assert search_strat.pop_size == pop_init.pop_size
@@ -164,7 +164,7 @@ def test_cro():
         cross_op,
         {"rho": 0.5, "Fb": 0.75, "Fd": 0.2, "Pd": 0.7, "attempts": 4},
     )
-    alg = GeneralSearch(objfunc, search_strat, params=test_params)
+    alg = GeneralAlgorithm(objfunc, search_strat, params=test_params)
     ind, fit = alg.optimize()
     assert alg.fit_history[0] > alg.fit_history[-1]
     assert search_strat.pop_size <= pop_init.pop_size
@@ -176,7 +176,7 @@ def test_cro_sl():
         [mutation_op, cross_op],
         {"rho": 0.5, "Fb": 0.75, "Fd": 0.2, "Pd": 0.7, "attempts": 4},
     )
-    alg = GeneralSearch(objfunc, search_strat, params=test_params)
+    alg = GeneralAlgorithm(objfunc, search_strat, params=test_params)
     ind, fit = alg.optimize()
     assert alg.fit_history[0] > alg.fit_history[-1]
     assert search_strat.pop_size <= pop_init.pop_size
@@ -188,7 +188,7 @@ def test_pcro_sl():
         [mutation_op, cross_op],
         {"rho": 0.5, "Fb": 0.75, "Fd": 0.2, "Pd": 0.7, "attempts": 4},
     )
-    alg = GeneralSearch(objfunc, search_strat, params=test_params)
+    alg = GeneralAlgorithm(objfunc, search_strat, params=test_params)
     ind, fit = alg.optimize()
     assert alg.fit_history[0] > alg.fit_history[-1]
     assert search_strat.pop_size <= pop_init.pop_size
@@ -210,7 +210,7 @@ def test_dpcro_sl(dyn_method, dyn_metric):
         "prob_amp": 0.1,
     }
     search_strat = DPCRO_SL(pop_init, [mutation_op, cross_op], search_strat_params)
-    alg = GeneralSearch(objfunc, search_strat, params=test_params)
+    alg = GeneralAlgorithm(objfunc, search_strat, params=test_params)
     ind, fit = alg.optimize()
     assert alg.fit_history[0] > alg.fit_history[-1]
     assert search_strat.pop_size <= pop_init.pop_size
@@ -221,7 +221,7 @@ def test_memetic():
     mem_select = ParentSelection("Best", {"amount": 5})
     neihbourhood_op = OperatorReal("RandNoise", {"method": "Cauchy", "F": 0.0002})
     local_search = LocalSearch(pop_init, neihbourhood_op, params={"iters": 10})
-    alg = MemeticSearch(
+    alg = MemeticAlgorithm(
         objfunc, search_strat, local_search, mem_select, params=test_params
     )
     ind, fit = alg.optimize()
@@ -232,7 +232,7 @@ def test_memetic():
 def test_reporting():
     test_params["verbose"] = True
     search_strat = GA(pop_init, mutation_op, cross_op, parent_sel_op, selection_op)
-    alg = GeneralSearch(objfunc, search_strat, params=test_params)
+    alg = GeneralAlgorithm(objfunc, search_strat, params=test_params)
     ind, fit = alg.optimize()
     test_params["verbose"] = False
 
@@ -246,7 +246,7 @@ def test_reporting_memetic():
     mem_select = ParentSelection("Best", {"amount": 5})
     neihbourhood_op = OperatorReal("RandNoise", {"method": "Cauchy", "F": 0.0002})
     local_search = LocalSearch(pop_init, neihbourhood_op, params={"iters": 10})
-    alg = MemeticSearch(
+    alg = MemeticAlgorithm(
         objfunc, search_strat, local_search, mem_select, params=test_params
     )
     ind, fit = alg.optimize()