From ccf8ffe54b8ddb73ce8b806fe67afea2e5721019 Mon Sep 17 00:00:00 2001 From: "mhsatman@gmail.com" Date: Fri, 9 Aug 2024 21:10:04 +0300 Subject: [PATCH] introduce MutationOperator, RecombinationOperator, and SelectionOperator types --- src/mutation/bit_flip_mutation.py | 3 ++- src/mutation/byte_mutation.py | 3 ++- src/mutation/byte_mutation_random.py | 3 ++- src/mutation/float_uniform_mutation.py | 3 ++- src/mutation/insertion_mutation.py | 3 ++- src/mutation/mutation_operator.py | 3 +++ src/mutation/shuffle_mutation.py | 3 ++- src/mutation/swap_mutation.py | 3 ++- src/mutation/two_opt_mutation.py | 3 ++- src/optimizer.py | 26 ++++++++++--------- src/recombination/arithmetic_crossover.py | 3 ++- src/recombination/blxalpha_crossover.py | 3 ++- src/recombination/byte_one_point_crossover.py | 3 ++- src/recombination/byte_uniform_crossover.py | 3 ++- src/recombination/flat_crossover.py | 3 ++- src/recombination/linear_crossover.py | 3 ++- src/recombination/one_point_crossover.py | 4 ++- src/recombination/pmx_crossover.py | 3 ++- src/recombination/recombination_operator.py | 4 +++ src/recombination/two_point_crossover.py | 3 ++- src/recombination/unfair_avarage_crossover.py | 3 ++- src/recombination/uniform_crossover.py | 3 ++- src/selection/roulette_wheel_selection.py | 3 ++- src/selection/selection_operator.py | 4 +++ src/selection/tournament_selection.py | 4 ++- 25 files changed, 69 insertions(+), 33 deletions(-) create mode 100644 src/mutation/mutation_operator.py create mode 100644 src/recombination/recombination_operator.py create mode 100644 src/selection/selection_operator.py diff --git a/src/mutation/bit_flip_mutation.py b/src/mutation/bit_flip_mutation.py index 9cd8f94..5e67003 100644 --- a/src/mutation/bit_flip_mutation.py +++ b/src/mutation/bit_flip_mutation.py @@ -1,8 +1,9 @@ import numpy as np from individual import * from problems.abstract_problem import AbstractProblem +from mutation.mutation_operator import MutationOperator -class BitFlipMutation: +class BitFlipMutation(MutationOperator): """ BitFlipMutation performs a bit flip mutation on an individual in a Genetic Algorithm. diff --git a/src/mutation/byte_mutation.py b/src/mutation/byte_mutation.py index d0fed96..2cd81e9 100644 --- a/src/mutation/byte_mutation.py +++ b/src/mutation/byte_mutation.py @@ -2,8 +2,9 @@ from individual import * from problems.abstract_problem import AbstractProblem import struct +from mutation.mutation_operator import MutationOperator -class ByteMutation: +class ByteMutation(MutationOperator): """ ByteMutation operator defined in (Satman, 2013). ByteMutation performs a byte-wise mutation on an individual's chromosome in a Genetic Algorithm. diff --git a/src/mutation/byte_mutation_random.py b/src/mutation/byte_mutation_random.py index dab46bf..45f6b2b 100644 --- a/src/mutation/byte_mutation_random.py +++ b/src/mutation/byte_mutation_random.py @@ -2,8 +2,9 @@ from individual import * from problems.abstract_problem import AbstractProblem import struct +from mutation.mutation_operator import MutationOperator -class ByteMutationRandom: +class ByteMutationRandom(MutationOperator): """ ByteMutationRandom operator defined in (Satman, 2013). ByteMutationRandom performs a random byte mutation on an individual's chromosome in a Genetic Algorithm. diff --git a/src/mutation/float_uniform_mutation.py b/src/mutation/float_uniform_mutation.py index 14d9809..3f7b990 100644 --- a/src/mutation/float_uniform_mutation.py +++ b/src/mutation/float_uniform_mutation.py @@ -1,8 +1,9 @@ import random from individual import * from problems.abstract_problem import AbstractProblem +from mutation.mutation_operator import MutationOperator -class FloatUniformMutation: +class FloatUniformMutation(MutationOperator): """ FloatUniformMutation performs a uniform mutation on an individual's chromosome in a Genetic Algorithm. diff --git a/src/mutation/insertion_mutation.py b/src/mutation/insertion_mutation.py index 54130da..aeab5bf 100644 --- a/src/mutation/insertion_mutation.py +++ b/src/mutation/insertion_mutation.py @@ -1,8 +1,9 @@ import numpy as np from individual import * from problems.abstract_problem import AbstractProblem +from mutation.mutation_operator import MutationOperator -class InsertionMutation: +class InsertionMutation(MutationOperator): """ InsertionMutation performs an insertion mutation on an individual's chromosome in a Genetic Algorithm. diff --git a/src/mutation/mutation_operator.py b/src/mutation/mutation_operator.py new file mode 100644 index 0000000..0e3adb4 --- /dev/null +++ b/src/mutation/mutation_operator.py @@ -0,0 +1,3 @@ +class MutationOperator: + def mutate(self): + pass \ No newline at end of file diff --git a/src/mutation/shuffle_mutation.py b/src/mutation/shuffle_mutation.py index 8e1cc81..9a4aa05 100644 --- a/src/mutation/shuffle_mutation.py +++ b/src/mutation/shuffle_mutation.py @@ -2,8 +2,9 @@ import random as rd from individual import * from problems.abstract_problem import AbstractProblem +from mutation.mutation_operator import MutationOperator -class ShuffleMutation: +class ShuffleMutation(MutationOperator): """ ShuffleMutation performs a shuffle mutation on an individual's chromosome in a Genetic Algorithm. diff --git a/src/mutation/swap_mutation.py b/src/mutation/swap_mutation.py index 6425cbd..e99bfea 100644 --- a/src/mutation/swap_mutation.py +++ b/src/mutation/swap_mutation.py @@ -1,8 +1,9 @@ import numpy as np from individual import * from problems.abstract_problem import AbstractProblem +from mutation.mutation_operator import MutationOperator -class SwapMutation: +class SwapMutation(MutationOperator): """ SwapMutation performs a swap mutation on an individual's chromosome in a Genetic Algorithm. diff --git a/src/mutation/two_opt_mutation.py b/src/mutation/two_opt_mutation.py index 1783ac5..e8cc3b5 100644 --- a/src/mutation/two_opt_mutation.py +++ b/src/mutation/two_opt_mutation.py @@ -1,8 +1,9 @@ import numpy as np from individual import * from problems.abstract_problem import AbstractProblem +from mutation.mutation_operator import MutationOperator -class TwoOptMutation: +class TwoOptMutation(MutationOperator): """ TwoOptMutation performs a 2-opt mutation on an individual's chromosome in a Genetic Algorithm. diff --git a/src/optimizer.py b/src/optimizer.py index 9811b0e..c0f21d9 100644 --- a/src/optimizer.py +++ b/src/optimizer.py @@ -1,6 +1,7 @@ # ------------------------------ selection --------------------------------- # from selection.roulette_wheel_selection import RouletteWheelSelection from selection.tournament_selection import TournamentSelection +from selection.selection_operator import SelectionOperator # -------------------------------------------------------------------------- # # ------------------------------ recombination ----------------------------- # @@ -16,7 +17,7 @@ from recombination.blxalpha_crossover import BlxalphaCrossover from recombination.linear_crossover import LinearCrossover from recombination.unfair_avarage_crossover import UnfairAvarageCrossover - +from recombination.recombination_operator import RecombinationOperator # -------------------------------------------------------------------------- # # -------------------------------- mutation -------------------------------- # @@ -28,6 +29,7 @@ from mutation.swap_mutation import SwapMutation from mutation.two_opt_mutation import TwoOptMutation from mutation.float_uniform_mutation import FloatUniformMutation +from mutation.mutation_operator import MutationOperator # -------------------------------------------------------------------------- # @@ -55,9 +57,9 @@ def cga( p_crossover: float, p_mutation: float, problem: AbstractProblem, - selection: Callable, - recombination: Callable, - mutation: Callable, + selection: SelectionOperator, + recombination: RecombinationOperator, + mutation: MutationOperator, mins : list[float] = [], maxs : list[float] = [] ) -> List: @@ -199,9 +201,9 @@ def sync_cga( p_crossover: float, p_mutation: float, problem: Callable[[List[float]], float], - selection: Callable, - recombination: Callable, - mutation: Callable, + selection: SelectionOperator, + recombination: RecombinationOperator, + mutation: MutationOperator, mins: List[float] = [], maxs: List[float] = [] ) -> List: @@ -340,9 +342,9 @@ def alpha_cga( p_crossover: float, p_mutation: float, problem: AbstractProblem, - selection: Callable, - recombination: Callable, - mutation: Callable, + selection: SelectionOperator, + recombination: RecombinationOperator, + mutation: MutationOperator, mins: List[float] = [], maxs: List[float] = [] ) -> List: @@ -504,7 +506,7 @@ def ccga( ch_size: int, gen_type: str, problem: AbstractProblem, - selection: Callable, + selection: SelectionOperator, mins: List[float] = [], maxs: List[float] = [] ) -> List: @@ -617,7 +619,7 @@ def mcccga( ch_size: int, gen_type: str, problem: Callable[[List[float]], float], - selection: Callable, + selection: SelectionOperator, mins: list[float], maxs: list[float] ) -> List: diff --git a/src/recombination/arithmetic_crossover.py b/src/recombination/arithmetic_crossover.py index 26b3d51..0792c5b 100644 --- a/src/recombination/arithmetic_crossover.py +++ b/src/recombination/arithmetic_crossover.py @@ -2,8 +2,9 @@ from individual import * from problems.abstract_problem import AbstractProblem from typing import List +from recombination.recombination_operator import RecombinationOperator -class ArithmeticCrossover: +class ArithmeticCrossover(RecombinationOperator): """ ArithmeticCrossover performs an arithmetic crossover operation on a pair of parent individuals to produce offspring individuals. diff --git a/src/recombination/blxalpha_crossover.py b/src/recombination/blxalpha_crossover.py index c7ad66d..4fae74d 100644 --- a/src/recombination/blxalpha_crossover.py +++ b/src/recombination/blxalpha_crossover.py @@ -2,8 +2,9 @@ from individual import * from problems.abstract_problem import AbstractProblem from typing import List +from recombination.recombination_operator import RecombinationOperator -class BlxalphaCrossover: +class BlxalphaCrossover(RecombinationOperator): """ BlxalphaCrossover performs BLX-alpha crossover on a pair of parent individuals to produce offspring individuals. diff --git a/src/recombination/byte_one_point_crossover.py b/src/recombination/byte_one_point_crossover.py index 73e08db..06ffcf8 100644 --- a/src/recombination/byte_one_point_crossover.py +++ b/src/recombination/byte_one_point_crossover.py @@ -3,8 +3,9 @@ from problems.abstract_problem import AbstractProblem from typing import List import struct +from recombination.recombination_operator import RecombinationOperator -class ByteOnePointCrossover: +class ByteOnePointCrossover(RecombinationOperator): """ ByteOnePointCrossover operator defined in (Satman, 2013). ByteOnePointCrossover performs a one-point crossover at the byte level on a pair of parent individuals to produce offspring individuals. diff --git a/src/recombination/byte_uniform_crossover.py b/src/recombination/byte_uniform_crossover.py index e884855..ba81ead 100644 --- a/src/recombination/byte_uniform_crossover.py +++ b/src/recombination/byte_uniform_crossover.py @@ -3,8 +3,9 @@ from problems.abstract_problem import AbstractProblem from typing import List import struct +from recombination.recombination_operator import RecombinationOperator -class ByteUniformCrossover: +class ByteUniformCrossover(RecombinationOperator): """ ByteUniformCrossover operator defined in (Satman, 2013). ByteUniformCrossover performs a uniform crossover at the byte level on a pair of parent individuals to produce offspring individuals. diff --git a/src/recombination/flat_crossover.py b/src/recombination/flat_crossover.py index 14e20a7..295d0f3 100644 --- a/src/recombination/flat_crossover.py +++ b/src/recombination/flat_crossover.py @@ -2,8 +2,9 @@ from individual import * from problems.abstract_problem import AbstractProblem from typing import List +from recombination.recombination_operator import RecombinationOperator -class FlatCrossover: +class FlatCrossover(RecombinationOperator): """ FlatCrossover performs a flat crossover on a pair of parent individuals to produce offspring individuals. diff --git a/src/recombination/linear_crossover.py b/src/recombination/linear_crossover.py index 62ecad7..27d1c0c 100644 --- a/src/recombination/linear_crossover.py +++ b/src/recombination/linear_crossover.py @@ -2,8 +2,9 @@ from individual import * from problems.abstract_problem import AbstractProblem from typing import List +from recombination.recombination_operator import RecombinationOperator -class LinearCrossover: +class LinearCrossover(RecombinationOperator): """ LinearCrossover performs a linear crossover on a pair of parent individuals to produce offspring individuals. diff --git a/src/recombination/one_point_crossover.py b/src/recombination/one_point_crossover.py index a3f8af3..d85825b 100644 --- a/src/recombination/one_point_crossover.py +++ b/src/recombination/one_point_crossover.py @@ -2,8 +2,10 @@ from individual import * from problems.abstract_problem import AbstractProblem from typing import List +from recombination.recombination_operator import RecombinationOperator -class OnePointCrossover: + +class OnePointCrossover(RecombinationOperator): """ OnePointCrossover performs a one-point crossover on a pair of parent individuals to produce offspring individuals. diff --git a/src/recombination/pmx_crossover.py b/src/recombination/pmx_crossover.py index 0dd110a..90848a0 100644 --- a/src/recombination/pmx_crossover.py +++ b/src/recombination/pmx_crossover.py @@ -1,8 +1,9 @@ from individual import * from problems.abstract_problem import AbstractProblem from typing import List +from recombination.recombination_operator import RecombinationOperator -class PMXCrossover: +class PMXCrossover(RecombinationOperator): """ PMXCrossover performs Partially Mapped Crossover (PMX) on a pair of parent individuals to produce offspring individuals. diff --git a/src/recombination/recombination_operator.py b/src/recombination/recombination_operator.py new file mode 100644 index 0000000..2d19af0 --- /dev/null +++ b/src/recombination/recombination_operator.py @@ -0,0 +1,4 @@ +class RecombinationOperator: + def get_recombinations(self) -> list: + pass + diff --git a/src/recombination/two_point_crossover.py b/src/recombination/two_point_crossover.py index a0bcb5a..1ee064e 100644 --- a/src/recombination/two_point_crossover.py +++ b/src/recombination/two_point_crossover.py @@ -2,8 +2,9 @@ from individual import Individual from problems.abstract_problem import AbstractProblem from typing import List +from recombination.recombination_operator import RecombinationOperator -class TwoPointCrossover: +class TwoPointCrossover(RecombinationOperator): """ TwoPointCrossover performs a two-point crossover on a pair of parent individuals to produce offspring individuals. diff --git a/src/recombination/unfair_avarage_crossover.py b/src/recombination/unfair_avarage_crossover.py index 19cfcea..dee8b62 100644 --- a/src/recombination/unfair_avarage_crossover.py +++ b/src/recombination/unfair_avarage_crossover.py @@ -2,8 +2,9 @@ from individual import * from problems.abstract_problem import AbstractProblem from typing import List +from recombination.recombination_operator import RecombinationOperator -class UnfairAvarageCrossover: +class UnfairAvarageCrossover(RecombinationOperator): """ UnfairAvarageCrossover performs an unfair average crossover on a pair of parent individuals to produce offspring individuals. diff --git a/src/recombination/uniform_crossover.py b/src/recombination/uniform_crossover.py index 68953f1..2ed30e2 100644 --- a/src/recombination/uniform_crossover.py +++ b/src/recombination/uniform_crossover.py @@ -2,8 +2,9 @@ from individual import * from problems.abstract_problem import AbstractProblem from typing import List +from recombination.recombination_operator import RecombinationOperator -class UniformCrossover: +class UniformCrossover(RecombinationOperator): """ UniformCrossover performs a uniform crossover on a pair of parent individuals to produce offspring individuals. diff --git a/src/selection/roulette_wheel_selection.py b/src/selection/roulette_wheel_selection.py index 1652463..9bfcd45 100644 --- a/src/selection/roulette_wheel_selection.py +++ b/src/selection/roulette_wheel_selection.py @@ -1,8 +1,9 @@ from typing import List from individual import Individual +from selection.selection_operator import SelectionOperator import random -class RouletteWheelSelection: +class RouletteWheelSelection(SelectionOperator): """ RouletteWheelSelection performs a roulette wheel selection on a population of individuals to select parent individuals for crossover. diff --git a/src/selection/selection_operator.py b/src/selection/selection_operator.py new file mode 100644 index 0000000..5eddafd --- /dev/null +++ b/src/selection/selection_operator.py @@ -0,0 +1,4 @@ +class SelectionOperator: + + def get_parents(self) -> list: + pass \ No newline at end of file diff --git a/src/selection/tournament_selection.py b/src/selection/tournament_selection.py index 37aa016..81cfe2d 100644 --- a/src/selection/tournament_selection.py +++ b/src/selection/tournament_selection.py @@ -1,8 +1,10 @@ from typing import List from individual import Individual +from selection.selection_operator import SelectionOperator import numpy as np -class TournamentSelection: + +class TournamentSelection(SelectionOperator): """ TournamentSelection performs a tournament selection on a population of individuals to select parent individuals for crossover.