Simulación Basada en Agentes · Tema 06

Reglas de decisión

El si-entonces que convierte percepción y estado en acción: umbrales, prioridades y una pizca de azar controlado.

01 · Punto de partida

Del verbo al si-entonces

En el Tema 5 el agente vagaba, comía o descansaba. Pero ¿quién elegía? La regla de decisión es el puente entre lo que el agente ve y lo que hace: una condición explícita del tipo si pasa esto, entonces hago aquello.

Sin reglas escritas, el modelo es una caja negra: nadie puede repetirlo, criticarlo ni mejorarlo. Con reglas claras, dos programadores obtienen el mismo comportamiento.

  • ¿Qué condición dispara cada acción?
  • ¿Qué umbral separa quedarse de moverse?
  • ¿Qué pasa si dos condiciones se cumplen a la vez?
  • ¿La regla es siempre igual o a veces tiembla?

02 · Definición

Anatomía de una regla

Toda regla tiene condición, umbral y acción, más un orden cuando compiten:

?

Condición

Pregunta medible: ¿vecinos > 3? ¿distancia < 0,1? ¿energía < 5? Sin número no hay regla.

⚖

Umbral

El valor que parte el mundo en dos: a un lado quedarse, al otro moverse. Mover el umbral cambia el modelo.

➤

Prioridad + azar

Orden de evaluación y temblor opcional: primero comer, luego descansar; a veces actuar distinto por azar.

Las mismas tres piezas en cada dominio.
ModeloCondiciónAcción
Schellingsimilares < 30 %mudarse
Tráficodistancia < 2 autosfrenar
Contagiovecino enfermo a < rcontagiarse con prob. p
Vida (Tema 28)vecinas vivas = 3nacer

03 · Calidad

Cómo es una buena regla

Una regla falla más por ambigua que por simple:

Regla ambigua

“Si hay muchos, moverse”

¿Cuántos son muchos? ¿Moverse a dónde? Cada corrida interpreta distinto y el modelo no es repetible.

Regla simulable

“Si vecinos > 3, moverse”

Condición medible, umbral explícito y acción única. Se puede programar, probar y discutir.

Completa
Cubre todos los casos con un si-no final: siempre devuelve alguna acción.
Excluyente
Las condiciones no se pisan o tienen prioridad declarada: primera que cumple, gana.
Legible
Se lee como frase del dominio: “si hacinado, mudarse”, no como álgebra críptica.
Parametrizada
El umbral es un argumento (umbral=3), no un número enterrado en el código.

04 · Diseño

Escribir reglas en tres pasos

El método corto que usaremos en todo el curso:

condiciones→prioridades→extremos
  1. 1
    Listar condiciones.

    Una por acción: ver comida, estar lleno, resto vagar.

  2. 2
    Ordenar prioridades.

    La oportunidad primero (comer), luego el estado (descansar), luego el defecto (vagar).

  3. 3
    Probar extremos.

    Umbral 0 y umbral gigante: ¿la regla sigue devolviendo algo sensato?

05 · Representación en Python

Decidir es una cascada de if

El orden del código es la prioridad. Leelo de arriba hacia abajo como las reglas del juego.

Python en tu navegador. Cambiá el umbral y observá dónde aparece el escalón entre quedarse y moverse.

def decidir(vecinos, umbral=3):
    if vecinos > umbral:
        return "moverse"
    return "quedarse"

for v in [0, 2, 3, 4, 7]:
    print(v, decidir(v, umbral=3))

Con umbral 3, el escalón está entre 3 y 4: un vecino de más cambia la decisión.

Agregar temblor: reglas estocásticas

Los agentes reales a veces hacen lo contrario. El temblor invierte la decisión con probabilidad pequeña: rompe empates y evita parálisis.

import random
random.seed(8)

def decidir_con_temblor(vecinos, umbral=3, temblor=0.1):
    base = "moverse" if vecinos > umbral else "quedarse"
    if random.random() < temblor:
        return "quedarse" if base == "moverse" else "moverse"
    return base

print([decidir_con_temblor(5, temblor=0.3) for _ in range(10)])

06 · Exploración

Laboratorio: el escalón y el temblor

