01 · Punto de partida
El otro también decide
En el Tema 8 el agente tocaba el mundo y el mundo le devolvía el gesto. Ahora el mundo tiene otros que también perciben, deciden y actúan. Un agente ya no solo pisa pasto o sigue feromonas: se cruza con otro agente que puede contagiarlo, bloquearlo, imitarlo o empujarlo.
Ese cruce es el motor de todo lo que sigue en el curso: epidemias, opiniones, pánico, tráfico y mercados no se explican por un agente aislado ni por el suelo que pisa, sino por encuentros que cambian estados.
- ¿Quién se encuentra con quién y a qué distancia cuenta como encuentro?
- ¿Qué cambia después del cruce: opinión, salud, dirección, energía?
- ¿El cambio es mutuo o solo uno influye al otro?
- ¿El encuentro suma, resta o bloquea la próxima acción?
02 · Definición
Coincidir, influir, depender
Toda interacción directa combina tres momentos, del más físico al más social:
Coincidir
Estar cerca en espacio y tiempo: misma celda, distancia menor al radio, misma fila. Sin coincidencia no hay canal.
Influir
Cambiar el estado del otro: contagiar, convencer, asustar, frenar. La influencia es una regla si-entonces sobre el par.
Depender
La próxima acción depende del otro: no avanzo si estás delante, solo compro si vendés, solo huyo si corrés.
| Mundo | Encuentro | Influencia |
|---|---|---|
| Peatones | dos cuerpos a menos de 0,5 m | frenar, esquivar, formar fila |
| Epidemia | contacto cercano prolongado | contagio con probabilidad p |
| Opiniones | escuchar al vecino | copiar o reforzar la opinión |
| Mercado | oferta frente a demanda | intercambio si el precio conviene |
03 · Formas
Simétrica o asimétrica, sumar o bloquear
No toda influencia va en ambas direcciones ni con el mismo signo. Declarar la dirección evita la mitad de los errores del modelo.
Influencia simétrica
Los dos cambian igual
Dos peatones se esquivan mutuamente, dos vecinos promedian su opinión. El orden del par da igual: (a,b) es lo mismo que (b,a).
Influencia asimétrica
Uno cambia al otro
El infectado contagia al sano, el auto de adelante frena al de atrás, el vendedor fija el precio. El rol importa y debe guardarse.
- Radio de interacción
- Distancia máxima que cuenta como encuentro: si están más lejos, se ignoran. Define quién es vecino (Tema 13).
- Encuentro
- Par que en este paso cumple la condición de coincidencia. Se detecta antes de aplicar cualquier cambio.
- Influencia
- Regla que cambia el estado tras el encuentro: copiar, contagiar, frenar, intercambiar. Puede ser probabilística.
- Doble conteo
- Error de contar el par (a,b) y también (b,a) como dos encuentros. El par se procesa una sola vez por paso.
04 · Ciclo
El paso con encuentros
Cada paso mueve a todos y recién después resuelve lo que pasó entre ellos, en este orden:
- 1Mover a todos.
Cada agente actualiza su posición con su regla de movimiento (Tema 12).
- 2Detectar encuentros.
Armar la lista de pares con distancia menor al radio, sin repetir (a,b) y (b,a).
- 3Aplicar influencias.
Recorrer la lista y actualizar estados: contagiar, copiar, frenar o intercambiar según el rol.
05 · Representación en Python
Pares que se detectan y se influyen
El agente guarda posición y un estado que otro puede cambiar. El encuentro es una función de distancia; la influencia, una regla sobre el par.
Python en tu navegador. Cambiá el radio y observá qué pares cuentan como encuentro.
import math
class Agente:
def __init__(self, x, y, activo=False):
self.x = x
self.y = y
self.activo = activo # True = ya adoptó / contagia
def hay_encuentro(a, b, radio=0.1):
return math.hypot(a.x - b.x, a.y - b.y) < radio
a = Agente(0.2, 0.3, activo=True)
b = Agente(0.25, 0.32)
c = Agente(0.9, 0.9)
print(hay_encuentro(a, b), hay_encuentro(a, c))
Con radio 0,1, a y b se encuentran (True) y a y c se ignoran (False): el radio decide la red de encuentros.
Influir sin doble conteo
Se listan los pares una sola vez con i < j y después se aplican los cambios. Así (a,b) no se procesa dos veces.
import random
def aplicar_influencia(pares, p=0.5):
for a, b in pares:
if a.activo != b.activo and random.random() < p:
a.activo = True
b.activo = True
return [ag.activo for ag in agentes]
agentes = [Agente(0.2, 0.3, True), Agente(0.25, 0.32), Agente(0.9, 0.9)]
pares = []
for i in range(len(agentes)):
for j in range(i + 1, len(agentes)):
if hay_encuentro(agentes[i], agentes[j], radio=0.1):
pares.append((agentes[i], agentes[j]))
print("pares:", len(pares))
print(aplicar_influencia(pares, p=1.0))
06 · Exploración
Laboratorio: coincidir y convertir
Los agentes caminan al azar. Empieza uno solo convertido (amarillo): cuando un convertido se cruza con otro a menos del radio, lo convierte con probabilidad fija. Las líneas tenues son encuentros de este paso. ¿Cuántos pasos necesita la idea para tomar el mundo?
El encuentro propaga
si dist < radio → puede convertir
Con 30 agentes y radio 0,10, la conversión queda parcial.
Cada punto es un agente: amarillo ya convertido, verde aún no. Las líneas grises marcan encuentros del último paso. Pulsá Nueva réplica para otra historia con los mismos parámetros.
Preguntas para explorar
- Con radio mínimo y 0 pasos, ¿cuántos convertidos hay? ¿Por qué el encuentro necesita movimiento?
- Subí el radio al máximo con 100 agentes y 60 pasos. ¿Se convierte todo el mundo? ¿Qué frenaría el contagio total?
- Repetí la misma configuración 3 veces. ¿Los encuentros finales son idénticos? ¿Qué parte es regla y qué parte es caminata?
Ver respuestas sugeridas
- Solo el inicial: sin moverse casi nadie coincide y sin coincidencia no hay canal de influencia. El movimiento crea la red de encuentros.
- Casi siempre sí: más densidad y más radio multiplican los pares por paso. Lo frenaría una probabilidad menor, pasos insuficientes o agentes aislados.
- No: quién se cruza con quién depende de la caminata azarosa. La regla (si cerca, convertir con p) es fija; la historia de cruces no.
07 · Comprensión
Confusiones frecuentes
«Si están cerca, ya interactuaron»
Cerca es solo el canal. La interacción exige además la regla de influencia: contagiar, copiar, frenar. Sin cambio de estado no hubo interacción, solo vecindad.
«(a,b) y (b,a) son dos encuentros»
Es el mismo par contado dos veces. Duplica contagios y frenos. Se itera con i < j y se procesa una sola vez.
«Detectar y cambiar a la vez es más rápido»
Es más rápido y está mal: el agente 30 ve conversiones que el agente 1 no vio. Primero se listan todos los pares del paso, después se aplican.
«Interacción es comunicación»
Comunicar es enviar un mensaje que el otro interpreta (Tema 10). Chocar, contagiar o bloquear son interacciones sin mensaje: cambian el estado sin decir nada.
08 · Práctica guiada
Ejercicios con Python
Ejercicio 1: contar encuentros sin repetir
Ejecutá y verificá cuántos pares se detectan. Luego agregá un cuarto agente lejos y comprobá que el conteo no cambia.
import math
pos = [(0.2, 0.2), (0.25, 0.22), (0.9, 0.9)]
radio = 0.1
pares = 0
for i in range(len(pos)):
for j in range(i + 1, len(pos)):
d = math.hypot(pos[i][0] - pos[j][0], pos[i][1] - pos[j][1])
if d < radio:
pares += 1
print(pares)
Ver solución razonada
Da 1: solo el par (0,1) está a menos de 0,1. El bucle con j desde i + 1 evita contar (1,0) otra vez.
Ejercicio 2: predecir la conversión
Sin ejecutar primero: un activo y un inactivo se encuentran con p = 1. ¿Cómo quedan? ¿Y con p = 0? Comprobalo después.
import random
random.seed(1)
for p in [1.0, 0.0]:
a, b = True, False
if a != b and random.random() < p:
a = b = True
print(p, a, b)
Ver solución
Con 1.0 quedan True, True; con 0.0 quedan True, False. La probabilidad modula la influencia sin cambiar el encuentro.
Ejercicio 3: freno por delante
Dos autos en fila: si el de adelante frena y la distancia es menor al radio, el de atrás también frena. ¿Qué imprime?
Ver una posible respuesta
adelante_frena = True
dist = 0.05
radio = 0.1
atras_frena = adelante_frena and dist < radio
print(atras_frena)
Imprime True: hay encuentro (0,05 < 0,1) y dependencia (si frena el de adelante, freno yo). Es interacción asimétrica sin contagio.
09 · Síntesis
Ideas para recordar
- La interacción directa es coincidir más influir: el radio crea el canal, la regla cambia el estado.
- Puede ser simétrica (ambos cambian igual) o asimétrica (uno cambia al otro según su rol).
- Se detectan todos los pares primero y se aplican después, con
i < jpara no duplicar. - El movimiento crea la red de encuentros: sin cruce no hay contagio, copia ni bloqueo.
- En Python, el encuentro es distancia < radio y la influencia es una regla sobre el par.
En el próximo tema estudiaremos la comunicación entre agentes: mensajes directos e indirectos que viajan más lejos que el encuentro.