SimPy 패키지: 리소스 유형

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

Dr Diogo Costa

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

사용 가능한 리소스 유형

  • SimPy는 세 가지 리소스 유형을 제공합니다:

  • resource

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

사용 가능한 리소스 유형

simpy.Resource()

  • 프로세스 간 리소스 공유
  • 예시: 레스토랑 테이블

simpy.Container()

  • 프로세스 간 균질 자원 공유 리소스
  • 이산형(사과) 또는 연속형(물) 가능
  • 예시: 저수지

simpy.Store()

  • 제한 없이 객체 저장 가능
  • 예시: 슈퍼마켓
Python으로 배우는 이산 사건 시뮬레이션

메서드: simpy.Resource()

리소스 생성

resource_1 = simpy.Resource(env, capacity=8)
  • 제한된 리소스 용량(예: capacity=8) 설정에 사용
  • 동시에 리소스에 접근하는 프로세스 수 제한에 사용
  • 프로세스는 리소스 사용 권한을 요청해야 함
    • 모든 리소스가 사용 중이면 요청이 대기열에 추가됨
  • 리소스 해제 시 대기 중인 요청이 처리됨

리소스 요청

# Open resource request
with resource_1.request() as request:

# Make resource request yield request
# Once resource is avaiable yield env.timeout(event_duration)
Python으로 배우는 이산 사건 시뮬레이션

리소스: 우선순위 및 선점

  • 이전 리소스의 변형

    resource_1 = simpy.PreemptiveResource(
    env, capacity=1)
    
  • 일부 프로세스가 다른 프로세스보다 우선순위를 가질 수 있음

  • 예시: 수리 기사

    • 우선순위 1: 고장난 기계 수리
    • 우선순위 2 이하: 기계 유지보수
  • 사용법은 simpy.Resource()와 유사 DNT_CURLY_TAG_7

  • 최고 우선순위로 리소스 요청

    with resource_1.request(priority=1) as 
    request:
    
    yield request
    yield env.timeout(process_duration)
    
  • 낮은 우선순위로 리소스 요청

    with resource_1.request(priority=2) as 
    request:
    
    yield request
    yield env.timeout(process_duration)
    
Python으로 배우는 이산 사건 시뮬레이션

메서드: simpy.Container()

  • 균질한 벌크 자원의 생산/소비 모델링에 유용

  • 연속형(물) 또는 이산형(사과) 가능

예시: 주유소의 연료 재고

  • 차량은 재고를 줄이고, 탱크 트럭은 재고를 늘림
  • 컨테이너 생성
    tank_1 = simpy.Container(
    env, tank_size, init=tank_size)
    
  • 컨테이너에 추가/제거

    yield tank_1.put(add_quantity)
    yield tank_1.get(remove_quantity)
    
  • 현재 용량 조회

    tank_1.level
    
  • 전체 용량 조회

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

메서드: simpy.Store()

  • 스토어 생성

    store_1 = simpy.Store(
    env, capacity=2)
    
  • simpy.Container()와 유사하나 다양한 객체 저장 가능

  • 컨테이너의 추상적인 "양"과 대조적

  • 스토어에 추가/제거
yield store_1.put("item_1")
yield store_1.get()
  • 사용 가능한 항목 목록 조회

    store_1.items
    
  • 스토어 용량 조회

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

SimPy 리소스를 비즈니스 의사결정에 활용하는 방법

예시

  • 계산원 1명인 슈퍼마켓
  • 계산원 추가 투자 가치 여부 파악
  • 계산원 추가 시 대기 시간 단축 여부?

현재 상황: 계산원 1명

  • simpy.Resource(env, capacity=1)
...
time: 23.7 min | Customer 30 > Finished

시뮬레이션 시나리오: 계산원 n명

  • simpy.Resource(env, capacity=2)
...
time: 13.2 min | Customer 30 > Finished
  • simpy.Resource(env, capacity=3)
...
time: 8.6 min | Customer 30 > Finished
  • simpy.Resource(env, capacity=4)
...
time: 8.6 min | Customer 30 > Finished
Python으로 배우는 이산 사건 시뮬레이션

연습해 봅시다!

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

Preparing Video For Download...