El gráfico muestra la probabilidad de moverse según vecinos percibidos. Sin temblor es un escalón perfecto en el umbral; con temblor, el escalón se ablanda: a veces se queda con muchos vecinos y a veces se mueve con pocos. La línea dorada es tu caso de prueba.

EXPERIMENTO 06

Umbral + temblor

si vecinos > umbral → moverse

Los resultados numéricos aparecen debajo.
Decisión basemoverse
P(moverse) con temblor90 %
Este intentomoverse
LecturaLejos del borde

Con umbral 3 y temblor 10 %, el caso 5 se mueve casi siempre.

El escalón azul es la regla sin azar; la curva amarilla es la regla con temblor. La línea dorada marca tu caso. Pulsá Probar suerte para sortear un intento con esos valores.

Preguntas para explorar

  1. Poné el caso justo en el umbral (3) y luego en 4. ¿Dónde duele más el temblor: lejos o cerca del borde?
  2. Subí el temblor a 50 %. ¿La regla todavía decide algo o es una moneda?
  3. Bajá el temblor a 0. ¿Qué perdés y qué ganás frente a un temblor 10 %?
Ver respuestas sugeridas
  1. Cerca del borde: con vecinos justo sobre el umbral, un 10 % de temblor cambia muchas decisiones; lejos del borde, casi nunca se nota.
  2. Es una moneda: moverse o quedarse salen 50/50 en cualquier caso. El umbral queda decorativo.
  3. Ganás repetibilidad total; perdés realismo y capacidad de escape: sin temblor los empates se congelan y dos corridas iguales dan lo mismo.

07 · Comprensión

Confusiones frecuentes

«El orden de los if da igual»

El orden es la prioridad. Cambiar dos ramas invierte qué acción gana cuando ambas condiciones se cumplen.

«Umbral es un detalle»

El umbral es el parámetro más sensible del modelo (Temas 41–43): moverlo en 1 puede segregar un barrio o descongestionar una avenida.

«Azar significa sin regla»

La regla estocástica sigue siendo regla: base determinista más temblor declarado. Azar sin base es ruido, no comportamiento.

«Si cubre mi caso, alcanza»

La regla debe cubrir todos los casos, incluidos 0 vecinos y 100. Probar solo el caso cómodo esconde el else faltante.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: escribir el escalón

Ejecutá y marcá dónde está el escalón. Luego mové el umbral a 5.

def decidir(vecinos, umbral=3):
    return "moverse" if vecinos > umbral else "quedarse"

print([decidir(v) for v in range(7)])
Ver solución razonada

Sale quedarse hasta 3 y moverse desde 4: el escalón está entre 3 y 4. Con umbral 5, el salto se corre entre 5 y 6.

Ejercicio 2: predecir con dos condiciones

Sin ejecutar primero: con 1 vecino y energía 20, ¿qué decide? ¿Y con 5 vecinos y energía 2? Comprobalo después.

def decidir2(vecinos, energia):
    if vecinos > 3:
        return "moverse"
    if energia > 15:
        return "descansar"
    return "vagar"

print(decidir2(1, 20))
print(decidir2(5, 2))
Ver solución

descansar y moverse: la primera condición solo muerde con más de 3 vecinos; si no, manda la energía. El orden decide el empate.

Ejercicio 3: medir el temblor

Con temblor 20 % y 100 intentos sobre el caso 5 (umbral 3), ¿cuántos “quedarse” esperás? Verificalo.

Ver una posible respuesta
import random
random.seed(9)

def intento(temblor=0.2):
    base = "moverse"  # caso 5 con umbral 3
    return "quedarse" if random.random() < temblor else base

res = [intento() for _ in range(100)]
print(res.count("quedarse"), "quedarse de 100")

Esperás ≈ 20. Con semilla 9 salen 21: el temblor se verifica contando, no mirando un solo intento.

09 · Síntesis

Ideas para recordar

  • Decidir es aplicar si-entonces ordenados sobre estado + percepción.
  • El umbral parte el mundo en dos acciones; moverlo cambia el modelo.
  • Las reglas deben ser completas, excluyentes y parametrizadas.
  • El temblor ablanda el escalón y evita parálisis por empates.
  • En Python, el orden de los if es la prioridad de las reglas.

En el próximo tema estudiaremos el entorno: el mundo donde esas reglas se ejecutan.