저는 최근 Python에서 SimPy를 사용한 Python 시뮬레이션 모델링 예제를 공유했습니다. Python에서 사용할 수 있는 이산 이벤트 시뮬레이션 라이브러리인 SimPy를 사용하여 정의된 슬롯 수와 정의된 차량 도착 프로세스를 갖춘 주차장을 모델링했습니다. SimPy 시뮬레이션 모델 의 시각화에 대한 이 후속 튜토리얼에서는 동일한 기본 예제를 사용하여 주차장 슬롯 활용에 대한 데이터를 수집하고 시각화 할 수 있는 방법을 보여줍니다 . 앞으로의 기사에서는 Python과 SimPy를 사용하여 주차장 자체를 애니메이션화하는 방법을 더 보여줄 것입니다 .
SimPy가 운영 및 물류 관리자와 관련된 이유
Python용 오픈 소스 이산 이벤트 시뮬레이션 라이브러리인 SimPy는 공급망 관리자에게 유용한 도구를 제공합니다. 이는 고립된 기능에 관한 것이 아니라 SimPy가 이러한 전문가에게 공급망 관리의 복잡성을 해결할 수 있는 권한을 부여하는 방법에 관한 것입니다.
SimPy의 뛰어난 장점 중 하나는 공급망 운영의 현실적인 모델을 생성하는 능력입니다. 이러한 모델은 공급망 내의 실제 프로세스와 매우 유사하므로 관리자가 운영을 더 쉽게 분석하고 이해할 수 있습니다. 실제 작업이 엄청나게 복잡할 수 있는 분야에서는 이러한 복잡성을 정확하게 반영하는 시뮬레이션 도구를 갖는 것이 필수적입니다.
SimPy를 더욱 매력적으로 만드는 것은 유연성입니다. 이는 범용 시뮬레이션 라이브러리로, 공급망 관리자가 이를 조정하여 운영의 다양한 측면을 모델링할 수 있음을 의미합니다. 재고 관리, 주문 처리, 수요 예측, 운송 또는 기타 공급망의 중요한 요소에 관계없이 SimPy는 특정 문제를 해결하도록 맞춤화될 수 있습니다.
SimPy의 강점은 “what-if” 분석을 용이하게 하는 능력에도 있습니다. 공급망 관리자는 SimPy를 사용하여 다양한 시나리오와 전략을 테스트할 수 있습니다. 운영 변경이 미치는 영향을 탐색하여 공급망 프로세스 최적화에 대한 정보에 근거한 결정을 내릴 수 있습니다. 다양한 시나리오를 모델링하고 결과를 예측하는 이러한 능력은 전략 계획에 매우 중요합니다.
효율성이 가장 중요한 세상에서 SimPy는 성능 최적화를 돕습니다. 공급망 관리자는 프로세스를 시뮬레이션하고, 병목 현상과 비효율성을 식별하고, 전반적인 성과를 향상시키기 위한 전략을 수립할 수 있습니다. 이러한 최적화는 비용 절감과 고객 서비스 개선으로 이어질 수 있습니다.
공급망 탄력성은 매우 중요하며 SimPy는 위험 관리를 위한 귀중한 도구입니다. 다양한 위험 시나리오를 모델링함으로써 관리자는 공급망의 취약성을 평가하고 잠재적인 중단을 완화하기 위한 비상 계획을 개발할 수 있습니다. 이는 오늘날 세계화되고 종종 예측이 불가능한 공급망 환경에서 필수적입니다.
리소스 할당은 SimPy가 그 가치를 입증하는 또 다른 영역입니다. 노동력, 기계, 저장 공간 등의 자원이 다양한 시나리오에서 어떻게 할당되는지 시뮬레이션할 수 있습니다. 이러한 통찰력은 관리자가 자원 계획에 대해 정보에 입각한 결정을 내리고 자원이 효율적이고 효과적으로 사용되도록 보장하는 데 도움이 됩니다.
비용 절감은 SimPy를 사용함으로써 얻을 수 있는 중요한 이점입니다. 비효율성을 식별하고 프로세스를 최적화함으로써 관리자는 재고, 운송 및 기타 운영 측면과 관련된 비용을 잠재적으로 줄일 수 있습니다. 이러한 비용 절감은 회사의 수익에 직접적인 영향을 미칩니다.
SimPy 주차장 모델 시각화를 위한 모델 추가
이전 SimPy 주차장 모델 예제에서는 이미 주차장 기준 모델 의 코드를 작성했습니다 . 여기에서 코딩 예제를 찾을 수 있습니다: SimPy 주차장 시뮬레이션 모델링 예제
기본 모델에는 시각화가 없었습니다. 주차장 안팎 의 차량 도착 및 출발 정보가 콘솔에 간단히 인쇄되었습니다. 이제 SimPy 시뮬레이션 결과의 시각화를 구현하겠습니다.
시뮬레이션 결과를 시각화하려면 관련 시뮬레이션 데이터를 수집해야 하며, 시뮬레이션 전반에 걸쳐 관련 값을 모니터링해야 합니다. 시뮬레이션을 실행한 후 수집된 데이터는 matplotlib .pyplot을 사용하여 시각화됩니다.
SimPy 시뮬레이션 모델 에서 값을 모니터링하는 방법에는 여러 가지가 있지만 , 점유 공간과 사용 가능한 주차 공간의 양을 모니터링하기 시작하는 가장 쉬운 방법(SimPy 초보자의 경우)은 맞춤형 SimPy 모니터링 프로세스를 구현하는 것입니다.
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)
사용자 지정 모니터링 프로세스를 구현하기 위해 ParkingLot 클래스에 메서드를 추가했습니다. 이 프로세스는 시뮬레이션 시간, 사용 가능한 스팟 수 및 사용 가능한 스팟 수를 확인하고 이러한 값을 numpy ndarray 에 씁니다 . 위의 예에서 볼 수 있듯이 ParkingLot 클래스에는 .data_timeseries(: numpy .ndarray), .spots_owned(: int) 및 .spots_available(: int)과 같은 몇 가지 추가 속성과 변수가 있습니다. 이제 클래스의 헤더와 생성자는 다음과 같습니다.
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)
.simdata 속성의 경우 Simdata라는 작은 클래스를 작성했습니다. 향후 튜토리얼에서 이 클래스에 더 많은 메소드와 속성을 작성할 것이므로 이 시점에서 소개하고 싶었습니다.
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)
이제 ParkingLot 클래스의 변수인 점유 및 사용 가능한 지점 수는 차량 도착 프로세스 전반에 걸쳐 업데이트됩니다.
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)
이는 시뮬레이션 중에 결과 수집을 용이하게 합니다. 이제 시뮬레이션 실행이 완료된 후 결과를 플롯할 수 있습니다.
SimPy 생성 결과를 사용하여 점유된 슬롯과 사용 가능한 슬롯 시각화
마지막 단계는 간단합니다. matplotlib .pyplot을 사용하여 시뮬레이션 시간 동안 주차장 에서 점유된 주차 공간과 사용 가능한 주차 공간의 양을 보여주는 선을 생성합니다 .
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()
시뮬레이션 모델을 실행하기 전에 설정할 때 SimPy 프로세스를 하나 더 추가한 것을 볼 수 있습니다 . 모니터링하는 과정입니다. 모든 시뮬레이션 증분에서 시뮬레이션 결과를 수집하고 이러한 값을 numpy ndarray 에 저장합니다 .
결과는 다음과 같습니다.
이 시나리오에서는 주차장 이 제대로 활용되지 않습니다. 이 특정 차량 도착 시나리오에는 주차 공간 2개면 충분했습니다.
결론 및 관련 내용
이 튜토리얼에서는 시뮬레이션 시간 전체에 걸쳐 관련 SimPy 모델 값을 모니터링하는 방법과 Python에서 matplotlib .pyplot 을 사용하여 SimPy 시뮬레이션 결과의 시각화를 구현하는 방법을 보여주었습니다 .
다음은 귀하가 관심을 가질 만한 관련 기사입니다.
- 링크 : R에서 끓이는 기능을 갖춘 주차장 시뮬레이터
- 링크 : 바지선 운송 SimPy 시뮬레이션
- 링크 : Job Shop SimPy Python 시뮬레이션
- 링크 : LinnartSF/DesViz
최적화 및 시뮬레이션을 전문으로하는 산업 엔지니어 (R, Python, SQL, VBA)
Leave a Reply