Simulación Basada en Agentes · Tema 03

Estado de un agente

Lo que el agente recuerda de sí mismo: posición, energía, salud u opinión. Sin estado no hay historia; con estado aparece la memoria.

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.

Estados típicos según el modelo.
ModeloEstado del agenteQué recuerda
Tráficoposición + velocidadA qué ritmo venía para acelerar o frenar suave.
Epidemia SIRsalud + días enfermoSi es sano, enfermo o recuperado, y desde cuándo.
Segregacióngrupo + satisfacciónA qué grupo pertenece y si está contento donde vive.
Opinionesopinión + convicciónQué 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:

inicializar→percibir→actualizar estado
  1. 1
    Inicializar.

    Dar a cada agente un estado de partida: posiciones aleatorias, energía 10, un enfermo cero.

  2. 2
    Percibir.

    Medir lo relevante: ¿hay comida cerca? ¿Cuántos enfermos me rodean?

  3. 3
    Actualizar.

    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?

EXPERIMENTO 03

Estado interno: energía

e(t+1) = e(t) − costo + comida

Los resultados numéricos aparecen debajo.
Vivos0 de 40
Energía media0,0
Comidas totales0
LecturaEquilibrio

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

  1. Poné comida en 0 con costo 1. ¿Cuántos pasos vive un agente que empieza con energía 10? ¿Por qué mueren todos juntos?
  2. Subí el costo a 3 con comida 40. ¿Alcanza la comida o la población colapsa igual?
  3. 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
  1. 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.
  2. Colapsa: el gasto supera lo que el encuentro aleatorio con comida puede reponer. El estado es un balance entre ingresos y egresos.
  3. 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 actualizar con 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.