Simulación Basada en Agentes · Tema 09

Interacción entre agentes

Del mundo al otro: dos agentes se cruzan, se influyen y ninguno vuelve igual al encuentro.

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.

El mismo esquema en cada dominio.
MundoEncuentroInfluencia
Peatonesdos cuerpos a menos de 0,5 mfrenar, esquivar, formar fila
Epidemiacontacto cercano prolongadocontagio con probabilidad p
Opinionesescuchar al vecinocopiar o reforzar la opinión
Mercadooferta frente a demandaintercambio 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:

mover→detectar pares→aplicar influencias
  1. 1
    Mover a todos.

    Cada agente actualiza su posición con su regla de movimiento (Tema 12).

  2. 2
    Detectar encuentros.

    Armar la lista de pares con distancia menor al radio, sin repetir (a,b) y (b,a).

  3. 3
    Aplicar 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?

EXPERIMENTO 09

El encuentro propaga

si dist < radio → puede convertir

Los resultados numéricos aparecen debajo.
Encuentros0
Convertidos0 %
Pasos útiles0
LecturaChispa

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

  1. Con radio mínimo y 0 pasos, ¿cuántos convertidos hay? ¿Por qué el encuentro necesita movimiento?
  2. Subí el radio al máximo con 100 agentes y 60 pasos. ¿Se convierte todo el mundo? ¿Qué frenaría el contagio total?
  3. 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
  1. Solo el inicial: sin moverse casi nadie coincide y sin coincidencia no hay canal de influencia. El movimiento crea la red de encuentros.
  2. 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.
  3. 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 < j para 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.