File size: 930 Bytes
bbf97b5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import random
from collections import defaultdict

class RLAgent:
    def __init__(self, actions, alpha=0.1, gamma=1.0, epsilon=0.1, method='sarsa'):
        self.Q = defaultdict(lambda: {a: 0.0 for a in actions})
        self.visits = defaultdict(int)
        self.alpha = alpha
        self.gamma = gamma
        self.epsilon = epsilon
        self.actions = actions
        self.method = method

    def choose_action(self, state):
        self.visits[state] += 1
        if random.random() < self.epsilon:
            return random.choice(self.actions)
        return max(self.Q[state], key=self.Q[state].get)

    def update(self, s, a, r, s_, a_):
        predict = self.Q[s][a]
        if self.method == 'sarsa':
            target = r + self.gamma * self.Q[s_][a_]
        else:
            target = r + self.gamma * max(self.Q[s_].values())
        self.Q[s][a] += self.alpha * (target - predict)