En aquest projecte, desenvoluparem un agent de joc que utilitza tècniques d'aprenentatge automàtic per millorar el seu comportament a mesura que interactua amb l'entorn. Aquest projecte combinarà conceptes apresos en els mòduls anteriors, especialment del Mòdul 4: Aprenentatge Automàtic.

Objectius del Projecte

  1. Implementar un agent bàsic amb capacitat d'aprenentatge automàtic.
  2. Utilitzar xarxes neuronals per a la presa de decisions.
  3. Aplicar aprenentatge per reforç per millorar el comportament de l'agent.
  4. Integrar l'agent en un entorn de joc i avaluar el seu rendiment.

Requisits Previs

  • Coneixements bàsics de programació en Python.
  • Familiaritat amb biblioteques d'aprenentatge automàtic com TensorFlow o PyTorch.
  • Comprensió dels conceptes d'aprenentatge per reforç.

Passos del Projecte

  1. Definició de l'Entorn de Joc

Primer, definirem l'entorn en què l'agent operarà. Per a aquest projecte, utilitzarem un entorn senzill on l'agent ha de trobar un objectiu mentre evita obstacles.

Exemple de Codi: Definició de l'Entorn

import gym
from gym import spaces
import numpy as np

class SimpleEnv(gym.Env):
    def __init__(self):
        super(SimpleEnv, self).__init__()
        self.action_space = spaces.Discrete(4)  # 4 accions: amunt, avall, esquerra, dreta
        self.observation_space = spaces.Box(low=0, high=10, shape=(2,), dtype=np.float32)
        self.state = np.array([5, 5])
        self.goal = np.array([9, 9])
        self.obstacles = [np.array([3, 3]), np.array([7, 7])]

    def reset(self):
        self.state = np.array([5, 5])
        return self.state

    def step(self, action):
        if action == 0:
            self.state[1] += 1  # amunt
        elif action == 1:
            self.state[1] -= 1  # avall
        elif action == 2:
            self.state[0] -= 1  # esquerra
        elif action == 3:
            self.state[0] += 1  # dreta

        reward = -1
        done = False
        if np.array_equal(self.state, self.goal):
            reward = 10
            done = True
        elif any(np.array_equal(self.state, obs) for obs in self.obstacles):
            reward = -10
            done = True

        return self.state, reward, done, {}

    def render(self):
        grid = np.zeros((11, 11))
        grid[self.state[0], self.state[1]] = 1
        grid[self.goal[0], self.goal[1]] = 2
        for obs in self.obstacles:
            grid[obs[0], obs[1]] = -1
        print(grid)

  1. Creació de l'Agent amb Xarxes Neuronals

Implementarem una xarxa neuronal que l'agent utilitzarà per prendre decisions basades en l'estat actual de l'entorn.

Exemple de Codi: Xarxa Neuronal amb TensorFlow

import tensorflow as tf
from tensorflow.keras import layers

def create_model():
    model = tf.keras.Sequential()
    model.add(layers.Dense(24, input_shape=(2,), activation='relu'))
    model.add(layers.Dense(24, activation='relu'))
    model.add(layers.Dense(4, activation='linear'))
    model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001), loss='mse')
    return model

model = create_model()

  1. Implementació de l'Aprenentatge per Reforç

Utilitzarem l'algoritme Q-learning amb xarxes neuronals (Deep Q-Learning) per entrenar l'agent.

Exemple de Codi: Entrenament amb Deep Q-Learning

import random
from collections import deque

def train_agent(env, model, episodes=1000, gamma=0.99, epsilon=1.0, epsilon_min=0.01, epsilon_decay=0.995):
    memory = deque(maxlen=2000)
    for episode in range(episodes):
        state = env.reset()
        state = np.reshape(state, [1, 2])
        total_reward = 0
        for time in range(500):
            if np.random.rand() <= epsilon:
                action = random.randrange(4)
            else:
                q_values = model.predict(state)
                action = np.argmax(q_values[0])
            
            next_state, reward, done, _ = env.step(action)
            next_state = np.reshape(next_state, [1, 2])
            memory.append((state, action, reward, next_state, done))
            state = next_state
            total_reward += reward
            
            if done:
                print(f"Episode: {episode}/{episodes}, Score: {total_reward}, Epsilon: {epsilon:.2}")
                break
            
            if len(memory) > 32:
                minibatch = random.sample(memory, 32)
                for state, action, reward, next_state, done in minibatch:
                    target = reward
                    if not done:
                        target = reward + gamma * np.amax(model.predict(next_state)[0])
                    target_f = model.predict(state)
                    target_f[0][action] = target
                    model.fit(state, target_f, epochs=1, verbose=0)
        
        if epsilon > epsilon_min:
            epsilon *= epsilon_decay

train_agent(env, model)

  1. Integració i Avaluació de l'Agent

Després d'entrenar l'agent, l'integrarem en l'entorn de joc i avaluarem el seu rendiment.

Exemple de Codi: Avaluació de l'Agent

def evaluate_agent(env, model, episodes=100):
    total_rewards = 0
    for episode in range(episodes):
        state = env.reset()
        state = np.reshape(state, [1, 2])
        episode_reward = 0
        for time in range(500):
            q_values = model.predict(state)
            action = np.argmax(q_values[0])
            next_state, reward, done, _ = env.step(action)
            state = np.reshape(next_state, [1, 2])
            episode_reward += reward
            if done:
                break
        total_rewards += episode_reward
    avg_reward = total_rewards / episodes
    print(f"Average Reward over {episodes} episodes: {avg_reward}")

evaluate_agent(env, model)

Conclusió

En aquest projecte, hem desenvolupat un agent de joc que utilitza tècniques d'aprenentatge automàtic per millorar el seu comportament. Hem definit un entorn de joc, creat una xarxa neuronal per a la presa de decisions, implementat l'aprenentatge per reforç i avaluat el rendiment de l'agent. Aquest projecte proporciona una base sòlida per a desenvolupar agents més complexos i intel·ligents en futurs jocs.

Exercicis Pràctics

  1. Modifica l'entorn de joc per incloure més obstacles i objectius. Com afecta això l'entrenament de l'agent?
  2. Implementa una variant de l'algoritme Deep Q-Learning, com Double DQN, i compara els resultats.
  3. Ajusta els hiperparàmetres de l'algoritme d'aprenentatge per veure com afecten el rendiment de l'agent.

Errors Comuns i Consells

  • Sobreentrenament: Evita entrenar l'agent durant massa episodis sense variació en l'entorn, ja que pot conduir a sobreentrenament.
  • Exploració vs. Explotació: Assegura't de mantenir un bon equilibri entre exploració (provar noves accions) i explotació (utilitzar accions conegudes que donen bons resultats).
  • Escalatge de les Entrades: Escala les entrades de l'agent per assegurar-te que la xarxa neuronal pugui aprendre de manera eficient.

Amb aquests coneixements i pràctiques, estaràs ben preparat per desenvolupar agents intel·ligents i eficients per als teus propis projectes de videojocs.

© Copyright 2024. Tots els drets reservats