code: protected boolean accept(Move<? super SolutionType> move){
          // validate move (often retrieved from cache)
          Validation newValidation = validate(move);
          if(newValidation.passed()){
              // evaluate move (often retrieved from cache)
              Evaluation newEvaluation = evaluate(move);
              // apply move to current solution (IMPORTANT: after evaluation/validation of the move!)
              move.apply(getCurrentSolution());
              // update current solution and best solution
              updateCurrentAndBestSolution(getCurrentSolution(), newEvaluation, newValidation);
              // increase accepted move counter
              incNumAcceptedMoves(1);
              // update successful
              return true;
          } else {
              // update cancelled: invalid neighbour
              return false;
          }
      }
docs: Accept the given move by applying it to the current solution. Updates the evaluation and validation of
  the current solution and checks whether a new best solution has been found. The updates only take place
  if the applied move yields a valid neighbour, else calling this method does not have any effect and
  <code>false</code> is returned.
  <p>
  After updating the current solution, the evaluated move cache is cleared as this cache is no longer valid
  for the new current solution. Furthermore, any local search listeners are informed and the number of
  accepted moves is updated.
  
  @param move accepted move to be applied to the current solution
  @return <code>true</code> if the update has been successfully performed,
  <code>false</code> if the update was canceled because the obtained
  neighbour is invalid