Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

พื้นฐานของการจำลองเหตุการณ์แบบไม่ต่อเนื่องโดยใช้ SimPy ใน Python


พื้นฐานของการจำลองเหตุการณ์แบบไม่ต่อเนื่องโดยใช้ SimPy ใน Python

SimPy (คล้องจองกับ “Blimpie”) เป็นแพ็คเกจหลามสำหรับการจำลองเหตุการณ์แบบไม่ต่อเนื่องที่เน้นกระบวนการ

การติดตั้ง

วิธีที่ง่ายที่สุดในการติดตั้ง SimPy คือผ่าน pip:

pip install simpy

และผลลัพธ์ที่ได้ก็จะประมาณนี้

พื้นฐานของการจำลองเหตุการณ์แบบไม่ต่อเนื่องโดยใช้ SimPy ใน Python

ในขณะที่เขียน simpy-3.0.11 เป็นเวอร์ชันล่าสุดของ SimPy และเราจะใช้สำหรับตัวอย่างด้านล่างทั้งหมด

ในกรณีที่ติดตั้ง SimPy แล้ว ให้ใช้ตัวเลือก –U เพื่อให้ pip อัปเกรด

pip install –U simpy

หมายเหตุ :คุณต้องมี python 2.7 หรือเวอร์ชันที่สูงกว่า และสำหรับ Linux/Unix/MacOS คุณอาจต้องใช้สิทธิ์รูทเพื่อติดตั้ง SimPy

หากต้องการตรวจสอบว่าติดตั้ง SimPy สำเร็จหรือไม่ ให้เปิด python shell แล้วนำเข้า simpy

แนวคิดพื้นฐาน

SimPy ซึ่งเป็นไลบรารีจำลองเหตุการณ์ที่ไม่ต่อเนื่อง ส่วนประกอบที่ใช้งานของ simpy (เช่น ข้อความ ยานพาหนะ หรือลูกค้า) ถูกจำลองด้วยกระบวนการ ใน SimPy เอนทิตีที่ใช้งานอยู่เรียกว่ากระบวนการ กระบวนการคือเครื่องกำเนิด Python ที่ให้เหตุการณ์ที่ไม่ต่อเนื่อง โปรดทราบว่าฉันไม่ได้คืนอะไรเลย แต่ฉันให้ผลตอบแทน (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 ให้ผลตอบแทนครั้งแรก

เหตุการณ์ประเภทหมดเวลาจะถูกทริกเกอร์หลังจากเวลา (จำลอง) ผ่านไปจำนวนหนึ่ง เหตุการณ์การหมดเวลาช่วยให้กระบวนการระงับหรือพักเครื่องเป็นระยะเวลาหนึ่ง เหตุการณ์ทั้งหมดรวมทั้งการหมดเวลาสามารถสร้างขึ้นได้โดยการเรียกวิธีการที่เหมาะสมของสภาพแวดล้อมที่กระบวนการนั้นอาศัยอยู่

#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)

หากเราเรียกใช้โปรแกรมข้างต้น เราจะเห็นผลลัพธ์บางอย่างเช่น

พื้นฐานของการจำลองเหตุการณ์แบบไม่ต่อเนื่องโดยใช้ SimPy ใน Python

ด้านบน เราพยายามจำลองสถานการณ์ในห้องประชุม โดยจะมีการสุ่มจำนวนผู้พูดซึ่งมีการบรรยายต่อเซสชัน 4 คน โดยมีความยาวพูดคุย 40 นาที และแบ่งความยาว 30 นาที

กระบวนการเข้าร่วมของเราจำเป็นต้องมีการอ้างอิงถึงสิ่งแวดล้อม (สิ่งแวดล้อม) ชื่อ ความรู้ และความหิวโหยเพื่อสร้างกิจกรรมใหม่ เซสชันจะวนซ้ำไปเรื่อยๆ จนกว่าจะกลายเป็นเท็จ ฟังก์ชันผู้เข้าร่วม () เป็นตัวสร้างซึ่งจะไม่ยุติ แต่จะผ่านขั้นตอนการควบคุมกลับไปที่การจำลองเมื่อถึงคำสั่งผลตอบแทน

ในที่สุด เราก็เรียกใช้ 'ผู้เข้าร่วมการประชุม' จำลองสถานการณ์จำลอง จนกว่าจะไม่ถึงค่าที่ตั้งไว้ 250 (รวม- พูดคุย 3 ครั้ง, พัก 1 ครั้ง, พูดคุย 3 ครั้ง, พัก 1 ครั้ง, พูดคุย 1 ครั้ง)