Rob
Rob

Reputation: 73

Why am I getting a 'missing 1 required positional argument:' error?

I get the error message init() missing 1 required positional argument: 'environment' for the line player_o = QLearningAgent(). Am not experienced in writing constructors. Please can you explain why I get this message and how I can correct it?

class RandomAgent:
    def choose_action(self, env):
        action = np.random.choice(np.array(env.available_actions))
        return action


class QLearningAgent:
    def __init__(self, environment, alpha=0.1, epsilon=0.2, gamma=1):
        self.environment = environment
        self.alpha = alpha
        self.epsilon = epsilon
        self.gamma = gamma
        self.Q = {}
        self.opponent_rewards = []  

        def choose_q_action()...

def play(env, player_o, player_x, episodes=1):
    rewards_per_episode = np.zeros(episodes)
    for episode in range(episodes):
        env.reset()
        # Let random player play first!
        x_action_index = player_x.choose_action(env)
        reward, game_over = env.act(x_action_index)
        while not game_over:
            o_action_index = player_o.choose_action(env)
            reward, game_over = env.act(o_action_index)
            if not game_over:
                x_action_index = player_x.choose_action(env)
                reward, game_over = env.act(x_action_index)
        rewards_per_episode[episode] = reward
    return rewards_per_episode


env = connect.Connect(verbose=False)

m = 10
n = 200
k = 30

# Test a random agent at episodes 0, n, 2n, ...., kn for m games.
np.random.seed(3)
rewards = np.zeros(k)

# player_o is the agent to test
# player_x should always be a random agent
player_o = QLearningAgent()
player_x = RandomAgent()

for kx in range(k):
    rewards_per_episode = play(env,
                               player_o=player_o,
                               player_x=player_x,
                               episodes=m)
    mean_reward = np.mean(rewards_per_episode)
    rewards[kx] = mean_reward

line1, = plt.plot(rewards)
plt.legend([line1], ["Random Agent"])
plt.show()

Upvotes: 1

Views: 1406

Answers (1)

Daniel Walker
Daniel Walker

Reputation: 6740

QLearningAgent's __init__ method requires an environment argument which you're not passing.

Upvotes: 3

Related Questions