Simulando parada de bus con simpy
En este ejemplo vamos a simular una parada de bus donde llegan personas y autobuses, usando simpy
. Este paquete permite simular componentes como vehículos o personas y su interacción entre ellos a través de eventos.
Veamos un ejemplo simulando la parada de un bus. Tenemos dos procesos:
- 🧍🏼 Personas: Personas que llegan a la parada aleatoriamente.
- 🚌 Bus: Bus que llega a la parada y se lleva a gente a intervalos fijos con cierta aleatoriedad.
Este tipo de simulaciones puede ser interesante para dimensionar el tamaño de los autobuses y frecuencias de los mismos, buscando que la gente espere lo menos posible y sin derrochar recursos.
Si tienes 10
personas que llegan por minuto y un bus que pasa cada 1
hora con 20
plazas, con total seguridad en la parada se acumulará gente y tus usuarios se enfadarán. No queremos que pase esto.
Empezamos importando lo que necesitamos.
import simpy
import random
Ahora definimos una Parada
de bus con dos procesos. Uno simula personas llegando a la parada de bus y otro simula el bus llegando a la parada y llevándose a la gente.
class Parada:
def __init__(self, env, capacidad_bus):
self.personas = 0
self.env = env
self.capacidad_bus = capacidad_bus
def llega_persona(self):
while True:
llegan = random.randint(0, 10)
print(f"[PERSONA] Llegan {llegan} en el minuto {self.env.now}")
self.personas += llegan
yield self.env.timeout(1)
def llega_bus(self):
while True:
se_lleva = min(self.capacidad_bus, self.personas)
self.personas -= se_lleva
print(f"[BUS] Se lleva: {se_lleva} y quedan {self.personas}")
yield self.env.timeout(random.uniform(5, 10))
Veamos paso por paso:
- 🧍🏼
llega_persona
: Cada1
segundo llegan a la parada un número de personas aleatorias entre0
y10
. - 🚌
llega_bus
: Un bus llega una vez aleatoriamente entre5
y10
minutos, con una distribución normal. Cada vez que llega se llevacapacidad_bus
personas.
Ahora creamos el entorno env
y ejecutamos la simulación durante 120 minutos.
env = simpy.Environment()
parada = Parada(env, capacidad_bus=50)
env.process(parada.llega_persona())
env.process(parada.llega_bus())
env.run(until=120)
Puedes ver como con estos parámetros casi nunca queda gente esperando por el bus. Sin embargo si bajamos la capacidad_bus
a 30
podremos ver como el bus no da abasto y cada vez se acumulan más personas esperando en la parada.
Este tipo de simulaciones son muy útiles para dimensionar líneas de bus o metro. Ante una demanda determinada podemos estimar:
- 📏 El tamaño del bus medido en capacidad de personas.
- ⏳ La frecuencia del bus medida en tiempo.
Esto es también aplicable a simulaciones sobre propagación de virus, mercados financieros o tráfico. Te animamos a que explores todo lo que simpy
ofrece.
✏️ Ejercicios:
- Usando
matplotlib
representa en una gráfica el número de personas que están en la parada esperando a lo largo del tiempo. Realiza modificaciones enParada
si hiciera falta.