code: def scramble_mutation(random, candidate, args):
      
      rate = args.setdefault('mutation_rate', 0.1)
      if random.random() < rate:
          size = len(candidate)
          p = random.randint(0, size-1)
          q = random.randint(0, size-1)
          p, q = min(p, q), max(p, q)
          s = candidate[p:q+1]
          random.shuffle(s)
          return candidate[:p] + s[::-1] + candidate[q+1:]
      else:
          return candidate
docs: Return the mutants created by scramble mutation on the candidates.
  
      This function performs scramble mutation. It randomly chooses two
      locations along the candidate and scrambles the values within that
      slice. 
  
      .. Arguments:
         random -- the random number generator object
         candidate -- the candidate solution
         args -- a dictionary of keyword arguments
  
      Optional keyword arguments in args:
      
      - *mutation_rate* -- the rate at which mutation is performed (default 0.1)
        
      The mutation rate is applied to the candidate as a whole (i.e., it
      either mutates or it does not, based on the rate).