code: @Override
      public SubsetMove getRandomMove(SubsetSolution solution, Random rnd) {
          // get set of candidate IDs for addition (fixed IDs are discarded)
          Set<Integer> addCandidates = getAddCandidates(solution);
          // compute number of additions
          int curNumAdd = numAdditions(addCandidates, solution);
          // return null if no additions are possible
          if(curNumAdd == 0){
              return null;
          }
          // pick random IDs to add to selection
          Set<Integer> add = SetUtilities.getRandomSubset(addCandidates, curNumAdd, rnd);
          // create and return move
          return new GeneralSubsetMove(add, Collections.emptySet());
      }
docs: Generates a move for the given subset solution that selects a random subset of currently unselected IDs.
  Whenever possible, the requested number of additions is performed. However, taking into account the current
  number of unselected items, the imposed maximum subset size (if set) and the fixed IDs (if any) may result in
  fewer additions (as many as possible). If no items can be added, <code>null</code> is returned.
  
  @param solution solution for which a random multi addition move is generated
  @param rnd source of randomness used to generate random move
  @return random multi addition move, <code>null</code> if no items can be added