docs: @Override
  	public void updateReferencePoint(List<S> population) {
  		List<Double> iterationMaxs = new ArrayList<>(maxs.size());
  		
  		for (int i = 0; i < this.getProblem().getNumberOfObjectives(); i++) {		
  			iterationMaxs.add(Double.NEGATIVE_INFINITY);
  		}
  		
  		for (S solution : population) {
  			updateReferencePoint(solution);
  			for (int i = 0; i < solution.getNumberOfObjectives(); i++) {				
  				iterationMaxs.set(i, Math.max(iterationMaxs.get(i), solution.getObjective(i)));				
  			}
  		}
  		
  		history.add(iterationMaxs);
  		
  		List<Double> mean = history.mean();
  		List<Double> var  = history.variance(mean);
  			
  		Double maxVariance = this.getMax(var);						
  			
  		if (maxVariance > alpha) {
  			Double maxInNadir = this.getMax(this.maxs);
  			for (int i = 0; i < this.getProblem().getNumberOfObjectives(); i++) 
  				this.maxs.set(i, maxInNadir);						
  		} else {						
  			for (int i = 0; i < this.getProblem().getNumberOfObjectives(); i++) {
  				if (Math.abs(maxs.get(i) - this.getReferencePoint().get(i)) < this.epsilon) {
  					Double maxInMaxs = this.getMax(this.maxs);
  					this.maxs.set(i,maxInMaxs);
  					history.mark(i);
  				} else if (iterationMaxs.get(i) > this.maxs.get(i)) {
  					this.maxs.set(i, iterationMaxs.get(i) + Math.abs(iterationMaxs.get(i)-this.maxs.get(i)));
  					history.mark(i);
  				} else if ((var.get(i)==0.0) && history.isUnMarked(i)) {
  					double v = history.getMaxObjective(i);
  					this.maxs.set(i, (maxs.get(i)+v)/2.0);
  					history.mark(i);
  				}
  				history.decreaseMark(i);
  			}						
  		}
  	}