Simulación Basada en Agentes · Tema 04

Propiedades y atributos

La ficha completa del agente: qué es fijo y qué cambia, cómo evitar atributos imposibles y cómo nace la diversidad.

01 · Punto de partida

Todo agente tiene una ficha

En el Tema 3 el agente recordaba su energía y su salud. Pero un agente real necesita más datos: ¿a qué grupo pertenece? ¿Qué tan rápido puede moverse? ¿Qué tan tolerante es? Esa ficha mezcla lo permanente con lo cambiante.

Diseñar bien la ficha es la mitad del modelo: si falta un atributo, la regla no puede decidir; si sobra, el modelo se vuelve imposible de calibrar.

  • ¿Qué datos identifican al agente durante toda la corrida?
  • ¿Qué datos cambian paso a paso?
  • ¿Qué valores son válidos para cada atributo?
  • ¿Qué atributos varían entre agentes y cuáles son iguales?

02 · Definición

Fijos, variables y derivados

Tres tipos de campos aparecen en casi toda ficha:

■

Fijos

Se asignan al nacer y no cambian: id, grupo, velocidad máxima, tolerancia base. Definen quién es.

◐

Variables

Cambian con la transición: posición, energía, salud, opinión. Definen cómo está ahora.

◈

Derivados

Se calculan, no se guardan: densidad de vecinos, distancia al centro. Son percepciones resumidas.

Una ficha típica por modelo.
ModeloFijoVariable
Tráficovelocidad máxima, agresividadposición, velocidad actual
Schellinggrupo, toleranciaposición, satisfacción
Epidemiaedad, movilidad basesalud, días enfermo
Opinionesconvicción baseopinión actual

03 · Diseño

Cómo diseñar una buena ficha

Tres preguntas evitan la mayoría de los errores:

Ficha mínima

Solo lo que la regla lee

Si ningún método usa el atributo, no va en la ficha: va en el cuaderno de ideas para más adelante.

Ficha validada

Rangos y valores posibles

Cada atributo declara su dominio: energía 0–20, grupo A/B, opinión −1…1. Lo imposible se rechaza al nacer.

Identidad
Id único y grupo: permiten seguir al agente y separar comportamientos por tipo.
Capacidad
Límites fijos: velocidad máxima, energía máxima, radio. Evitan valores absurdos.
Preferencia
Rasgo fijo que modula la regla: tolerancia, riesgo, convicción. Fuente de diversidad.
Derivado
Cálculo bajo demanda: no ocupa memoria permanente ni se desincroniza.

04 · Diversidad

De la ficha a la heterogeneidad

Si todos los agentes nacen con la misma ficha, la población es homogénea. Basta variar un fijo —otra velocidad, otra tolerancia— para obtener heterogeneidad, la materia prima de ABM (Tema 26).

atributos fijos→distribución inicial→población diversa
  1. 1
    Elegir el rango.

    Velocidad máxima entre 0.02 y 0.06, tolerancia entre 0 y 5 vecinos.

  2. 2
    Repartir valores.

    Azar uniforme, grupos 70/30 o curva normal según el fenómeno real.

  3. 3
    Verificar la mezcla.

    Histograma y conteo por grupo: ¿la población creada se parece a la pensada?

05 · Representación en Python

Fijos en el constructor, variables en atributos

Los fijos entran por el constructor y casi no se tocan; los variables se actualizan en cada paso.

Python en tu navegador. Cambiá el grupo o la tolerancia y observá cómo la misma posición produce otra decisión.

class Agente:
    def __init__(self, id, grupo, tolerancia, x=0.5, energia=10):
        self.id = id              # fijo: identidad
        self.grupo = grupo        # fijo: A o B
        self.tolerancia = tolerancia  # fijo: preferencia
        self.x = x                # variable: posición
        self.energia = energia    # variable: estado

    def ficha(self):
        return (self.id, self.grupo, self.tolerancia, round(self.x, 2), self.energia)

a = Agente(0, "A", tolerancia=2, x=0.4, energia=9)
b = Agente(1, "B", tolerancia=4, x=0.42, energia=9)
print(a.ficha())
print(b.ficha())

Misma posición y energía, distinta tolerancia: la diversidad vive en los fijos.

Crear una población diversa

La inicialización reparte los fijos con azar controlado por semilla: reproducible y variada a la vez.

import random
random.seed(11)

def crear_poblacion(n=6):
    poblacion = []
    for i in range(n):
        grupo = "A" if random.random() < 0.5 else "B"
        tolerancia = random.randint(1, 4)
        poblacion.append(Agente(i, grupo, tolerancia, x=random.random(), energia=10))
    return poblacion

