Visualização dos resultados da simulação de estacionamento SimPy

Recentemente compartilhei um exemplo de modelagem de simulação Python usando SimPy em Python. Usando SimPy, uma biblioteca de simulação de eventos discretos disponível em Python, modelei um estacionamento com uma quantidade definida de vagas e um processo de chegada de carros definido. Neste tutorial de acompanhamento sobre visualização de modelos de simulação SimPy , mostro como, usando o mesmo exemplo de linha de base, dados sobre a utilização de vagas de estacionamento podem ser coletados e visualizados . Além disso, nos próximos artigos mostrarei como o próprio estacionamento pode ser animado usando Python e SimPy.

Por que o SimPy é relevante para gerentes de operações e logística

SimPy, a biblioteca de simulação de eventos discretos de código aberto para Python, oferece uma ferramenta valiosa para gerentes da cadeia de suprimentos. Não se trata de recursos isolados, mas sim de como o SimPy capacita esses profissionais para lidar com as complexidades do gerenciamento da cadeia de suprimentos.

Uma das principais vantagens do SimPy é a capacidade de criar modelos realistas de operações da cadeia de suprimentos. Estes modelos assemelham-se muito aos processos reais dentro de uma cadeia de abastecimento, tornando mais fácil para os gestores analisar e compreender as suas operações. Em um campo onde as operações do mundo real podem ser incrivelmente complexas, é indispensável ter uma ferramenta de simulação que reflita com precisão essas complexidades.

O que torna o SimPy ainda mais atraente é a sua flexibilidade. É uma biblioteca de simulação de uso geral, o que significa que os gerentes da cadeia de suprimentos podem adaptá-la para modelar vários aspectos de suas operações. Quer se trate de gerenciamento de estoque, processamento de pedidos, previsão de demanda, transporte ou qualquer outro elemento crítico da cadeia de suprimentos, o SimPy pode ser adaptado para enfrentar desafios específicos.

A força do SimPy também reside na sua capacidade de facilitar análises “e se”. Os gerentes da cadeia de suprimentos podem usar o SimPy para testar diferentes cenários e estratégias. Eles podem explorar o impacto das mudanças nas suas operações, ajudando-os a tomar decisões informadas sobre a otimização dos processos da cadeia de abastecimento. Esta capacidade de modelar diferentes cenários e prever resultados é inestimável para o planeamento estratégico.

Em um mundo onde a eficiência é fundamental, o SimPy auxilia na otimização do desempenho. Os gestores da cadeia de abastecimento podem simular os seus processos, identificar estrangulamentos e ineficiências e trabalhar em estratégias para melhorar o desempenho global. Essa otimização pode levar à redução de custos e à melhoria do atendimento ao cliente.

A resiliência da cadeia de abastecimento é crítica e o SimPy é uma ferramenta valiosa para a gestão de riscos. Ao modelar vários cenários de risco, os gestores podem avaliar as vulnerabilidades nas suas cadeias de abastecimento e desenvolver planos de contingência para mitigar potenciais perturbações. Isto é essencial no atual cenário globalizado e muitas vezes imprevisível da cadeia de abastecimento.

A alocação de recursos é outra área em que o SimPy prova seu valor. Ele pode simular como recursos como mão de obra, máquinas e espaço de armazenamento são alocados em diferentes cenários. Esta visão ajuda os gestores a tomar decisões informadas sobre o planeamento de recursos, garantindo que os recursos são utilizados de forma eficiente e eficaz.

A redução de custos é um benefício significativo do uso do SimPy. Ao identificar ineficiências e otimizar processos, os gestores podem reduzir potencialmente os custos associados a inventário, transporte e outros aspectos operacionais. Essa redução de custos impacta diretamente os resultados financeiros de uma empresa.

Adições de modelo para visualização do modelo de estacionamento SimPy

Em meu exemplo anterior de modelo de estacionamento SimPy, eu já tinha o código do modelo básico do estacionamento . Você pode encontrar o exemplo de codificação aqui: Exemplo de modelagem de simulação de estacionamento SimPy

No modelo base não houve visualização. As chegadas e partidas de carros no estacionamento eram simplesmente impressas no console. Agora implementaremos uma visualização dos resultados da simulação SimPy.

Para poder visualizar os resultados da simulação, devemos coletar dados de simulação relevantes e monitorar valores relevantes durante a simulação. Após executar a simulação, os dados coletados são visualizados com matplotlib .pyplot.

Existem várias maneiras de monitorar valores em um modelo de simulação SimPy, mas a maneira mais fácil (para iniciantes em SimPy) de começar a monitorar a quantidade de vagas de estacionamento ocupadas e disponíveis é implementar um processo de monitoramento SimPy personalizado:

