Els arbres de decisió són una tècnica fonamental en la presa de decisions per a IA en videojocs. Aquesta tècnica permet als personatges del joc prendre decisions complexes basades en una sèrie de condicions i accions predefinides. En aquesta secció, explorarem els conceptes bàsics dels arbres de decisió, com es construeixen i com es poden implementar en un videojoc.
Conceptes Bàsics
Què és un Arbre de Decisió?
Un arbre de decisió és una estructura de dades en forma d'arbre que representa una sèrie de decisions i les seves possibles conseqüències. Cada node de l'arbre representa una decisió o una condició, i cada branca representa el resultat d'aquesta decisió o condició.
Components d'un Arbre de Decisió
- Node Arrel: El punt de partida de l'arbre, que representa la primera decisió o condició.
- Nodes Interns: Representen decisions o condicions addicionals que es prenen basant-se en el resultat de la decisió anterior.
- Fulles: Representen les accions finals que es prenen quan s'arriba al final d'una sèrie de decisions.
Exemple Bàsic
Considerem un exemple senzill d'un arbre de decisió per a un personatge enemic en un joc d'acció:
Node Arrel: L'enemic veu el jugador? ├── Sí: L'enemic està a prop del jugador? │ ├── Sí: Atacar │ └── No: Apropar-se al jugador └── No: Patrullar
Construcció d'un Arbre de Decisió
Pas 1: Definir les Decisions i Condicions
El primer pas per construir un arbre de decisió és identificar les decisions i condicions que el personatge del joc ha de considerar. Això pot incloure factors com la visibilitat del jugador, la distància al jugador, l'estat de salut del personatge, etc.
Pas 2: Crear els Nodes i Brancs
Un cop definides les decisions i condicions, es poden crear els nodes i brancs de l'arbre. Cada node representa una decisió o condició, i cada branca representa el resultat d'aquesta decisió.
Pas 3: Implementar les Accions
Finalment, es defineixen les accions que es prenen quan s'arriba a una fulla de l'arbre. Aquestes accions poden incloure moviments, atacs, canvis d'estat, etc.
Implementació en Codi
A continuació, es mostra un exemple d'implementació d'un arbre de decisió en Python per a un personatge enemic:
class Node: def __init__(self, question, yes_branch=None, no_branch=None): self.question = question self.yes_branch = yes_branch self.no_branch = no_branch def decision_tree(node, context): if node.yes_branch is None and node.no_branch is None: return node.question # Fulla: retorna l'acció if node.question(context): return decision_tree(node.yes_branch, context) else: return decision_tree(node.no_branch, context) # Definir les condicions def veu_jugador(context): return context['veu_jugador'] def esta_a_prop(context): return context['distancia'] < 5 # Crear l'arbre de decisió arrel = Node(veu_jugador, Node(esta_a_prop, Node(lambda ctx: 'Atacar'), Node(lambda ctx: 'Apropar-se')), Node(lambda ctx: 'Patrullar')) # Context de prova context = {'veu_jugador': True, 'distancia': 3} # Executar l'arbre de decisió accio = decision_tree(arrel, context) print(f"Acció: {accio}")
Explicació del Codi
- Classe Node: Defineix un node de l'arbre de decisió amb una pregunta (condició) i dos brancs (sí i no).
- Funció decision_tree: Recursivament travessa l'arbre de decisió basant-se en les condicions del context.
- Condicions:
veu_jugador
iesta_a_prop
són funcions que representen les condicions de l'arbre. - Creació de l'Arbre: Es crea l'arbre de decisió amb nodes i brancs.
- Context de Prova: Es defineix un context de prova amb les condicions del joc.
- Execució: Es travessa l'arbre de decisió amb el context de prova per determinar l'acció a prendre.
Exercicis Pràctics
Exercici 1: Ampliar l'Arbre de Decisió
Ampliar l'arbre de decisió per incloure una nova condició: si l'enemic té poca salut, ha de fugir en lloc d'atacar.
Solució:
def poca_salut(context): return context['salut'] < 20 # Crear l'arbre de decisió ampliat arrel = Node(veu_jugador, Node(esta_a_prop, Node(poca_salut, Node(lambda ctx: 'Fugir'), Node(lambda ctx: 'Atacar')), Node(lambda ctx: 'Apropar-se')), Node(lambda ctx: 'Patrullar')) # Context de prova ampliat context = {'veu_jugador': True, 'distancia': 3, 'salut': 15} # Executar l'arbre de decisió ampliat accio = decision_tree(arrel, context) print(f"Acció: {accio}")
Exercici 2: Implementar un Arbre de Decisió per a un Personatge Amic
Crear un arbre de decisió per a un personatge amic que ajuda el jugador si està a prop i ataca enemics si els veu.
Solució:
def veu_enemic(context): return context['veu_enemic'] # Crear l'arbre de decisió per al personatge amic arrel_amic = Node(veu_jugador, Node(esta_a_prop, Node(lambda ctx: 'Ajudar'), Node(lambda ctx: 'Apropar-se')), Node(veu_enemic, Node(lambda ctx: 'Atacar Enemic'), Node(lambda ctx: 'Patrullar'))) # Context de prova per al personatge amic context_amic = {'veu_jugador': True, 'distancia': 2, 'veu_enemic': False} # Executar l'arbre de decisió per al personatge amic accio_amic = decision_tree(arrel_amic, context_amic) print(f"Acció Amic: {accio_amic}")
Conclusió
Els arbres de decisió són una eina poderosa per a la presa de decisions en IA de videojocs. Permeten crear comportaments complexos de manera estructurada i fàcil de gestionar. Amb la pràctica, es poden construir arbres de decisió més sofisticats que millorin significativament la jugabilitat i la immersió en els 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