public:vj1231:arbolesdedecision:start
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| public:vj1231:arbolesdedecision:start [2026/10/06 09:59] – [Clase Hoja] mperez | public:vj1231:arbolesdedecision:start [2026/10/06 11:07] (actual) – [Árboles dirigidos por datos (data-driven)] mperez | ||
|---|---|---|---|
| Línea 41: | Línea 41: | ||
| * Visualizar y exportar el árbol como imagen o código. | * Visualizar y exportar el árbol como imagen o código. | ||
| - | ====== | + | ====== |
| - | + | ||
| + | En el enfoque Orientado a Objetos (Nodos en Código) se crea la estructura del árbol en memoria. Se definen clases para los nodos (ej. '' | ||
| ===== Clase NodoDecision ===== | ===== Clase NodoDecision ===== | ||
| Línea 85: | Línea 86: | ||
| </ | </ | ||
| - | {{ : | ||
| - | ====== Ejemplo ====== | ||
| + | ===== Ejemplo ===== | ||
| - | {{: | ||
| En esta imagen se muestra el comportamiento de tres NPCs distintos modelados usando árboles de decisión. Los nodos de condición aparecen en azúl mientras que los nodos de acción aparecen en verde. | En esta imagen se muestra el comportamiento de tres NPCs distintos modelados usando árboles de decisión. Los nodos de condición aparecen en azúl mientras que los nodos de acción aparecen en verde. | ||
| - | Puedes ver y ejecutar el ejemplo en este {{ : | + | {{: |
| + | Los tres árboles de decisión representados en formato de texto serían: | ||
| + | ### 🟢 NPC Normal | ||
| + | |||
| + | es el más simple: solo decide entre perseguir o patrullar según si detecta al jugador. | ||
| + | |||
| + | ``` | ||
| + | ¿ve_al_jugador? | ||
| + | ├─ Sí → Acción: seguir_jugador | ||
| + | └─ No → Acción: patrullar_borde | ||
| + | ``` | ||
| + | |||
| + | ### 🟠 NPC Tímido | ||
| + | |||
| + | Es el más complejo (3 niveles de profundidad). Su comportamiento cambia drásticamente dependiendo de si está en " | ||
| + | - Si **está en alerta**, prioriza su seguridad (huye hacia un guardia o completa un informe). | ||
| + | - Si **no está en alerta**, se comporta de forma más agresiva (inicia la alerta si el jugador está cerca, o lo sigue si está lejos). | ||
| + | |||
| + | ``` | ||
| + | ¿en_mision_alerta? | ||
| + | ├─ Sí → ¿muy_cerca_guardia? | ||
| + | │ ├─ Sí → Acción: irse_al_guardia | ||
| + | │ └─ No → Acción: completar_informe | ||
| + | └─ No → ¿ve_al_jugador? | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | ``` | ||
| + | |||
| + | ### 🔵 NPC Guardia | ||
| + | |||
| + | tiene un comportamiento intermedio. Si no ve al jugador, actúa como un " | ||
| + | |||
| + | ``` | ||
| + | ¿ve_al_jugador? | ||
| + | ├─ Sí → Acción: seguir_jugador | ||
| + | └─ No → ¿tiene_posicion_reportada? | ||
| + | | ||
| + | | ||
| + | ``` | ||
| + | |||
| + | |||
| + | Puedes ver y ejecutar el ejemplo en este {{ : | ||
| + | |||
| + | ====== Árboles dirigidos por datos (data-driven) ====== | ||
| + | |||
| + | Es un caso muy similar al enfoque orientado a objetos, pero en este caso el árbol se define en un archivo de datos externo (como un JSON, XML o un formato binario personalizado). El juego carga este archivo en tiempo de ejecución (o en tiempo de carga) y un parser lo convierte en la estructura de Objetos mencionada en el enfoque anterior. | ||
| + | |||
| + | Por ejemplo, el NPC tímido se representaria de esta forma | ||
| + | |||
| + | <code json> | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | }, | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | }, | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | }, | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | }, | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | y el código en python para leer el '' | ||
| + | |||
| + | <code python> | ||
| + | def construir_arbol(nodo_json): | ||
| + | """ | ||
| + | Lee un diccionario JSON y devuelve una instancia de NodoDecision o Hoja. | ||
| + | """ | ||
| + | tipo = nodo_json.get(" | ||
| + | | ||
| + | if tipo == " | ||
| + | # Caso base: Es una hoja. Buscamos la función en el registro. | ||
| + | nombre_accion = nodo_json[" | ||
| + | funcion_accion = REGISTRO_ACCIONES[nombre_accion] | ||
| + | return Hoja(funcion_accion) | ||
| + | | ||
| + | elif tipo == " | ||
| + | # Caso recursivo: Es un nodo de decisión. | ||
| + | nombre_condicion = nodo_json[" | ||
| + | funcion_condicion = REGISTRO_CONDICIONES[nombre_condicion] | ||
| + | | ||
| + | nodo = NodoDecision(funcion_condicion) | ||
| + | | ||
| + | # Construimos las ramas recursivamente | ||
| + | nodo.true_case = construir_arbol(nodo_json[" | ||
| + | nodo.false_case = construir_arbol(nodo_json[" | ||
| + | | ||
| + | return nodo | ||
| + | else: | ||
| + | raise ValueError(f" | ||
| + | </ | ||
| + | |||
| + | y se construiría con | ||
| + | <code python> | ||
| + | def crear_arbol(self, | ||
| + | arbol = construir_arbol(datos_json) | ||
| + | return arbol | ||
| + | </ | ||
public/vj1231/arbolesdedecision/start.1791280797.txt.gz · Última modificación: por mperez
