code: protected Evaluation evaluate(Move<? super SolutionType> move){
          Evaluation eval = null;
          // check cache
          if(cache != null){
              eval = cache.getCachedMoveEvaluation(move);
          }
          if(eval != null){
              // cache hit: return cached value
              return eval;
          } else {
              // cache miss: evaluate and cache
              eval = getProblem().evaluate(move, getCurrentSolution(), getCurrentSolutionEvaluation());
              if(cache != null){
                  cache.cacheMoveEvaluation(move, eval);
              }
              return eval;
          }
      }
docs: Evaluates a move to be applied to the current solution. If this move has been evaluated
  before and the obtained evaluation is still available in the cache, the cached evaluation
  will be returned. Else, the evaluation will be computed and offered to the cache.
  
  @param move move to be applied to the current solution
  @return evaluation of obtained neighbour, possibly retrieved from the evaluated move cache