| 251 | |
| 252 | |
| 253 | class DQNAgent(object): |
| 254 | def __init__(self, state_size, action_size): |
| 255 | self.state_size = state_size |
| 256 | self.action_size = action_size |
| 257 | self.gamma = 0.95 # discount rate |
| 258 | self.epsilon = 1.0 # exploration rate |
| 259 | self.epsilon_min = 0.01 |
| 260 | self.epsilon_decay = 0.995 |
| 261 | self.model = LinearModel(state_size, action_size) |
| 262 | |
| 263 | def act(self, state): |
| 264 | if np.random.rand() <= self.epsilon: |
| 265 | return np.random.choice(self.action_size) |
| 266 | act_values = self.model.predict(state) |
| 267 | return np.argmax(act_values[0]) # returns action |
| 268 | |
| 269 | |
| 270 | def train(self, state, action, reward, next_state, done): |
| 271 | if done: |
| 272 | target = reward |
| 273 | else: |
| 274 | target = reward + self.gamma * np.amax(self.model.predict(next_state), axis=1) |
| 275 | |
| 276 | target_full = self.model.predict(state) |
| 277 | target_full[0, action] = target |
| 278 | |
| 279 | # Run one training step |
| 280 | self.model.sgd(state, target_full) |
| 281 | |
| 282 | if self.epsilon > self.epsilon_min: |
| 283 | self.epsilon *= self.epsilon_decay |
| 284 | |
| 285 | |
| 286 | def load(self, name): |
| 287 | self.model.load_weights(name) |
| 288 | |
| 289 | |
| 290 | def save(self, name): |
| 291 | self.model.save_weights(name) |
| 292 | |
| 293 | |
| 294 | def play_one_episode(agent, env, is_train): |