input: 
  def optimize(fn, params):
      """Optimizes the given function by varying the parameters within a range and
      returns the best parameters that yield the highest result.
  
      >>> class Params:
      ...     def __init__(self, a, b, c):
      ...         self.a = a
      ...         self.b = b
      ...         self.c = c
      ...     def __repr__(self):
      ...         return f"Params(a={self.a}, b={self.b}, c={self.c})"
      >>> def get_result(params):
      ...     return params.a + params.b + params.c
      >>> params = Params(a=1, b=2, c=3)
      >>> optimize(get_result, params)
      {'a': 11, 'b': 12, 'c': 13}
      """
      best_score = 0
      best_params = None
      for a in range(params.a - 10, params.a + 10):
          for b in range(params.b - 10, params.b + 10):
              for c in range(params.c - 10, params.c + 10):
                  score = fn(Params(a, b , c))
                  if score > best_score:
                      best_score = score
                      best_params = {
                          'a': a,
                          'b': b,
                          'c': c
                      }
      return best_params
  
output:     best_score = 0
      best_params = None
      for a in range(params.a - 10, params.a + 10):
          for b in range(params.b - 10, params.b + 10):
              for c in range(params.c - 10, params.c + 10):
                  score = fn(Params(a, b , c))
                  if score > best_score:
                      best_score = score
                      best_params = {
                          'a': a,
                          'b': b,
                          'c': c
                      }
      return best_params