mga-ckx / selection.py
selection.py
Raw
import random

class BinaryTournamentSelection():

    def __init__(self):
        pass

    def execute(self, front: []) -> []:
        if front is None:
            raise Exception('The front is null')
        elif len(front) == 0:
            raise Exception('The front is empty')

        if len(front) == 1:
            result = front[0]
        else:
            # Sampling without replacement
            i, j = random.sample(range(0, len(front)), 2)
            solution1 = front[i]
            solution2 = front[j]

            flag = self.compare(solution1, solution2)

            if flag == -1:
                result = solution1
            elif flag == 1:
                result = solution2
            else:
                result = [solution1, solution2][random.random() < 0.5]

        return result
    
    def compare(self, solution1, solution2) -> int:
        if solution1 is None:
            raise Exception("The solution1 is None")
        elif solution2 is None:
            raise Exception("The solution2 is None")

        value1 = solution1.objectives[0]
        value2 = solution2.objectives[0]
        result = 0
        if value1 != value2:
            if value1 < value2:
                result = -1
            if value1 > value2:
                result = 1

        return result