Gói SimPy: Quản lý lập lịch sự kiện

Mô phỏng Sự kiện Rời rạc bằng Python

Dr Diogo Costa

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

Quản lý sự xuất hiện sự kiện

  • Sự xuất hiện của sự kiện trong thực tế có thể bị ảnh hưởng bởi nhiều tình huống.

  • Phổ biến nhất gồm:

    • sự kiện có điều kiện
    • gián đoạn sự kiện
    • chờ quy trình

Các tình huống này có thể mô hình hóa bằng SimPy (mô phỏng sự kiện rời rạc).

Mô phỏng Sự kiện Rời rạc bằng Python

Sự kiện có điều kiện

  • Một số sự kiện phụ thuộc vào sự xảy ra của sự kiện khác
  • Chỉ kích hoạt khi đáp ứng điều kiện

Ví dụ

  • Khách đến cửa hàng quần áo

    def customer_arrivals(env, shop)
    
  • Tìm mặt hàng cụ thể

    env.timeout(search_time)
    
  • Chỉ mua nếu còn hàng
if shop.available[item]:

Bộ sinh: ghép toàn bộ mã

def customer_arrivals(env, shop):

while True: yield env.timeout(search_time)
# Chỉ mua nếu còn hàng if shop.available[item]: env.process(shop_buyer(env, item, num_items, shop))
Mô phỏng Sự kiện Rời rạc bằng Python

Gián đoạn sự kiện

Một số sự kiện có thể bị gián đoạn do:

  • Sự kiện ưu tiên cao hơn xảy ra
  • Tự ngắt (ví dụ: sạc xe)
  • Bị buộc ngắt (ví dụ: máy hỏng)

Phương thức

simpy_process_1.interrupt()

Ví dụ

Máy định kỳ hỏng, làm gián đoạn dây chuyền.

def break_machine(env):

# Thỉnh thoảng máy hỏng. while True: # Thời gian giữa các lần hỏng yield env.timeout(fail_time())
# Máy hỏng: ngắt tiến trình simpy_process_1.interrupt()
Mô phỏng Sự kiện Rời rạc bằng Python

Chờ quy trình

  • Một số quy trình phải chờ quy trình khác hoàn tất
  • Thường do tài nguyên hạn chế
  • Ví dụ: tài nguyên dùng chung với capacity=5:
    simpy.Resource(env, capacity=5)
    
  • Do đó, một quy trình có thể phải chờ nếu tất cả tài nguyên đang bận

Ví dụ: Dự trữ xăng tại trạm phải được bổ sung định kỳ

with gas_station.request() as request:

# Yêu cầu một trụ bơm yield request
# Khi có trụ bơm: bơm nhiên liệu liters_request = 10 yield fuel_reserve.get(liters_request) # Việc bơm "thực" tốn thời gian refuel_duration = liters_request / refuel_speed
yield env.timeout(refuel_duration)
Mô phỏng Sự kiện Rời rạc bằng Python

Nối sự kiện bằng toán tử bit

Toán tử bit

  • Tính toán bitwise trên số nguyên
  • Cần hai toán hạng
    • Ví dụ: a & b, a >> b, a ^ b

Trong SimPy

  • Tạo sự kiện điều kiện
  • Giữa 2 sự kiện

Toán tử bit dùng trong SimPy

  • Chờ cả hai quy trình: __and__() hoặc &
  • Chờ một trong hai quy trình: __or__() hoặc |
Mô phỏng Sự kiện Rời rạc bằng Python

Nối sự kiện bằng toán tử bit

Ví dụ: Khán giả chờ đến lượt mua vé hoặc phim bán hết

with counter.request() as my_turn:

# Chờ đến lượt hoặc phim bán hết result = yield my_turn | counter.sold_out[movie]
# Nếu còn vé if my_turn in result: theater.num_moviegoers[movie] += 1 return
# Nếu hết vé if my_turn not in result: theater.num_renegers[movie] += 1 return
Mô phỏng Sự kiện Rời rạc bằng Python

Ayo berlatih!

Mô phỏng Sự kiện Rời rạc bằng Python

Preparing Video For Download...