Основы моделирования дискретных событий с использованием SimPy

| | | | | | | | | | | | | | | | | | | | |

Установка:
Чтобы установить SimPy, используйте следующую команду —

pip install simpy 

Основные понятия:

Основная идея ‚Äã‚ÄãSimPy — это функция-генератор в Python. Разница между обычной функцией и генератором заключается в том, что обычная функция использует оператор возврата, а генератор — оператор yield.

Если функция имеет оператор return, то даже если будет сделано несколько вызовов функции, она вернет одно и то же значение. Например —


def func():

return 1

return 2

Когда func() вызывается во время выполнения, она всегда будет возвращаться в первом экземпляре оператора return, то есть func() всегда возвращает 1 , а следующий оператор return никогда не выполняется.

Однако, когда моделируя дискретные события, нам может понадобиться найти состояние системы в данный момент времени T. Для этого нужно запомнить состояние интервала непосредственно перед T, а затем выполнить это моделирование и вернуться в состояние во время T.

Здесь функции генератора весьма ezny. Например, рассмотрим следующую функцию


def func ():

while True :

yield 1

yield 2

Теперь при первом вызове этой функции она "дает" 1. Однако при следующем вызове она вернет 2. В каком-то смысле она запоминает, что она возвращается после последнего вызова и переходит к следующему оператору выхода.

События в SimPy называются процессами , которые определяются своими собственными функциями-генераторами. Эти процессы происходят в окружающей среде . (Представьте себе, что среда — это большая коробка, внутри которой хранятся процессы.)

Давайте рассмотрим простой пример, включающий моделирование светофора —


# Код Python 2.7 для демонстрации основ пакета SimPy
# Симуляция светофора


# import пакет SimPy

import simpy


# Генераторная функция который определяет, как работает светофор
Функция # timeout() заставляет ждать следующий оператор yield
# this время передано в качестве аргумента

def Traffic_Light (en v):


while True :


print " Light превращает GRN в " + str (env.now)


# Горит зеленым в течение 25 секунд

yield env.timeout ( 25 )


print "Свет становится YEL в " + str (env.now)

< br>

# Светло-желтый на 5 секунд

yield env.timeout ( 5 )


print "Свет становится КРАСНЫМ в" + str (env.now)


# Подсвечивается красным для 60 секунд

yield env.timeout ( 60 )


# env — переменная среды

env = simpy.Environment ()


# Процесс, определенный Traffic_Light (env)
# добавлен в среду
env.process (Traffic_Light (env) )


# Процесс запускается в течение первых 180 секунд (180 секунд не включены)

e nv.run (до = 180 )

Выход:

Светофор загорается ЗЕЛЕНЫМ на 0 Свет загорается ЖЕЛ на 25 Свет загорается КРАСНЫМ на 30 Свет загорается ЗЕЛЕНЫМ на 90 Свет становится ЖЕЛТЫМ на 115 Свет становится КРАСНЫМ на 120 

В этом коде функция-генератор Traffic_Light (env) принимает переменную среды в качестве аргумента и имитирует светофор в течение периода времени, передаваемого как аргумент для env.run(). (На самом деле время в SimPy не имеет единиц измерения. Хотя для удобства его можно перевести в часы, минуты или секунды). env.now возвращает текущее прошедшее время.

Функция env.timeout() является основой этой симуляции, поскольку она ожидает, что время, переданное в качестве аргумента, будет использоваться на часах симуляции компьютера ( это не часы реального времени), а затем запускает следующий оператор yield до тех пор, пока не истечет время, переданное в качестве аргумента в env.run().

env.run() запускает все процессы, связанные с окружением в то же время = 0 .