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.
| Modelo | Fijo | Variable |
|---|---|---|
| Tráfico | velocidad máxima, agresividad | posición, velocidad actual |
| Schelling | grupo, tolerancia | posición, satisfacción |
| Epidemia | edad, movilidad base | salud, días enfermo |
| Opiniones | convicción base | opinió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).
- 1Elegir el rango.
Velocidad máxima entre 0.02 y 0.06, tolerancia entre 0 y 5 vecinos.
- 2Repartir valores.
Azar uniforme, grupos 70/30 o curva normal según el fenómeno real.
- 3Verificar 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.
Atributo fijo: velocidad máxima
v ~ Normal(media, desvío)
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
- Poné desvío en 0. ¿Cómo es el histograma? ¿Qué ventaja y qué peligro tiene una población clonada?
- Subí el desvío al máximo con media 0,04. ¿Aparecen velocidades imposibles? ¿Cómo las limitarías en código?
- Generá 3 poblaciones con los mismos valores. ¿La media real coincide exactamente con la pedida? ¿Por qué?
Ver respuestas sugeridas
- 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.
- Sí: valores negativos o mayores que lo físico. En código se recortan con
min/maxo se sortean de una distribución truncada: el dominio declarado manda. - 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.