Paket SimPy: Mengelola penjadwalan event

Simulasi Peristiwa Diskret dengan Python

Dr Diogo Costa

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

Mengelola terjadinya event

  • Terjadinya event pada masalah nyata dipengaruhi berbagai situasi.

  • Situasi umum meliputi:

    • event kondisional
    • interupsi event
    • menunggu proses

Situasi ini dapat dimodelkan sebagai model event-diskret SimPy.

Simulasi Peristiwa Diskret dengan Python

Event kondisional

  • Event tertentu bergantung pada event lain
  • Hanya dipicu jika syarat terpenuhi

Contoh

  • Pelanggan datang ke toko pakaian

    def customer_arrivals(env, shop)
    
  • Mencari item tertentu

    env.timeout(search_time)
    
  • Membeli hanya jika tersedia
if shop.available[item]:

Generator: menggabungkan seluruh kode

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))
Simulasi Peristiwa Diskret dengan Python

Interupsi event

Event tertentu dapat terinterupsi karena:

  • Event prioritas lebih tinggi
  • Interupsi sukarela (mis., pengisian mobil)
  • Interupsi paksa (mis., mesin rusak)

Metode

simpy_process_1.interrupt()

Contoh

Mesin rusak berkala, menginterupsi lini produksi.

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()
Simulasi Peristiwa Diskret dengan Python

Menunggu proses

  • Beberapa proses harus menunggu proses lain selesai
  • Ini sering terjadi karena sumber daya terbatas
  • Contoh: sumber daya bersama dengan capacity=5:
    simpy.Resource(env, capacity=5)
    
  • Maka proses mungkin menunggu jika semua sumber daya dipakai

Contoh: Cadangan BBM di SPBU perlu diisi ulang berkala

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)
Simulasi Peristiwa Diskret dengan Python

Menggabungkan event dengan operator bitwise

Operator bitwise

  • Melakukan operasi bit pada bilangan bulat
  • Membutuhkan dua operan
    • Contoh: a & b, a >> b, a ^ b

Di SimPy

  • Menghasilkan event kondisi
  • Antara 2 event

Operator bitwise relevan untuk SimPy

  • Menunggu kedua proses: __and__() atau &
  • Menunggu salah satu proses: __or__() atau |
Simulasi Peristiwa Diskret dengan Python

Menggabungkan event dengan operator bitwise

Contoh: Penonton menunggu di antrean tiket hingga gilirannya atau film habis terjual

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
Simulasi Peristiwa Diskret dengan Python

Ayo berlatih!

Simulasi Peristiwa Diskret dengan Python

Preparing Video For Download...