code: @Override
      protected void searchStep() {
          // check: valid subset size range completely explored?
          if(validSubsetSizeRangeExplored()){
              // we are done
              stop();
          } else {
              int numAdd, numDel;
              if(isIncreasing()){
                  // perform L additions
                  numAdd = greedyMoves(l, singleAddNeigh);
                  // perform number of deletions (<= R) that yields a delta of |L-R|,
                  // taking into account the actual number of added items
                  numDel = numAdd - getDelta();
                  greedyMoves(numDel, singleDelNeigh);
              } else {
                  // perform R deletions
                  numDel = greedyMoves(r, singleDelNeigh);
                  // perform number of additions (<= L) that yields a delta of |L-R|,
                  // taking into account the actual number of deleted items
                  numAdd = numDel - getDelta();
                  greedyMoves(numAdd, singleAddNeigh);
              }
              if(numAdd == 0 || numDel == 0){
                  stop();
              }
          }
      }
docs: In every search step, the \(L\) best additions and \(R\) best deletions of a single item are performed.
  If \(L \gt R\), additions are performed first, else, deletions are performed first.