from problem_interface import * from nombre import * class Problem_1(Problem_Interface) : """ classe probleme n°1 : nombre à trouver pour f(x) = x_max """ def __init__(self, size, f): self.__size = size self.__f = f def create_individual(self): ''' create a randomly generated indidivual for this problem :return: a randomly generated individual gfor this problem :rtype: an Individual object ''' return Nombre((self.__size)) def evaluate_fitness(self, individual): ''' compute the fitness of individual for this problem :param individual: the individual to consider :type individual: an Individual object :return: the fitness of individual for this problem :rtype: an Individual object ''' return self.__f(bin_deci(individual.get_value())) def sort_population(self, population): ''' sort population from best fitted to worst fitted individuals. Depending on the problem, it can correspond to ascending or descending order with respect to the fitness function. side effect : population is modified by this method :param population: the list of individuals to sort :type population: list(Individual) ''' population.sort(key = lambda x: x.get_score()) def best_individual(self, population): ''' return the best fitted individual from population. Depending on the problem, it can correspond to the individual with the highest or the lowest fitness value. :param population: the list of individuals to sort :type population: list(Individual) :return: the best fitted individual of population :rtype: an Individual object ''' self.sort_population(population) return population[len(population) -1 ] def tournament(self, first, second): ''' perform a rounament between two individuals, the winner is the most fitted one, it is returned :param first: an individual :type first: an Indivdual object :param second: an individual :type second: an Individual object :return: the winner of the tournament :rtype: Individual object ''' if first.get_score() > second.get_score(): res = first else: res = second return res return first if first.get_score() > second.get_score() else second def bin_deci(chaine): return int(chaine,2)