
SimPy (ออกเสียงร้องกับ "Blimpie") เป็นแพ็กเกจ Python สำหรับ process-oriented discrete-event simulation
การติดตั้ง (Installation)
วิธีที่ง่ายที่สุดในการติดตั้ง SimPy คือผ่าน pip:
pip install simpy
และผลลัพธ์ที่คุณอาจได้จะเป็นแบบนี้ −

ณ เวลาที่เขียน simpy-3.0.11 เป็นเวอร์ชันล่าสุดของ SimPy และเราจะใช้มันสำหรับตัวอย่างทั้งหมดด้านล่าง
ในกรณีที่ SimPy ติดตั้งแล้ว ใช้ตัวเลือก --U สำหรับ pip เพื่ออัปเกรด
pip install --U simpy
หมายเหตุ: คุณต้องมี Python 2.7 หรือสูงกว่า และสำหรับ Linux/Unix/MacOS คุณอาจต้องการ root privileges เพื่อติดตั้ง SimPy
เพื่อตรวจสอบว่า SimPy ติดตั้งสำเร็จแล้ว ให้เปิด Python shell และ import simpy
แนวคิดพื้นฐาน (Basic Concepts)
SimPy ซึ่งเป็นไลบรารี discrete-event simulation องค์ประกอบที่ active ของ simpy (เช่น ข้อความ ยานพาหนะ หรือลูกค้า) ถูกจำลองด้วย processes ใน SimPy active entities ถูกเรียกว่า processes Process คือ Python generator ที่ yield discrete events โปรดสังเกต ฉันไม่ได้ return อะไร แต่ฉัน yield (ing) นั่นคือความแตกต่างระหว่างฟังก์ชันปกติและ generator นี่ช่วยให้เราสร้าง events และ yield พวกมันเพื่อรอให้พวกมันถูก triggered
เมื่อ process yield event process นั้นจะถูก suspend SimPy อนุญาตให้เรา resume suspended process ทุกครั้งที่ event ถูก triggered ในกรณีที่มีหลาย processes รอ event เดียวกัน SimPy จะ resume พวกมันในลำดับเดียวกับที่พวกมัน yield event นั้น
def gen(x): y = yield x+1 return y
>>> g = gen(1) >>> next(g) 2 >>> next(g) Traceback (most recent call last): File "", line 1, in next(g) StopIteration
Iteration หยุดหลังจากตัวแปร x yield ครั้งแรก
Events ของ Timeout type จะถูก triggered หลังจากผ่านไปเป็นจำนวนเวลา (จำลอง) จำนวนหนึ่ง Timeout event อนุญาตให้ process hold หรือ sleep เป็นเวลาจำนวนหนึ่ง ทุก events รวมถึง Timeout สามารถสร้างได้โดยการเรียกเมธอดที่เหมาะสมของ Environment ที่ process อยู่ในนั้น
# นำเข้าไลบรารีสำคัญ 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)
ถ้าเรารันโปรแกรมข้างต้น เราจะเห็นผลลัพธ์ประมาณ −

ข้างต้นเราพยายามจำลองสถานการณ์ห้องประชุม ซึ่งมีจำนวนผู้บรรยายสุ่ม พร้อม talks per session 4 talk length 40 นาที และ break length 30 นาที
กระบวนการ attendee ของเราต้องการ reference ไปยัง Environment (env), name, knowledge, และ hunger เพื่อสร้าง events ใหม่ Sessions จะไปใน infinite loop จนกว่าจะกลายเป็น False ฟังก์ชัน attendee() เป็น generator ซึ่งจะไม่ terminate แต่จะส่ง control flow กลับไปยัง simulation เมื่อเจอ yield statement
ที่สุด เรารัน demo simulation 'conference attendee' จนกว่าค่าที่ตั้งไว้ 250 จะไม่ถึง (รวมถึง - 3 talks, 1 break, 3 talks, 1 break, 1 talk)