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

พื้นฐาน Discrete Event Simulation ด้วย SimPy ใน Python


พื้นฐาน Discrete Event Simulation ด้วย SimPy ใน Python

SimPy (ออกเสียงร้องกับ "Blimpie") เป็นแพ็กเกจ Python สำหรับ process-oriented discrete-event simulation

การติดตั้ง (Installation)

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

pip install simpy

และผลลัพธ์ที่คุณอาจได้จะเป็นแบบนี้ −

พื้นฐาน Discrete Event Simulation ด้วย SimPy ใน Python

ณ เวลาที่เขียน 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)

ถ้าเรารันโปรแกรมข้างต้น เราจะเห็นผลลัพธ์ประมาณ −

พื้นฐาน Discrete Event Simulation ด้วย SimPy ใน Python

ข้างต้นเราพยายามจำลองสถานการณ์ห้องประชุม ซึ่งมีจำนวนผู้บรรยายสุ่ม พร้อม 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)