Simulación Basada en Agentes · Tema 14

Espacios discretos

Rejillas, celdas y mundos por casillas: contar en lugar de medir, saltar en lugar de deslizar.

01 · Punto de partida

El mundo en casillas

Hasta ahora los agentes flotaban en un plano de coordenadas reales. Pero muchos mundos se piensan en casillas: el tablero de Schelling, la sala con butacas, la manzana con lotes, el Juego de la Vida. El espacio discreto parte el mapa en celdas contables donde estar es ocupar una casilla.

Ese recorte simplifica todo: la distancia es pasos de celda, el vecino es la casilla lindera (Tema 13) y el movimiento es saltar. El precio es la resolución: la casilla muy grande borra pasillos y la muy chica cuesta cómputo.

  • ¿De qué tamaño es cada celda y cuántas hay?
  • ¿Cuántos agentes caben por celda: uno o muchos?
  • ¿Quiénes son vecinos: Moore con diagonales o von Neumann sin ellas?
  • ¿Qué pasa al querer entrar a una celda ocupada?

02 · Definición

Celda, rejilla y ocupación

Todo mundo por casillas combina tres piezas, de la unidad al mapa:

▣

Celda

La unidad con coordenadas enteras (f, c). Guarda quién está y qué hay: pasto, muro, salida o vacío.

⊞

Rejilla

La grilla W × H de celdas con su vecindad y su borde. Define qué significa al lado y qué pasa en el límite.

●

Ocupación

Cuántos caben por celda: exclusiva (uno, como butaca) o múltiple (muchos, como plaza). Decide choques y colas.

La misma rejilla en cada dominio.
MundoCeldaOcupación típica
Segregaciónlote urbanoexclusiva: una familia por lote
Evacuaciónbaldosa de 0,4 mexclusiva: un cuerpo por baldosa
Epidemiahogar o aulamúltiple: varios por celda
Vidacélula viva o muertaexclusiva: la celda es el agente

03 · Ocupación

Exclusiva que choca frente a múltiple que acumula

Una butaca no se comparte; una plaza sí. Esa regla de capacidad decide si aparecen colas o densidades.

Ocupación exclusiva

Una celda, un agente

Saltar exige celda libre: si ocupada → quedarse. Crea bloqueos, filas y arcos en puertas. Base de tráfico y evacuación.

Ocupación múltiple

Una celda, muchos

La celda guarda una lista o un conteo: hoguera, aula, manzana. No hay bloqueo, hay densidad que contagia o presiona.

Celda
Casilla con fila y columna enteras. La posición ya no es 0,37 sino (3, 5): contar en vez de medir.
Vecindad Moore
8 linderas con diagonales. Más movimientos, más contactos, diagonales que filtran por esquinas.
Vecindad von Neumann
4 ortogonales sin diagonales. Calles en cruz, contagios sin atajos diagonales.
Densidad
Agentes sobre celdas (N / W×H). Manda en bloqueos: rala fluye, densa se atasca.

04 · Ciclo

El paso por casillas

Cada paso propone celdas y resuelve choques, en este orden:

proponer→resolver→ocupar
  1. 1
    Proponer destino.

    Cada agente elige una celda vecina (Moore o von Neumann) según su regla.

  2. 2
    Resolver choques.

    Si dos quieren la misma celda libre, uno gana por orden o sorteo; con exclusiva nadie comparte.

  3. 3
    Ocupar y liberar.

    Actualizar el mapa: la vieja queda libre y la nueva ocupada, en una sola operación.

05 · Representación en Python

La rejilla es una grilla que se ocupa

La grilla guarda enteros o listas por celda. Moverse es pedir la vecina y chequear ocupación antes de saltar.

Python en tu navegador. Cambiá la vecindad de Moore a von Neumann y contá cuántos destinos pierde cada celda.

W, H = 5, 4
grilla = [[None for _ in range(W)] for _ in range(H)]
grilla[1][2] = "A"

def vecinos(f, c, kind="moore"):
    dirs = [(-1,0),(1,0),(0,-1),(0,1)]
    if kind == "moore":
        dirs += [(-1,-1),(-1,1),(1,-1),(1,1)]
    out = []
    for df, dc in dirs:
        nf, nc = f + df, c + dc
        if 0 <= nf < H and 0 <= nc < W:
            out.append((nf, nc))
    return out

print(len(vecinos(2, 2, "moore")), len(vecinos(2, 2, "von")))
print(len(vecinos(0, 0, "moore")), len(vecinos(0, 0, "von")))

Al centro Moore da 8 y von Neumann 4; en la esquina 3 y 2: el borde recorta la vecindad.

Saltar si está libre

Con ocupación exclusiva el salto chequea destino antes de mover.

def saltar(f, c, nf, nc):
    if grilla[nf][nc] is None:
        grilla[nf][nc] = grilla[f][c]
        grilla[f][c] = None
        return True
    return False

