require 'lib/ranking'

module Selection

  # The truncation selection method. This method selects only the best individuals from the population. 
  class Truncation

    # Set the ranker object (the instance of Ranking class) necessary for comparision of individuals.
    def initialize ranker
      raise "Truncation: invalid Ranking object" unless ranker.kind_of? Ranking     
      @ranker = ranker
      @population = nil     
    end
     
    # The population to select from.
    attr_accessor :population

    # Select N-best individuals from the population (N==how_much)
    def select( how_much, population=self.population )
      ranked = @ranker.rank( population ).map { |individual| individual.original }
      @population = population
     
      ranked[0...how_much]
    end

    # Select only the best individual from the population.
    def select_one population=self.population
      select( 1, population ).first
    end

  end
  
end