code: def ring_topology(random, population, args):
      
      neighborhood_size = args.setdefault('neighborhood_size', 3)
      half_hood = neighborhood_size // 2
      neighbor_index_start = []
      for index in range(len(population)):
          if index < half_hood:
              neighbor_index_start.append(len(population) - half_hood + index)
          else:
              neighbor_index_start.append(index - half_hood)
      neighbors = []
      for start in neighbor_index_start:
          n = []
          for i in range(0, neighborhood_size):
              n.append(population[(start + i) % len(population)])
          yield n
docs: Returns the neighbors using a ring topology.
      
      This function sets all particles in a specified sized neighborhood
      as neighbors for a given particle. This is known as a ring 
      topology. The resulting list of lists of neighbors is returned.
      
      .. Arguments:
         random -- the random number generator object
         population -- the population of particles
         args -- a dictionary of keyword arguments
  
      Optional keyword arguments in args:
      
      - *neighborhood_size* -- the width of the neighborhood around a 
        particle which determines the size of the neighborhood
        (default 3)