Link Search Menu Expand Document
El Libro De Python (24.95 €) 39.95 €

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: Cada 1 segundo llegan a la parada un número de personas aleatorias entre 0 y 10.
  • 🚌 llega_bus: Un bus llega una vez aleatoriamente entre 5 y 10 minutos, con una distribución normal. Cada vez que llega se lleva capacidad_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 en Parada si hiciera falta.