code: @Override
      public <ActualSolutionType extends SolutionType> NormalizedEvaluation evaluate(Move<? super ActualSolutionType> move,
                                                                                     ActualSolutionType curSolution,
                                                                                     Evaluation curEvaluation,
                                                                                     DataType data) {
          // cast evaluation
          NormalizedEvaluation normalizedEval = (NormalizedEvaluation) curEvaluation;
          // retrieve original, unnormalized evaluation
          Evaluation eval = normalizedEval.getUnnormalizedEvaluation();
          // delta evaluation for original objective
          Evaluation newEval = obj.evaluate(move, curSolution, eval, data);
          // wrap in normalized evaluation
          NormalizedEvaluation newNormalizedEval = new NormalizedEvaluation(newEval, min, max);
          
          return newNormalizedEval;
          
      }
docs: Computes the normalized evaluation of the solution obtained by applying the given move
  to the current solution. Relies on delta evaluation performed by the original, unnormalized
  objective, whose result is wrapped in a {@link NormalizedEvaluation}.
  
  @param move move to evaluate
  @param curSolution current solution
  @param curEvaluation evaluation of current solution
  @param data underlying data used for evaluation
  @param <ActualSolutionType> the actual solution type of the problem that is being solved;
  a subtype of the solution types of both the objective and the applied move
  @return evaluation of modified solution obtained when applying the move to the current solution
  @throws IncompatibleDeltaEvaluationException if the delta evaluation of the original objective
  is not compatible with the received move type