Computer Science/Python

[SimPy] 파이썬 시뮬레이션: 기초 알아보기

Taewon Heo 2020. 3. 16. 16:25

[SimPy] 파이썬 시뮬레이션: 기초 알아보기

 

 

1. Environment

Environment 클래스를 객체화(선언)하는 것은 새로운 게임을 생성하는 것과 같다.

 

import simpy

env = simpy.Environment()

 

위와 같이 simpy의 Environment 클래스를 인스턴스화 하여 environment를 정의한다.

 

2. Process Interaction

Process는 다른 프로세스를 기다리거나 중간에 interrupt를 걸 수 있게 하는 env의 기능이다. 

import simpy

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

이 차는 전기차여서 충전시간이 필요하다. 충전은 charge()라는 함수로 구현하고 '5'라는 충전시간이 지나면 차는 출발한다.

class Car(object):
    def __init__(self, env):
    	self.env = env
        self.action = env.process(self.run())
        
    def run(self):
    	charge_duration = 5
    	yield self.env.timeout(self.charge(charge_duration))
    	
    def charge(self, duration):
    	yield self.env.timeout(duration)

운전자가 충전을 다 기다리지 않고 출발을 원한다면 어떻게 구현해야 할까? 충전은 run() 함수 안에서 돌아가므로, run()에 interrupt를 거는 함수를 만들 필요가 있다.

 

2-1 Interrupting another process

interrupting을 구현하기 위해 driver라는 함수를 만들었다.

def driver(env, car):
    yield env.timeout(3)
    car.action.interrupt()

 이 함수는 클래스 내부에서 선언하지 않았다. 이 함수는 car라는 클래스 인스턴스를 파라미터로 받아 env.process를 interrupt 한다.

import simpy

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

 

3. Resources

리소스란 사용 가능한 자원이다. 예를 들어, 충전기가 5개인 충전소에 여러대의 차들이 충전을 하러 오는 상황을 생각해 볼 수 있다. 그리고 일반적인 카페와 같이 만들어서 파는 생산자-소비자 관계가 있을 수 있다.

def car(env, name, station, driving_time, charge_duration):
	yield env.timeout(driving_time) # 차가 돌아다니다가 들어올 시간
    
    print(f'{name} 차가 충전소에 {env.now}에 도착했습니다.)
    with station.request() as req:
    	yield req
        
        print(f'{name} 차가 충전을 시작한 시간 {env.now}')
        yield env.timeout(charge_duration)
        print(f'{name} 차의 충전이 완료된 시간 {env.now}')
        
import simpy
env = simpy.Environment()
station = simpy.Resource(env, capacity=2)

for i in range(4):
	env.process(car(env, f'Car {i}', station, i*2, 5))

env.run()    

 

Resource클래스를 station으로 인스턴스화했고 Resource 인스턴스는 request() 함수를 사용할 수 있다. 이 함수는 리소스인 station이 다시 사용가능해질 때까지 기다리게 한다. station의 리소스 총량은 capacity 값으로 정할 수 있다.

여기서 충전소가 차에게 리소스를 제공하는 형태는 FIFO(first in first out) 방식이다.