/**
   * This method allows you to learn from several examples
   *
   * @param examples A population of examples.
   * @param learnRate The learning rate.
   */
  public void learnFrom(Population examples, double learnRate) {
    InterfaceGAIndividual tmpIndy;
    BitSet tmpBitSet;

    for (int i = 0; i < examples.size(); i++) {
      tmpIndy = (InterfaceGAIndividual) (examples.getEAIndividual(i)).clone();
      tmpBitSet = tmpIndy.getBGenotype();
      for (int j = 0; j < this.m_ProbabilityVector.length; j++) {
        this.m_ProbabilityVector[j] = this.m_ProbabilityVector[j] * (1.0 - learnRate);
        if (tmpBitSet.get(j)) this.m_ProbabilityVector[j] += learnRate;
      }
    }
  }
  /** This method creates a new population based on the bit probability vector */
  public void initPBIL() {
    InterfaceGAIndividual tmpIndy,
        template = (InterfaceGAIndividual) ((AbstractEAIndividual) this.get(0)).clone();
    BitSet tmpBitSet;

    this.clear();
    for (int i = 0; i < this.getTargetSize(); i++) {
      tmpIndy = (InterfaceGAIndividual) ((AbstractEAIndividual) template).clone();
      tmpBitSet = tmpIndy.getBGenotype();
      for (int j = 0; j < this.m_ProbabilityVector.length; j++) {
        if (RNG.flipCoin(this.m_ProbabilityVector[j])) tmpBitSet.set(j);
        else tmpBitSet.clear(j);
      }
      tmpIndy.SetBGenotype(tmpBitSet);
      super.add(tmpIndy);
    }
  }