Simulación Basada en Agentes · Tema 17

Actualización asíncrona

Turnos de a uno con lo recién cambiado: el sorteo que imita la vida sin reloj global.

01 · Punto de partida

Nadie espera el tick de todos

En el Tema 16 todos decidían sobre la misma foto y cambiaban juntos. Pero en la calle nadie congela el mundo para pensar: cada peatón, conductor o comerciante actúa cuando le toca, viendo lo que el anterior ya cambió. La actualización asíncrona turna de a un agente con estados frescos y mixtos.

Ese realismo cobra un precio: el resultado depende del orden. El primero corre con ventaja y dos corridas con el mismo sorteo distinto cuentan historias distintas.

  • ¿De a cuántos cambian por vez: todos o uno?
  • ¿En qué orden turnan: fijo de lista o sorteado?
  • ¿Ven la foto vieja o lo recién cambiado?
  • ¿Cuántas réplicas hacen falta para promediar el sorteo?

02 · Definición

Turno, orden y frescura

Toda ronda asíncrona combina quién juega, en qué secuencia y con qué datos:

①

Turno

Un agente actualiza solo con su regla y publica al instante. Un barrido son N turnos: cada uno jugó una vez.

≡

Secuencial

Orden fijo de lista: 0, 1, 2… siempre igual. Simple de depurar, pero privilegia al primero en cada barrido.

🔀

Aleatorio

Orden sorteado en cada barrido: permutación nueva por ronda. Empareja ventajas y exige réplicas y semilla.

El mismo turno en cada dominio.
MundoTurnoOrden típico
Tráficoun conductor frena y el de atrás lo vesecuencial por posición
Mercadouna compra mueve el precio al instantealeatorio por llegada
Schellinguna mudanza cambia el barrio yaaleatorio para no sesgar
Evacuaciónun paso libera su baldosa yaaleatorio por barrido

03 · Órdenes

Fijo que privilegia frente a sorteado que empareja

El orden fijo siempre favorece a los mismos; el sorteo reparte la ventaja pero agrega azar que hay que promediar.

Orden secuencial

La lista manda

Siempre juega 0 primero: for i in range(N). La ola corre más rápido hacia adelante que hacia atrás y el sesgo se repite idéntico.

Orden aleatorio

El sorteo manda

Cada barrido permuta: shuffle(orden). Ningún agente juega siempre primero, pero cada réplica arma otra historia.

Barrido
Unidad de tiempo async: N turnos donde cada agente jugó una vez. Equivale en costo a una ronda síncrona.
Permutación
Orden sorteado del barrido. Se genera con semilla para repetir la historia (Temas 42–43).
Frescura
Cuánto de lo que ve es recién cambiado. Async ve fresco; sync ve foto vieja (Tema 16).
Sesgo de orden
Ventaja sistemática del que juega antes. Se detecta comparando secuencial contra aleatorio.

04 · Ciclo

El barrido que turna de a uno

Cada barrido ordena y actualiza in-place, en este orden:

ordenar→actualizar uno→publicar ya
  1. 1
    Ordenar el barrido.

    Lista fija o permutación sorteada con semilla: ese es el turno de esta ronda.

  2. 2
    Actualizar uno.

    Cada agente lee vecinos frescos y viejos mezclados y decide con lo que hay.

  3. 3
    Publicar al instante.

    El cambio queda visible para el siguiente turno del mismo barrido, sin esperar tick.

05 · Representación en Python

Un arreglo que se pisa a propósito

Acá in-place es la regla, no el bug: se lee y escribe el mismo arreglo siguiendo el orden del barrido.

Python en tu navegador. Compará el barrido fijo contra el sorteado y observá quién se adelanta.

# Secuencial: siempre 0 primero, ventaja fija
cadena = [True, False, False, False]
for i in [0, 1, 2, 3]:
    if cadena[i - 1]:
        cadena[i] = True
print(cadena)

En un barrido ya hay 4 activos: el turno encadena contagios dentro de la misma ronda, a diferencia del Tema 16.

Sorteado con semilla

Cada barrido permuta el orden y se puede repetir con la misma semilla.

import random
random.seed(7)
cadena = [True, False, False, False]
orden = [0, 1, 2, 3]
random.shuffle(orden)
for i in orden:
    if cadena[i - 1]:
        cadena[i] = True
print(orden, cadena)

06 · Exploración

Laboratorio: el mismo anillo, otro turno