def monitor_parkingspot(self) -> None:

 
        while self.env.now <= self.simdata.duration:

            self.simdata.data_timeseries[self.env.now, 0] = self.env.now
            self.simdata.data_timeseries[self.env.now, 1] = self.spots_occupied
            self.simdata.data_timeseries[self.env.now, 2] = self.spots_available

            yield self.env.timeout(1)

Adicionei um método à classe ParkingLot para implementar um processo de monitoramento personalizado. Este processo verifica o tempo de simulação, o número de pontos disponíveis e o número de pontos disponíveis e grava esses valores em um ndarray numpy . Você pode ver no exemplo acima que a classe ParkingLot possui alguns atributos e variáveis ​​adicionais: .data_timeseries (: numpy .ndarray), .spots_occupied (: int) e .spots_available (: int). Esta é a aparência do cabeçalho e do construtor da classe agora:

class ParkingLot:

    env             :simpy.Environment
    capacity        :int
    spots           :simpy.resources.container.Container
    spots_occupied  :int
    spots_available :int
    simdata         :Simdata

    def __init__(self, 
        env      :simpy.Environment, 
        capacity :int,
        duration :int
        ):
        
        """ constructor """
        
        self.env = env
        self.capacity = capacity
        self.spots = simpy.resources.container.Container(env, capacity, init=capacity)
        self.spots_occupied = 0
        self.spots_available = capacity
        self.simdata = Simdata(duration= duration)
        self.simdata.data_timeseries = np.zeros([duration+1, 3], dtype = int)

Para o atributo .simdata, escrevi uma pequena classe, Simdata. Escreverei mais métodos e atributos nesta classe em tutoriais futuros, então gostaria de apresentá-los neste momento.

class Simdata:

    duration         :int
    data_timeseries  :np.ndarray

    def __init__(self, 
        duration :int,
        ):
    
        """ constructor """

        self.duration = duration
        self.data_timeseries = np.zeros(duration+1, dtype = float)

A quantidade de vagas ocupadas e disponíveis, agora variáveis ​​da classe ParkingLot, são atualizadas ao longo do processo de chegada do carro:

def car_arrival(self,
        car_id          :int, 
        dwelltime_min   :float,
        dwelltime_max   :float
        )               -> None:
        """ 
    
        implement simpy process; 
        models car arrivals in the parking lot, occupying a slot for a randomly distributed duration
    
        """
    
        #print(f"Car {car_id} arrives at {self.env.now}")
    
        yield self.spots.get(1)

        self.spots_occupied += 1
        self.spots_available -= 1
        
        #print(f"Car {car_id} parks at {self.env.now}")
        
        yield self.env.timeout(random.uniform(dwelltime_min, dwelltime_max))
        
        #print(f"Car {car_id} leaves at {self.env.now}")
        
        self.spots_occupied -= 1
        self.spots_available += 1

        yield self.spots.put(1)

Isso facilita a coleta de resultados durante a simulação. Agora posso plotar os resultados após a conclusão da simulação.

Visualizando slots ocupados e disponíveis, usando resultados gerados pelo SimPy

A última etapa é simples: eu uso matplotlib .pyplot para criar um lote de linha mostrando a quantidade de vagas ocupadas e disponíveis no estacionamento durante todo o tempo de simulação.

env.process(parking_lot.monitor_parkingspot())

# run the model
env.run()

# plot simulation results
plt.plot(parking_lot.simdata.data_timeseries[:,1], linestyle = 'dotted', color = "red", label = "occupied")
plt.plot(parking_lot.simdata.data_timeseries[:,2], linestyle = 'dotted', color = "green", label = "available")
plt.legend()
plt.xlabel("sim time")
plt.ylabel("# of spots")
plt.title("parking lot utilization over time")
plt.show()

Você pode ver que adicionei outro processo SimPy ao configurar o modelo de simulação antes de sua execução. Este é o processo de monitoramento. Ele coleta resultados de simulação a cada incremento de simulação e armazena esses valores em um ndarray numpy .

Aqui está a aparência dos resultados.

estacionamento , neste cenário, é subutilizado. 2 vagas de estacionamento teriam sido suficientes para este cenário específico de chegada de carro.

Observações finais e conteúdo relacionado

Neste tutorial, mostrei como você pode monitorar valores relevantes do modelo SimPy durante todo o tempo de simulação e como implementar a visualização dos resultados da simulação SimPy usando matplotlib .pyplot em Python.

Aqui estão alguns artigos relacionados nos quais você também pode estar interessado:

You May Also Like

Leave a Reply

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.