84 lines
2.6 KiB
Python
84 lines
2.6 KiB
Python
|
|
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)
|