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
- Implementar un agent bàsic amb capacitat d'aprenentatge automàtic.
- Utilitzar xarxes neuronals per a la presa de decisions.
- Aplicar aprenentatge per reforç per millorar el comportament de l'agent.
- 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
- 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)
- 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()
- 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)
- 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
- Modifica l'entorn de joc per incloure més obstacles i objectius. Com afecta això l'entrenament de l'agent?
- Implementa una variant de l'algoritme Deep Q-Learning, com Double DQN, i compara els resultats.
- 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.
IA per a Videojocs
Mòdul 1: Introducció a la IA en Videojocs
Mòdul 2: Navegació en Videojocs
Mòdul 3: Presa de Decisions
Mòdul 4: Aprenentatge Automàtic
- Introducció a l'Aprenentatge Automàtic
- Xarxes Neuronals en Videojocs
- Aprenentatge per Reforç
- Implementació d'un Agent d'Aprenentatge
Mòdul 5: Integració i Optimització
Mòdul 6: Projectes Pràctics
- Projecte 1: Implementació de Navegació Bàsica
- Projecte 2: Creació d'un NPC amb Presa de Decisions
- Projecte 3: Desenvolupament d'un Agent amb Aprenentatge Automàtic