Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python에서 SimPy를 사용한 이산 이벤트 시뮬레이션의 기초

<시간/>

Python에서 SimPy를 사용한 이산 이벤트 시뮬레이션의 기초

SimPy("Blimpie"와 운율)는 프로세스 지향 이산 이벤트 시뮬레이션을 위한 Python 패키지입니다.

설치

SimPy를 설치하는 가장 쉬운 방법은 pip를 사용하는 것입니다.

pip install simpy

그리고 다음과 같은 결과를 얻을 수 있습니다.

Python에서 SimPy를 사용한 이산 이벤트 시뮬레이션의 기초

작성 당시 simpy-3.0.11은 SimPy의 가장 최신 버전이며 아래의 모든 예제에 사용할 것입니다.

SimPy가 이미 설치된 경우 pip에 -U 옵션을 사용하여 업그레이드하십시오.

pip install –U simpy

참고 :python 2.7 이상 버전이 필요하고 Linux/Unix/MacOS의 경우 SimPy를 설치하려면 루트 권한이 필요할 수 있습니다.

SimPy가 성공적으로 설치되었는지 확인하려면 python 셸을 열고 simpy를 가져오세요.

기본 개념

이산 이벤트 시뮬레이션 라이브러리인 SimPy. simpy의 활성 구성 요소(예:메시지, 차량 또는 고객)는 프로세스로 모델링됩니다. SimPy에서 활성 엔티티는 프로세스로 알려져 있습니다. 프로세스는 개별 이벤트를 생성하는 Python 생성기입니다. 나는 아무 것도 반환하지 않지만 나는 yield(ing)입니다. 이것이 일반 함수와 생성기의 차이입니다. 이를 통해 이벤트를 생성하고 이벤트가 트리거될 때까지 기다리기 위해 이벤트를 생성할 수 있습니다.

프로세스가 이벤트를 생성하면 프로세스가 일시 중단됩니다. SimPy를 사용하면 이벤트가 트리거될 때마다 일시 중단된 프로세스를 재개할 수 있습니다. 여러 프로세스가 동일한 이벤트를 기다리는 경우 SimPy는 해당 이벤트를 생성한 순서대로 프로세스를 재개합니다.

def gen(x):
y = yield x+1
return y


>>> g = gen(1)
>>> next(g)
2
>>> next(g)
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
next(g)
StopIteration

위의 반복은 변수 x 첫 번째 yield 후에 중지됩니다.

Timeout 유형의 이벤트는 일정 시간(시뮬레이션된) 시간이 지나면 트리거됩니다. Timeout 이벤트는 프로세스가 특정 시간 동안 보류 또는 휴면하도록 합니다. Timeout을 포함한 모든 이벤트는 프로세스가 있는 Environment의 적절한 메소드를 호출하여 생성할 수 있습니다.

#Import important library
from random import randint
import simpy
#Config
TALKS_PER_SESSION = 3
TALK_LENGTH = 30
BREAK_LENGTH = 15
ATTENDEES = 1
def attendee(env, name, knowledge=0, hunger=0):
   talks =0
   breaks =0
   #Repeat sessions
   while True:
      # Visit talks
      for i in range(TALKS_PER_SESSION):
      print('Talk {0} begins at {1}'.format(talks+1, env.now))
      knowledge += randint(0, 3) / (1 + hunger)
      hunger += randint(1, 4)
      talks += 1
      yield env.timeout(TALK_LENGTH)
      print(f'Talk {talks} ends at {env.now}')
   print('Attendee %s finished talks with knowledge %.2f and hunger ' '%.2f' %( name, knowledge, hunger))
   #Take a break, Go to buffet
   food = randint(3, 12)
   hunger -= min(food, hunger)
   yield env.timeout(BREAK_LENGTH)
   print('Attendee %s finished eating with hunger %.2f ' %(name, hunger))
# Run Simulation
env = simpy.Environment()
for i in range(ATTENDEES):
   env.process(attendee(env, i))
env.run(until=250)

위의 프로그램을 실행하면 다음과 같은 출력이 표시됩니다.

Python에서 SimPy를 사용한 이산 이벤트 시뮬레이션의 기초

위에서 우리는 세션당 4명의 강연자가 있고 강연 길이가 40분이고 길이가 30분인 회의장 시나리오를 복제하려고 합니다.

참석자 프로세스에는 새로운 이벤트를 생성하기 위해 환경(env), 이름, 지식 및 기아에 대한 참조가 필요합니다. 세션은 False가 될 때까지 무한 루프로 이동합니다. 참석자() 함수는 종료되지 않지만 yield 문에 도달하면 제어 흐름을 시뮬레이션으로 다시 전달하는 생성기입니다.

마지막으로, 우리는 250이라는 설정 값에 도달하지 않을 때까지 데모 시뮬레이션 '회의 참석자'를 실행합니다(3회, 1회, 3회, 1회, 1회 발표 포함).