[simpy] 01. python으로 시뮬레이션 만들기 - simpy 이해하기

2024. 5. 4. 12:59정보공유/python

  • 본격적으로 simpy를 이용한 시뮬레이션 문제를 풀어보기에 앞서서, simpy에 대한 기본적인 설명을 시작하겠습니다.
  •  Simpy란? python을 기반으로 하는 프로세스 기반 DES 프레임워크
    • 연속적인 시뮬레이션도 가능하지만, 'No features that help you with that..^^'''

Simpy DES Kernel

  • 주요 클래스: Environment, Event, Process

Simpy Kernal <출처: 서울대학교 조선해양공학과 우종훈 교수님 수업자료>

Simpy 작동 원리

  1. Environment 객체 정의
  2. Process 객체 생성
  3. 각각의 Process 제너레이터에서 Event 객체 생성
  4. Event 객체를 Environment queue에 스케줄링
  5. Queue의 Event를 시간 순서대로 처리
  6. 시뮬레이션의 time을 나타내는 _now 업데이트
  7. 처리된 Event를 발생시킨 Process 재실행
  8. 종료 조건을 만족할 때까지 과정을 반복

자세한 내용은 하단 링크에 정리되어 있습니다.

https://simpy.readthedocs.io/en/latest/topical_guides/simpy_basics.html#how-simpy-works

 

SimPy basics — SimPy 4.1.1 documentation

© Copyright 2002–2023, Team SimPy. Revision 22cb5d86.

simpy.readthedocs.io

 

  • 모든 process는 environments안에 있다
env = simpy.Environment()
  • 자동차, 고객 또는 메세지와 같은 active한 요소들의 행동은 process안에 모델링된다
  • 환경과 혹은 서로간의 interaction은 event를 통해 이루어 진다
    : event를 생성하고, yield될 때까지 기다린다.

Sample Example (1) 

  • 첫 번째 간단한 예제로, Car 문제를 풀어보겠습니다
  • 자동차가 수행할 수 있는 action은 두 가지입니다. 0시점에서부터 parking이 되어 있다가, parking duration이 지난 시점에 driving을 시작하고, driving이 끝남과 동시에 parking을 시작하는 순서입니다.
    • Parking : 주차시간은 5
    • Driving : 운전시간은 2
  • 총 시뮬레이션은 15 동안 이루어진다고 하겠습니다.
  • 코드구성
    • parking과 driving을 반복하는 car 함수를 정의합니다.
      • env.now 는 현재시간을 의미합니다. 
      • yield env.timout(000)은 000안에 정의된 값 만큼 멈춘다 라는 뜻입니다. 즉 000의 duration만큼의 시간이 흘러갑니다
    • env.process(car(env))를 통해 process할 함수를 연결해줍니다.
    • simpy를 run하기 위해서는 env.run(until=15)가 필요합니다.
import simpy

def car(env):
    while True:
        print('Start parking at', env.now)
        parking = 5
        yield env.timeout(parking)
        print('Start driving at', env.now)
        driving = 2
        yield env.timeout(driving)

env = simpy.Environment()
env.process(car(env))
env.run(until=15)

위와 같은 결과가 나온다면 성공입니다!


이후 포스팅 부터는 조금씩 복잡해지는 예제를 풀어보겠습니다.