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.
| Mundo | Celda | Ocupación típica |
|---|---|---|
| Segregación | lote urbano | exclusiva: una familia por lote |
| Evacuación | baldosa de 0,4 m | exclusiva: un cuerpo por baldosa |
| Epidemia | hogar o aula | múltiple: varios por celda |
| Vida | célula viva o muerta | exclusiva: 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:
- 1Proponer destino.
Cada agente elige una celda vecina (Moore o von Neumann) según su regla.
- 2Resolver choques.
Si dos quieren la misma celda libre, uno gana por orden o sorteo; con exclusiva nadie comparte.
- 3Ocupar 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.
La casilla decide el flujo
si libre → saltar, si ocupada → quedar
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
- Con 0 rondas, ¿cuántos saltos hay? ¿Por qué sin rondas no hay flujo aunque haya celdas libres?
- Con 80 agentes, ¿qué vecindad bloquea más? ¿Por qué von Neumann se atasca antes que Moore?
- Repetí la misma configuración 3 veces. ¿Los bloqueos son idénticos? ¿Qué parte es rejilla y qué parte es sorteo?
Ver respuestas sugeridas
- Cero: la rejilla inicial solo muestra densidad. El flujo exige proponer y resolver rondas.
- Von Neumann: con 4 salidas hay menos escapes y más choques por la misma celda. Moore abre diagonales y destraba.
- 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.