El mismo anillo del Tema 16, pero por turnos: en cada barrido cada agente juega una vez viendo lo recién cambiado. Con secuencial la ola corre más hacia adelante; con aleatorio avanza a saltos según el sorteo. ¿Cuánto más rápido que el reloj parejo?

EXPERIMENTO 17

El turno acelera la ola

turno(i) con vecinos frescos

Los resultados numéricos aparecen debajo.
Activos0 %
Encadenados0
Barridos0
LecturaChispa

En secuencial la ola encadena varios por barrido.

El mismo anillo del experimento 16: amarillo activo, verde aún no. En secuencial el avance es direccional; en aleatorio depende del sorteo de cada barrido. Pulsá Nueva réplica para otro sorteo.

Preguntas para explorar

  1. Con 1 barrido secuencial en anillo de 30 con 1 foco, ¿cuántos activos hay? ¿Por qué más que los 3 del síncrono?
  2. Cambiá a aleatorio con los mismos barridos. ¿El avance es simétrico? Repetilo 3 veces: ¿da siempre lo mismo?
  3. ¿Qué orden elegirías para una fila de mercado y cuál para una bandada? ¿Por qué el orden es parte del fenómeno?
Ver respuestas sugeridas
  1. Todo el anillo hacia adelante: el turno encadena y cada nuevo contagia al siguiente en el mismo barrido. Lo fresco acelera.
  2. No: el sorteo arma cadenas de distinta longitud por lado y cada réplica da otro total. Por eso async se promedia, no se muestra una vez.
  3. Fila con llegada: secuencial por posición o aleatorio por arribo. Bandada sin jefe: aleatorio para no privilegiar siempre al mismo.

07 · Comprensión

Confusiones frecuentes

«Async es sync desprolijo»

Son modelos distintos: uno congela foto con reloj, el otro encadena turnos con frescura. Cambiar uno por otro cambia velocidades y patrones.

«El orden da igual si hay azar»

El orden es azar con memoria: fijo privilegia siempre a los mismos, sorteado reparte pero exige réplicas. Declararlo es obligatorio.

«Un barrido async equivale a una ronda sync»

Cuesta lo mismo (N turnos) pero avanza distinto: async encadena varios vecinos por barrido y sync uno por ronda. No se comparan 1 a 1 sin esa corrección.

«Con una corrida alcanza»

Con sorteo una corrida es una historia. El resultado async es promedio y dispersión de réplicas con semilla (Tema 42).

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: encadenar en un barrido

Ejecutá el barrido secuencial y verificá cuántos se activan. Luego compará con el doble buffer del Tema 16.

cadena = [True, False, False, False, False]
for i in range(len(cadena)):
    if cadena[i - 1]:
        cadena[i] = True
print(cadena)
Ver solución razonada

Da 5 en 1 barrido contra 2 en 1 ronda síncrona: lo fresco encadena. La diferencia es el turno, no la regla.

Ejercicio 2: predecir el sorteo

Sin ejecutar primero: orden [2, 0, 3, 1] sobre [True, False, False, False]. ¿Cuántos se activan en ese barrido?

cadena = [True, False, False, False]
for i in [2, 0, 3, 1]:
    if cadena[i - 1]:
        cadena[i] = True
print(cadena)
Ver solución

Quedan [True, True, False, False]: el 2 jugó antes de que el 1 se activara y perdió su chance hasta el próximo barrido. El turno decide.

Ejercicio 3: barrido que equivale

Un barrido async son N turnos. ¿Cuántos turnos hay en 5 barridos de 40 agentes? ¿A cuántas rondas sync equivale en costo?

Ver una posible respuesta
print(5 * 40)

Hay 200 turnos: equivale en costo a 5 rondas sync, pero avanza más por encadenar. Costo igual, velocidad distinta.

09 · Síntesis

Ideas para recordar

  • Asíncrona es ordenar, actualizar uno y publicar ya: cada turno ve mezcla fresca.
  • Secuencial privilegia siempre a los mismos; aleatorio reparte con sorteo y semilla.
  • Un barrido son N turnos: cuesta como una ronda sync pero encadena más lejos.
  • El orden es parte del modelo: se declara, se justifica y se prueba la alternativa.
  • En Python, in-place con orden explícito y promedio de réplicas con semilla.

En el próximo tema estudiaremos las reglas locales: decisiones simples con información cercana.