"""
    rampedHalfHalfGenerator(gpExperimentInfo::GPExperimentInfo, popSize::Integer,
                            rng::Random.AbstractRNG, RHHFactor::AbstractFloat = 0.5)

Initializes a population for a GP problem by the \"ramped half and half\" method,
which creates part of it using the full method, and the other part using the grow
method.

`Self-provided Arguments` are provided by the library, so only `User Arguments` must be provided.

# Self-provided Arguments
- `gpExperimentInfo::GPExperimentInfo`: information about the GP experiment.
- `popSize::Integer`: size of the population that is going to be created, that is
    to say, the number of individuals of the population.
- `rng::Random.AbstractRNG`: random number generator for random number consistency
    along an experiment.

# User arguments
- `RHHFactor::AbstractFloat = 0.5`: percentage of the population that is going to
    be created by the \"full\" method, the remaining percentage will be created by
    the \"grow\" method.

# Returns
A population of GP individuals generated by the \"ramped half and half\" method.
"""
function rampedHalfHalfGenerator(gpExperimentInfo::GPExperimentInfo, popSize::Integer,
                                 rng::Random.AbstractRNG, RHHFactor::AbstractFloat = 0.5)

    indType = typeof(growGenerator(gpExperimentInfo, rng))
    population = Array{indType}(undef, popSize)
    N = popSize - round(Integer, popSize * RHHFactor)

    for i = 1:(popSize-N)
        population[i] = fullGenerator(gpExperimentInfo, rng)
    end

    for i = (popSize-N+1):popSize
        population[i] = growGenerator(gpExperimentInfo, rng)
    end

    return Random.shuffle(rng, population)
end # function
