code: @Override
      protected void searchStep() {
          // stop if no more neighbourhoods available
          if(k >= getNeighbourhoods().size()){
              stop();
          } else {
              // use k-th neighbourhood to get best valid move with positive delta, if any
              Neighbourhood<? super SolutionType> neigh = getNeighbourhoods().get(k);
              Move<? super SolutionType> move = getBestMove(
                                                  neigh.getAllMoves(getCurrentSolution()),    // generate all moves
                                                  true);                                      // only improvements
              // found improvement ?
              if(move != null){
                  // improvement: accept move and reset k
                  accept(move);
                  k = 0;
              } else {
                  // switch to next neighbourhood (to be used in next step)
                  k++;
              }
          }
      }
docs: Investigates all neighbours of the current solution, using the k-th neighbourhood, and adopts the best one
  as the new current solution, if it is an improvement. If no improvement is found, k is increased. Upon each
  improvement, k is reset to 0, and when k has reached the number of available neighbourhoods, the search stops.
  
  @throws JamesRuntimeException if depending on malfunctioning components (problem, neighbourhood, ...)