pob = crear_poblacion(6)
for a in pob:
    print(a.ficha())

06 · Exploración

Laboratorio: repartir velocidades

Cada agente nace con una velocidad máxima fija sorteada de una campana con media y desvío que vos elegís. El desvío es la heterogeneidad: en 0 todos son clones; alto, cada uno es un mundo. Observá el histograma y las estadísticas.

EXPERIMENTO 04

Atributo fijo: velocidad máxima

v ~ Normal(media, desvío)

Los resultados numéricos aparecen debajo.
Media real0,040
Desvío real0,010
Rápidos (> 0,05)0 %
LecturaHomogénea

Con desvío 0, todos los agentes nacen iguales.

Cada barra cuenta cuántos agentes caen en ese rango de velocidad. La línea punteada marca la media pedida. Pulsá Nueva población para otro sorteo con los mismos parámetros.

Preguntas para explorar

  1. Poné desvío en 0. ¿Cómo es el histograma? ¿Qué ventaja y qué peligro tiene una población clonada?
  2. Subí el desvío al máximo con media 0,04. ¿Aparecen velocidades imposibles? ¿Cómo las limitarías en código?
  3. Generá 3 poblaciones con los mismos valores. ¿La media real coincide exactamente con la pedida? ¿Por qué?
Ver respuestas sugeridas
  1. Una sola barra llena: todos iguales. Ventaja: fácil de entender. Peligro: ningún individuo representa la variedad real y el modelo pierde los extremos que suelen decidir el fenómeno.
  2. Sí: valores negativos o mayores que lo físico. En código se recortan con min/max o se sortean de una distribución truncada: el dominio declarado manda.
  3. No exactamente: el sorteo tiene error muestral, mayor con pocos agentes. Por eso se informan media y desvío reales, no solo los pedidos.

07 · Comprensión

Confusiones frecuentes

«Todo atributo debe cambiar»

Los fijos dan identidad y diversidad estable. Si la tolerancia cambiara sola en cada paso sin regla, sería ruido, no aprendizaje.

«Guardar derivados para no calcular»

Guardar “densidad” como atributo la congela en el tiempo. Los derivados se calculan al percibir; el estado guarda solo lo irreemplazable.

«Más atributos, modelo más realista»

Cada atributo pide datos, inicialización y validación. Un atributo sin regla que lo lea es peso muerto que oscurece el experimento.

«El id no importa»

Sin id no podés seguir trayectorias, depurar ni vincular resultados con agentes. Es el atributo fijo más barato y más útil.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: leer la ficha

Ejecutá y distinguí fijos de variables. Luego cambiá solo la energía y razoná qué cambió.

class Agente:
    def __init__(self, id, grupo, x, energia):
        self.id = id
        self.grupo = grupo
        self.x = x
        self.energia = energia

a = Agente(7, "A", 0.3, 10)
print("fijo:", a.id, a.grupo)
print("variable:", a.x, a.energia)
Ver solución razonada

Fijos: 7, A. Variables: 0.3, 10. Cambiar la energía no cambia quién es el agente, solo cómo está.

Ejercicio 2: validar el dominio

Sin ejecutar primero: ¿qué imprime este constructor con tolerancia 99? ¿Debería permitirlo? Comprobalo y corregilo.

class Agente:
    def __init__(self, tolerancia):
        if not (0 <= tolerancia <= 8):
            raise ValueError("tolerancia fuera de 0..8")
        self.tolerancia = tolerancia

print(Agente(3).tolerancia)
print(Agente(99).tolerancia)
Ver solución

Imprime 3 y luego lanza ValueError. No debería permitir 99: la validación en el constructor frena fichas imposibles al nacer.

Ejercicio 3: contar grupos

Creá 200 agentes 70/30 y verificá el reparto. ¿Da exactamente 140/60?

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

pob = ["A" if random.random() < 0.7 else "B" for _ in range(200)]
print("A:", sum(1 for g in pob if g == "A"), "B:", sum(1 for g in pob if g == "B"))

No da exacto (por ejemplo 141/59): el 70 % es la probabilidad, no el conteo final. Con pocos agentes el error muestral es mayor.

09 · Síntesis

Ideas para recordar

  • La ficha combina fijos (quién es) y variables (cómo está).
  • Los derivados se calculan, no se guardan.
  • Cada atributo declara dominio y se valida al nacer.
  • Variar un fijo entre agentes crea heterogeneidad.
  • En Python, los fijos entran por el constructor y las variables se actualizan.

En el próximo tema estudiaremos el comportamiento: qué hace el agente en cada paso con su ficha completa.