code: @Override
      public SubsetMove getRandomMove(SubsetSolution solution, Random rnd) {
          // get set of candidate IDs for deletion (fixed IDs are discarded)
          Set<Integer> delCandidates = getRemoveCandidates(solution);
          // compute number of deletions
          int curNumDel = numDeletions(delCandidates, solution);
          // return null if no removals are possible
          if(curNumDel == 0){
              return null;
          }
          // pick random IDs to remove from selection
          Set<Integer> del = SetUtilities.getRandomSubset(delCandidates, curNumDel, rnd);
          // create and return move
          return new GeneralSubsetMove(Collections.emptySet(), del);
      }
docs: Generates a move for the given subset solution that deselects a random subset of currently selected IDs.
  Whenever possible, the requested number of deletions is performed. However, taking into account the current
  number of selected items, the imposed minimum subset size (if set) and the fixed IDs (if any) may result in
  fewer deletions (as many as possible). If no items can be removed, <code>null</code> is returned.
  
  @param solution solution for which a random multi deletion move is generated
  @param rnd source of randomness used to generate random move
  @return random multi deletion move, <code>null</code> if no items can be removed