class_docstr: An implementation of a Genetic Algorithm which will try to produce the user
  specified target string.
  
  Parameters:
  -----------
  target_string: string
      The string which the GA should try to produce.
  population_size: int
      The number of individuals (possible solutions) in the population.
  mutation_rate: float
      The rate (or probability) of which the alleles (chars in this case) should be
      randomly changed.
docstr: Initialize population with random strings 
code: def _initialize(self):
      """Initialize population with random strings"""
      self.population = []
      for _ in range(self.population_size):
          # Select random letters as new individual
          individual = "".join(
              np.random.choice(self.letters, size=len(self.target))
          )
          self.population.append(individual)
  
file_path: ML-From-Scratch/mlfromscratch/unsupervised_learning/genetic_algorithm.py
imports: from __future__ import print_function, division
  import string
  import numpy
label_desc: Use image node_id 2 for calling the GeneticAlgorithm obj's underlying member method code with example usage: obj._initialize() without return types