01 · Punto de partida
Sin memoria no hay historia
En el Tema 2 el agente percibía y decidía, pero olvidaba todo al instante: cada paso empezaba de cero. Un agente así es reactivo puro: responde al presente sin pasado.
Los agentes interesantes tienen estado: guardan cómo están. Un auto recuerda su velocidad, una persona recuerda si está enferma y hace cuántos días, un pájaro recuerda su rumbo. Ese recuerdo condiciona la próxima decisión.
- ¿Qué necesita recordar el agente para decidir bien?
- ¿Qué cambia en cada paso y qué queda fijo?
- ¿Cómo pasa de un estado a otro?
- ¿Qué parte de su estado ven los demás?
02 · Definición
Variables que definen al agente
El estado típico combina tres familias de variables:
Posición y forma
Dónde está y cómo se presenta: coordenadas, rumbo, celda ocupada. Sin esto no hay espacio.
Condición interna
Cómo está: energía, salud, edad, días enfermo. Es su memoria física y cambia con el tiempo.
Contenido mental
Qué cree o prefiere: opinión, tolerancia, estrategia. Es su memoria social y guía futuras reglas.
Esta fórmula resume todo el curso: el agente de mañana es el agente de hoy transformado por lo que percibió. Por eso la inicialización importa tanto (Tema 40): empezar con otra energía u otra salud cambia toda la historia.
| Modelo | Estado del agente | Qué recuerda |
|---|---|---|
| Tráfico | posición + velocidad | A qué ritmo venía para acelerar o frenar suave. |
| Epidemia SIR | salud + días enfermo | Si es sano, enfermo o recuperado, y desde cuándo. |
| Segregación | grupo + satisfacción | A qué grupo pertenece y si está contento donde vive. |
| Opiniones | opinión + convicción | Qué piensa y qué tan difícil es convencerlo. |
03 · Distinción
Estado, parámetros y percepciones
No todo lo que aparece en el código es estado. Separar estos tres roles evita modelos frágiles:
Cambia por agente y en el tiempo
Estado
Energía de cada agente, salud de cada persona, opinión de cada vecino. Vive dentro del agente y se actualiza.
Fijo durante la corrida
Parámetros
Velocidad máxima, radio de percepción, probabilidad de contagio. Configuran el experimento y se varían entre corridas.
- Estado
- Variables propias y cambiantes:
x,energia,salud. Se inicializan y se actualizan. - Parámetro
- Valor global fijo en la corrida:
costo_moverse,radio. Se experimenta (Tema 41). - Percepción
- Cálculo momentáneo: vecinos contados ahora. No se guarda, se recalcula.
- Transición
- Regla de paso: cómo el estado viejo más la percepción producen el estado nuevo.
04 · Dinámica
Cómo cambia el estado paso a paso
Actualizar el estado es aplicar la transición con cuidado del orden:
- 1Inicializar.
Dar a cada agente un estado de partida: posiciones aleatorias, energía 10, un enfermo cero.
- 2Percibir.
Medir lo relevante: ¿hay comida cerca? ¿Cuántos enfermos me rodean?
- 3Actualizar.
Aplicar la regla y escribir el nuevo estado: restar energía, cambiar salud, mover posición.
05 · Representación en Python
El estado vive en atributos
Cada atributo del objeto es una variable de estado. La transición es un método actualizar que los reescribe con reglas explícitas.
Python en tu navegador. Editá la energía inicial o el costo y observá cuántos pasos sobrevive el agente.
class Agente:
def __init__(self, energia=10):
self.energia = energia
self.vivo = True
def actualizar(self, hay_comida, costo=1, ganancia=3):
if not self.vivo:
return self.energia
self.energia -= costo
if hay_comida:
self.energia += ganancia
if self.energia <= 0:
self.energia = 0
self.vivo = False
return self.energia
yo = Agente(energia=5)
for dia in [True, False, False, True]:
print(yo.actualizar(hay_comida=dia), "vivo:", yo.vivo)
Probá con energía 2 y sin comida: el agente muere al segundo paso. El estado cero es absorbente.
Estados discretos: sano, enfermo, recuperado
No todo estado es un número. En epidemiología el estado es una etiqueta con contador: tras N días enfermo, el agente se recupera y ya no contagia.
class Persona:
def __init__(self):
self.salud = "sana"
self.dias = 0
def actualizar(self, contagiada=False, duracion=3):
if self.salud == "sana" and contagiada:
self.salud = "enferma"
self.dias = 0
elif self.salud == "enferma":
self.dias += 1
if self.dias >= duracion:
self.salud = "recuperada"
return self.salud
p = Persona()
print(p.actualizar(contagiada=True))
print(p.actualizar(), p.actualizar(), p.actualizar())
06 · Exploración
Laboratorio: energía que se gasta y se recupera
Cada agente pierde energía al moverse (costo) y la recupera al comer (puntos amarillos). Sin energía, muere y se vuelve gris. Movete los controles: ¿cuánta comida hace falta para sostener la población?
Estado interno: energía
e(t+1) = e(t) − costo + comida
Con 40 comidas y costo 1, parte de la población sobrevive.
Cada círculo es un agente: amarillo con energía alta, naranja en riesgo, rojo moribundo, gris muerto. Los puntos amarillos pequeños son comida. Pulsá Nueva réplica para otra historia con los mismos parámetros.
Preguntas para explorar
- Poné comida en 0 con costo 1. ¿Cuántos pasos vive un agente que empieza con energía 10? ¿Por qué mueren todos juntos?
- Subí el costo a 3 con comida 40. ¿Alcanza la comida o la población colapsa igual?
- Repetí la misma configuración con Nueva réplica 3 veces. ¿Vivos y energía media son idénticos? ¿Qué parte es regla y qué parte es azar?
Ver respuestas sugeridas
- Vive 10 pasos: cada paso resta 1 sin reponer. Mueren juntos porque parten con la misma energía y la misma regla: el estado inicial compartido sincroniza el final.
- Colapsa: el gasto supera lo que el encuentro aleatorio con comida puede reponer. El estado es un balance entre ingresos y egresos.
- No son idénticos: posiciones y encuentros difieren. La regla (restar costo, sumar comida) es determinista; la historia (quién encuentra comida) es estocástica.
07 · Comprensión
Confusiones frecuentes
«Estado y parámetro son lo mismo»
El estado cambia por agente y en el tiempo; el parámetro es fijo en la corrida y compartido. Mezclarlos impide experimentar: no sabés qué variaste.
«Guardar todo el historial en el agente»
El estado es la memoria mínima para decidir, no el diario completo. El historial se registra afuera, en el observador de la simulación.
«El estado siempre es un número»
Puede ser una etiqueta (sano/enfermo), una posición o una opinión. Lo importante es que los valores posibles estén definidos y validados.
«Actualizar en cualquier orden da igual»
El orden de actualización (síncrono o asíncrono) cambia el resultado. Lo estudiaremos en los Temas 16 y 17: por ahora, actualizá a todos con el estado del paso anterior.
08 · Práctica guiada
Ejercicios con Python
Ejercicio 1: leer el estado
Ejecutá este agente con posición y energía e imprimí solo su energía. Luego cambiá la energía inicial a 3.
class Agente:
def __init__(self, x, energia):
self.x = x
self.energia = energia
a = Agente(0.7, 10)
print("energia:", a.energia)
Ver solución razonada
Imprime energia: 10. La posición y la energía son independientes: mover al agente no debería cambiar su energía salvo que la regla lo diga.
Ejercicio 2: predecir la muerte
Sin ejecutar primero: con energía 3, costo 1 y sin comida, ¿en qué paso muere? Comprobalo después.
class Agente:
def __init__(self, energia):
self.energia = energia
self.vivo = True
def actualizar(self, hay_comida=False, costo=1):
if self.vivo:
self.energia -= costo
if hay_comida:
self.energia += 3
if self.energia <= 0:
self.energia = 0
self.vivo = False
return self.energia, self.vivo
a = Agente(3)
for t in range(1, 5):
print(t, a.actualizar())
Ver solución
Energías 2, 1, 0, 0: muere en el paso 3. Después queda en 0 y vivo=False: el estado muerto es estable.
Ejercicio 3: transición con etiqueta
Completá la transición SIR: una persona enferma se recupera tras 2 días. Probá contagiarla en el día 1 y avanzá 3 días.
Ver una posible respuesta
class Persona:
def __init__(self):
self.salud = "sana"
self.dias = 0
def actualizar(self, contagiada=False):
if self.salud == "sana" and contagiada:
self.salud = "enferma"
self.dias = 0
elif self.salud == "enferma":
self.dias += 1
if self.dias >= 2:
self.salud = "recuperada"
return self.salud
p = Persona()
print(p.actualizar(contagiada=True))
print(p.actualizar(), p.actualizar(), p.actualizar())
Secuencia: enferma, enferma, recuperada, recuperada. El contador dias es el estado que permite la transición retardada.
09 · Síntesis
Ideas para recordar
- El estado es la memoria operativa del agente: lo que necesita para decidir el próximo paso.
- Estado (cambiante, individual) no es parámetro (fijo, global) ni percepción (momentánea).
- La transición estado(t+1) = regla(estado(t), percepción) es el motor de ABM.
- En Python, el estado vive en atributos y se reescribe en
actualizarcon validación. - La energía muestra el balance: ingresos por comer menos egresos por moverse.
En el próximo tema estudiaremos las propiedades y atributos: qué es fijo y qué es variable en cada agente, y cómo diseñar la ficha completa.