SimPy Package: การจัดการกำหนดการของอีเวนต์

การจำลองเหตุการณ์แบบไม่ต่อเนื่องด้วย Python

Dr Diogo Costa

Adjunct Professor, University of Saskatchewan, Canada & CEO of ImpactBLUE-Scientific

การจัดการการเกิดขึ้นของอีเวนต์

  • การเกิดขึ้นของอีเวนต์ในปัญหาจริงอาจได้รับผลกระทบจากหลายสถานการณ์

  • สถานการณ์ที่พบบ่อยที่สุด ได้แก่:

    • อีเวนต์แบบมีเงื่อนไข
    • การหยุดชะงักของอีเวนต์
    • การรอให้กระบวนการเสร็จสิ้น

สถานการณ์เหล่านี้สามารถนำมาสร้างเป็นโมเดล discrete-event ใน SimPy ได้

การจำลองเหตุการณ์แบบไม่ต่อเนื่องด้วย Python

อีเวนต์แบบมีเงื่อนไข

  • บางอีเวนต์ขึ้นอยู่กับการเกิดขึ้นของอีเวนต์อื่น
  • จะถูกเรียกใช้งานก็ต่อเมื่อเงื่อนไขที่กำหนดเป็นจริงเท่านั้น

ตัวอย่าง

  • ลูกค้าเดินเข้าร้านเสื้อผ้า

    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))
การจำลองเหตุการณ์แบบไม่ต่อเนื่องด้วย Python

การหยุดชะงักของอีเวนต์

บางอีเวนต์อาจถูกหยุดชะงักจาก:

  • อีเวนต์ที่มีความสำคัญสูงกว่าเกิดขึ้นก่อน
  • การหยุดโดยสมัครใจ (เช่น การชาร์จรถยนต์)
  • การหยุดโดยถูกบังคับ (เช่น เครื่องจักรเสีย)

วิธีการ

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()
การจำลองเหตุการณ์แบบไม่ต่อเนื่องด้วย Python

การรอให้กระบวนการเสร็จสิ้น

  • บางกระบวนการต้องรอให้กระบวนการอื่นเสร็จสิ้นก่อน
  • เกิดขึ้นบ่อยเพราะทรัพยากรมีจำนวนจำกัด
  • ตัวอย่าง: ทรัพยากรที่ใช้ร่วมกันโดยมี 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_speed
yield env.timeout(refuel_duration)
การจำลองเหตุการณ์แบบไม่ต่อเนื่องด้วย Python

การเชื่อมต่ออีเวนต์ด้วย Bitwise Operators

Bitwise operators

  • คำนวณระดับบิตบนจำนวนเต็ม
  • ต้องการตัวถูกดำเนินการสองตัว
    • ตัวอย่าง: a & b, a >> b, a ^ b

ใน SimPy

  • สร้างอีเวนต์แบบมีเงื่อนไข
  • ระหว่างอีเวนต์ 2 รายการ

Bitwise operators ที่ใช้ใน SimPy

  • รอให้ทั้งสองกระบวนการเสร็จ: __and__() หรือ &
  • รอให้กระบวนการใดกระบวนการหนึ่งเสร็จ: __or__() หรือ |
การจำลองเหตุการณ์แบบไม่ต่อเนื่องด้วย Python

การเชื่อมต่ออีเวนต์ด้วย Bitwise Operators

ตัวอย่าง: ผู้ชมรอคิวซื้อตั๋วจนกว่าจะถึงตาหรือตั๋วหมด

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

มาฝึกกันเถอะ!

การจำลองเหตุการณ์แบบไม่ต่อเนื่องด้วย Python

Preparing Video For Download...