SimPy 패키지: 이벤트 스케줄 관리

Python으로 배우는 이산 사건 시뮬레이션

Dr Diogo Costa

Adjunct Professor, University of Saskatchewan, Canada & CEO of ImpactBLUE-Scientific

이벤트 발생 관리

  • 현실 문제의 이벤트 발생은 여러 상황의 영향을 받습니다.

  • 대표적 상황:

    • 조건부 이벤트
    • 이벤트 중단
    • 프로세스 대기

이러한 상황은 SimPy 이산 이벤트 모델로 표현할 수 있습니다.

Python으로 배우는 이산 사건 시뮬레이션

조건부 이벤트

  • 어떤 이벤트는 다른 이벤트에 의존합니다
  • 조건이 충족될 때만 트리거됩니다

  • 고객이 의류 매장에 도착

    def customer_arrivals(env, shop)
    
  • 특정 상품을 찾음

    env.timeout(search_time)
    
  • 재고가 있을 때만 구매
if shop.available[item]:

제너레이터: 코드 통합

def customer_arrivals(env, shop):

while True: yield env.timeout(search_time)
# Only buy item if available if shop.available[item]: env.process(shop_buyer(env, item, num_items, shop))
Python으로 배우는 이산 사건 시뮬레이션

이벤트 중단

다음 이유로 이벤트가 중단될 수 있습니다:

  • 더 높은 우선순위 이벤트 발생
  • 자발적 중단(예: 전기차 충전)
  • 강제 중단(예: 기계 고장)

메서드

simpy_process_1.interrupt()

기계가 주기적으로 고장 나 생산 라인을 중단합니다.

def break_machine(env):

# Break machine every now and then. while True: # Time between machine fails yield env.timeout(fail_time())
# Machine fail: interrupt process simpy_process_1.interrupt()
Python으로 배우는 이산 사건 시뮬레이션

프로세스 대기

  • 일부 프로세스는 다른 프로세스가 끝날 때까지 기다려야 합니다
  • 자원 한계로 자주 발생합니다
  • 예: 공유 자원 capacity=5
    simpy.Resource(env, capacity=5)
    
  • 모든 자원이 사용 중이면 대기합니다

예: 주유소의 연료 비축은 정기 보충이 필요합니다

with gas_station.request() as request:

# Request one of the gas pumps yield request
# Once pump is available: pump fuel liters_request = 10 yield fuel_reserve.get(liters_request) # The "actual" refueling takes time refuel_duration = liters_request / refuel_speed
yield env.timeout(refuel_duration)
Python으로 배우는 이산 사건 시뮬레이션

비트 연산자로 이벤트 결합

비트 연산자

  • 정수에 비트 연산 수행
  • 두 피연산자 필요
    • 예: a & b, a >> b, a ^ b

SimPy에서

  • 조건 이벤트 생성
  • 두 이벤트 사이에서 동작

SimPy에 유용한 비트 연산자

  • 두 프로세스를 모두 대기: __and__() 또는 &
  • 둘 중 하나를 대기: __or__() 또는 |
Python으로 배우는 이산 사건 시뮬레이션

비트 연산자로 이벤트 결합

예: 관객은 자신의 차례가 오거나 매진될 때까지 대기

with counter.request() as my_turn:

# Wait until turn or movie is sold out result = yield my_turn | counter.sold_out[movie]
# If tickets available if my_turn in result: theater.num_moviegoers[movie] += 1 return
# If tickets sold out if my_turn not in result: theater.num_renegers[movie] += 1 return
Python으로 배우는 이산 사건 시뮬레이션

Let's practice!

Python으로 배우는 이산 사건 시뮬레이션

Preparing Video For Download...