การจำลองเหตุการณ์แบบไม่ต่อเนื่องด้วย Python
Dr Diogo Costa
Adjunct Professor, University of Saskatchewan, Canada & CEO of ImpactBLUE-Scientific
การเกิดขึ้นของอีเวนต์ในปัญหาจริงอาจได้รับผลกระทบจากหลายสถานการณ์
สถานการณ์ที่พบบ่อยที่สุด ได้แก่:
สถานการณ์เหล่านี้สามารถนำมาสร้างเป็นโมเดล discrete-event ใน SimPy ได้
ตัวอย่าง
ลูกค้าเดินเข้าร้านเสื้อผ้า
def customer_arrivals(env, shop)
ค้นหาสินค้าที่ต้องการ
env.timeout(search_time)
if shop.available[item]:
Generator: รวมโค้ดทั้งหมดเข้าด้วยกัน
def customer_arrivals(env, shop):while True: yield env.timeout(search_time)# Only buy item if available if shop.available[item]: env.process(shop_buyer(env, item, num_items, shop))
บางอีเวนต์อาจถูกหยุดชะงักจาก:
วิธีการ
simpy_process_1.interrupt()
ตัวอย่าง
เครื่องจักรเสียเป็นระยะ ทำให้สายการผลิตหยุดชะงัก
def break_machine(env):# Break machine every now and then. while True: # Time between machine fails yield env.timeout(fail_time())# Machine fail: interrupt process simpy_process_1.interrupt()
capacity=5:simpy.Resource(env, capacity=5)
ตัวอย่าง: ปั๊มน้ำมันต้องเติมสำรองน้ำมันเป็นระยะ
with gas_station.request() as request:# Request one of the gas pumps yield request# Once pump is available: pump fuel liters_request = 10 yield fuel_reserve.get(liters_request) # The "actual" refueling takes time refuel_duration = liters_request / refuel_speedyield env.timeout(refuel_duration)
Bitwise operators
a & b, a >> b, a ^ bใน SimPy
Bitwise operators ที่ใช้ใน SimPy
__and__() หรือ &__or__() หรือ |ตัวอย่าง: ผู้ชมรอคิวซื้อตั๋วจนกว่าจะถึงตาหรือตั๋วหมด
with counter.request() as my_turn:# Wait until turn or movie is sold out result = yield my_turn | counter.sold_out[movie]# If tickets available if my_turn in result: theater.num_moviegoers[movie] += 1 return# If tickets sold out if my_turn not in result: theater.num_renegers[movie] += 1 return
การจำลองเหตุการณ์แบบไม่ต่อเนื่องด้วย Python