print(saltar(1, 2, 1, 3), grilla[1][3])
print(saltar(1, 3, 1, 3))

06 · Exploración

Laboratorio: saltar sin chocar

La rejilla es de 12 × 7 con ocupación exclusiva: un punto por celda. En cada ronda cada agente propone una celda vecina al azar; si está libre salta, si no se queda. Compará Moore (8 salidas) contra von Neumann (4 salidas) con la misma densidad.

EXPERIMENTO 14

La casilla decide el flujo

si libre → saltar, si ocupada → quedar

Los resultados numéricos aparecen debajo.
Saltos0
Bloqueos0
Celdas libres0 %
LecturaFluido

Con 40 agentes en Moore, los saltos fluyen.

Cada casilla es una celda: clara libre, oscura ocupada. Los puntos son agentes. Pulsá Nueva réplica para otra disposición inicial con los mismos parámetros.

Preguntas para explorar

  1. Con 0 rondas, ¿cuántos saltos hay? ¿Por qué sin rondas no hay flujo aunque haya celdas libres?
  2. Con 80 agentes, ¿qué vecindad bloquea más? ¿Por qué von Neumann se atasca antes que Moore?
  3. Repetí la misma configuración 3 veces. ¿Los bloqueos son idénticos? ¿Qué parte es rejilla y qué parte es sorteo?
Ver respuestas sugeridas
  1. Cero: la rejilla inicial solo muestra densidad. El flujo exige proponer y resolver rondas.
  2. Von Neumann: con 4 salidas hay menos escapes y más choques por la misma celda. Moore abre diagonales y destraba.
  3. No: el orden de propuesta y el destino sorteado cambian cada historia. La rejilla y la vecindad son fijas; la secuencia de intentos no.

07 · Comprensión

Confusiones frecuentes

«Discreto es continuo con redondeo»

Redondear coordenadas no crea celdas: sin grilla, ocupación y vecindad no hay choques ni conteos. Discreto es contar casillas, no recortar decimales.

«Moore y von Neumann dan lo mismo»

Moore duplica salidas al centro y abre diagonales que contagian y destraban. En epidemias y flujos la vecindad cambia el resultado.

«Dos en una celda no molestan»

Con exclusiva es corrupción del mapa: dos cuerpos en una baldosa. Si querés acumulación, declará ocupación múltiple con lista o conteo.

«El orden de propuesta da igual»

Con exclusiva el primero se queda con la celda y el segundo rebota. El orden (aleatorio o fijo) decide quién pasa: es Temas 16–17.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: contar vecinas

Ejecutá y verificá cuántas vecinas tiene el centro y la esquina en cada vecindad.

def n_vecinas(f, c, W=5, H=5, kind="moore"):
    dirs = [(-1,0),(1,0),(0,-1),(0,1)]
    if kind == "moore":
        dirs += [(-1,-1),(-1,1),(1,-1),(1,1)]
    return sum(1 for df, dc in dirs if 0 <= f+df < H and 0 <= c+dc < W)

print(n_vecinas(2, 2, kind="moore"), n_vecinas(2, 2, kind="von"))
print(n_vecinas(0, 0, kind="moore"), n_vecinas(0, 0, kind="von"))
Ver solución razonada

Da 8, 4 al centro y 3, 2 en la esquina: el borde recorta. La vecindad se programa con chequeo de límites, no de memoria.

Ejercicio 2: predecir el choque

Sin ejecutar primero: dos agentes quieren la misma celda libre con ocupación exclusiva. ¿Cuántos entran?

celda = None
for quien in ["A", "B"]:
    if celda is None:
        celda = quien
print(celda)
Ver solución

Entra uno solo: A. El segundo encuentra ocupada y rebota. Sin resolver choques, la celda corrupta tendría dos.

Ejercicio 3: densidad que atasca

Rejilla 10 × 10 con 95 agentes exclusivos. ¿Qué fracción queda libre? ¿Qué esperás del flujo?

Ver una posible respuesta
W, H, n = 10, 10, 95
print("libre:", 1 - n / (W * H))

Libre solo 0,05: casi todo ocupado y casi todo intento rebota. Densidad alta con exclusiva es congestión casi segura.

09 · Síntesis

Ideas para recordar

  • Discreto es celda, rejilla y ocupación: estar es ocupar enteros y moverse es saltar.
  • Exclusiva crea bloqueos y filas; múltiple acumula densidades que contagian.
  • Moore abre 8 salidas, von Neumann 4: la vecindad cambia flujos y contagios.
  • Se propone, se resuelven choques y se ocupa origen y destino juntos.
  • En Python, la rejilla es grilla con chequeo de límites y de celda libre.

En el próximo tema estudiaremos los espacios continuos: coordenadas reales y movimiento libre.