39 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			39 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import numpy as np
 | |
| 
 | |
| 
 | |
| class OUNoise(object):
 | |
|     """Class for Ornstein-Uhlenbeck process, as used for exploration in DDPG.
 | |
|     Usage:
 | |
|     ::
 | |
| 
 | |
|         # init
 | |
|         self.noise = OUNoise()
 | |
|         # generate noise
 | |
|         noise = self.noise(logits.shape, eps)
 | |
| 
 | |
|     For required parameters, you can refer to the stackoverflow page. However,
 | |
|     our experiment result shows that (similar to OpenAI SpinningUp) using
 | |
|     vanilla gaussian process has little difference from using the
 | |
|     Ornstein-Uhlenbeck process.
 | |
|     """
 | |
| 
 | |
|     def __init__(self, sigma=0.3, theta=0.15, dt=1e-2, x0=None):
 | |
|         self.alpha = theta * dt
 | |
|         self.beta = sigma * np.sqrt(dt)
 | |
|         self.x0 = x0
 | |
|         self.reset()
 | |
| 
 | |
|     def __call__(self, size, mu=.1):
 | |
|         """Generate new noise. Return a ``numpy.ndarray`` which size is equal
 | |
|         to ``size``.
 | |
|         """
 | |
|         if self.x is None or self.x.shape != size:
 | |
|             self.x = 0
 | |
|         r = self.beta * np.random.normal(size=size)
 | |
|         self.x = self.x + self.alpha * (mu - self.x) + r
 | |
|         return self.x
 | |
| 
 | |
|     def reset(self):
 | |
|         """Reset to the initial state."""
 | |
|         self.x = None
 |