使用Python中的SimPy進行離散事件模擬的基礎知識


SimPy(發音類似於“Blimpie”)是一個用於面向過程的離散事件模擬的Python包。

安裝

安裝SimPy最簡單的方法是透過pip

pip install simpy

你可能會得到類似這樣的輸出:

在撰寫本文時,simpy-3.0.11是SimPy的最新版本,我們將在以下所有示例中使用它。

如果SimPy已經安裝,請使用pip的–U選項進行升級。

pip install –U simpy

注意:你需要安裝python 2.7或更高版本,對於Linux/Unix/MacOS,你可能需要root許可權才能安裝SimPy。

要檢查SimPy是否成功安裝,請開啟python shell並匯入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後停止。

超時型別的事件在經過一定量的(模擬)時間後被觸發。超時事件允許程序保持或休眠一段時間。包括超時在內的所有事件都可以透過呼叫程序所在的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)

如果我們執行上面的程式,我們將看到類似這樣的輸出:

我們在上面嘗試複製會議廳的場景,其中有隨機數量的演講者,每場會議的演講次數為4次,每次演講時長為40分鐘,休息時長為30分鐘。

我們的參與者程序需要一個Environment (env)的引用、姓名、知識和飢餓感才能建立新的事件。會議將無限迴圈,直到它變為False。attendee()函式是一個生成器,它不會終止,而是在到達yield語句後將控制流傳遞迴模擬。

最後,我們執行一個演示模擬“會議參與者”,直到達到設定的250值(包括:3次演講,1次休息,3次演講,1次休息,1次演講)。

更新於:2019年7月30日

573 次瀏覽

啟動你的職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.