code: @Override
      protected void searchStep() {
          // get random move
          Move<? super SolutionType> move = getNeighbourhood().getRandomMove(getCurrentSolution(), getRandom());
          // got move?
          if(move != null){
              // valid move?
              if(validate(move).passed()){
                  // valid move: improvement?
                  if(isImprovement(move)){
                      // improvement: always accept
                      accept(move);
                  } else {
                      // no improvement: accept with probability based on temperature and delta
                      double delta = computeDelta(evaluate(move), getCurrentSolutionEvaluation());
                      double r = getRandom().nextDouble();
                      if(Math.exp(delta/temperature) > r){
                          // accept inferior move
                          accept(move);
                      } else {
                          // reject inferior move
                          reject(move);
                      }
                  }
              } else {
                  // invalid move: reject
                  reject(move);
              }
          } else {
              // no move/neighbour found
              stop();            
          }
      }
docs: Creates a random neighbour of the current solution and accepts it as the new current solution
  if it is valid and either improves the current solution or
  \[
  e^{\frac{\Delta E}{T}} &gt; R(0,1)
  \]
  where \(\Delta E\) is the difference between the evaluation of the neighbour and that of the
  current solution, \(T\) is the temperature, and \(R(0,1)\) is a random number in the interval
  \([0,1]\) sampled using the search's dedicated random generator.
  
  @throws JamesRuntimeException if depending on malfunctioning components (problem, neighbourhood, ...)