class Environment():
    contrainsts = None
    turns = 1000
    convergence = 100
    population = None
    population_size = 20

    def __init__(self, filename=None, population_size=20, turns=100000, convergence=0.97):
        
        if filename is None:
            self.contrainsts = Event(size=20)
        else:
            self.contrainsts = Event(filename=filename)
        self.turns = turns
        self.convergence = convergence
        self.population_size = population_size


    def generatePopulation(self):
        self.population = Population(self.population_size, self.contrainsts)

    def makeNewGeneration(self):
        new_population = Population()
        elected = self.population.getTheBest()
        new_population.add(elected)

        while len(new_population) < self.population_size:
            couple = self.population.selectACouple()
            child = Person.copulate(couple['man'], couple['woman'], self.contrainsts)
            if child is not None:
                new_population.add(child)

        self.population = new_population

    def adapt(self):
        self.generatePopulation()
        #best_person = self.population.getTheBest()
        
        for turn in range(self.turns):
            self.makeNewGeneration()
            person = self.population.getTheBest()
            #convergence = self.population.calculateConvergence()
            #print "convergence is: "+str(convergence)
            print " i: "+str(turn)+" person "+str(person)
            #if person.weight < best_person.weight:
            #   best_person = person

            #if convergence >= self.convergence:
            #    break

        return self.population.getTheBest()