แนะนำแพ็กเกจ SimPy

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

Dr Diogo Costa

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

SimPy คืออะไร?

โลโก้แพ็กเกจ SimPy: การจำลองเหตุการณ์แบบไม่ต่อเนื่องสำหรับ Python

  • เฟรมเวิร์กจำลองเหตุการณ์แบบไม่ต่อเนื่อง (discrete-event simulation) ที่ใช้ Python มาตรฐาน

  • ใช้ generator function เพื่อกำหนดกระบวนการและเหตุการณ์ (ศึกษาในคอร์สพื้นฐาน Toolbox)

  • รองรับการขยายขนาด (Scalable):

    • โมเดลสามารถมี generator หลายตัว
    • แต่ละ generator สามารถมี หลายกระบวนการ
    • กระบวนการทำงานแบบต่อเนื่องหรือขนานกันได้
การจำลองเหตุการณ์แบบไม่ต่อเนื่องด้วย Python

ฟังก์ชันทั่วไป vs. generator function

ฟังก์ชันทั่วไป (Normal Function)

def mygenerator():
    return 10
  • return คืนค่าและสิ้นสุดการทำงานของฟังก์ชัน

ผลลัพธ์เมื่อเรียกใช้ฟังก์ชัน:

10

Generator Function

def mygenerator():
    yield 20
    yield 12
  • yield คืนค่าและหยุดพักการทำงานชั่วคราวโดยยังคงสถานะภายในไว้

ผลลัพธ์เมื่อเรียกใช้ generator:

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

สรุปเมธอดสำคัญของ SimPy

1) สร้าง SimPy Environment

env = simpy.Environment()

2) เพิ่ม Generator Function เข้า SimPy Environment

env.process()

3) รันโมเดล

env.run()

4) ให้เวลาผ่านไปในการจำลอง

env.timeout()

5) ดึงเวลาปัจจุบันของการจำลอง

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

ไฟจราจร: สร้างโมเดล SimPy

1) นำเข้าแพ็กเกจ SimPy

import simpy

2) สร้าง generator function ที่ประกอบด้วยกระบวนการต่าง ๆ

def traffic_light(env, name, timestep):
     while True:
        yield env.timeout(timestep)
        print(f"Time {env.now:02d} sec | Traffic light at {name} | Red light!")
        yield env.timeout(timestep)
        print(f"Time {env.now:02d} sec | Traffic light at {name} | Yellow Light!")
        yield env.timeout(timestep)
        print(f"Time {env.now:02d} sec | Traffic light at {name} | Green Light!")
การจำลองเหตุการณ์แบบไม่ต่อเนื่องด้วย Python

ไฟจราจร: สร้างโมเดล SimPy

3) สร้าง SimPy environment

env = simpy.Environment()

4) เพิ่ม generator เข้า SimPy environment

env.process(traffic_light(env, "Leslie St.", 15))
env.process(traffic_light(env, "Arlington Av.", 30))

5) รันโมเดล

env.run(until=90)
การจำลองเหตุการณ์แบบไม่ต่อเนื่องด้วย Python

ไฟจราจร: ผลลัพธ์ของโมเดล

ผลลัพธ์ของโมเดลใน Console:

Time 15 sec  |  Traffic light at Leslie St.     |  Red light!
Time 30 sec  |  Traffic light at Arlington Av.  |  Red light!
Time 30 sec  |  Traffic light at Leslie St.     |  Yellow Light!
Time 45 sec  |  Traffic light at Leslie St.     |  Green Light!
Time 60 sec  |  Traffic light at Arlington Av.  |  Yellow Light!
Time 60 sec  |  Traffic light at Leslie St.     |  Red light!
Time 75 sec  |  Traffic light at Leslie St.     |  Yellow Light!
การจำลองเหตุการณ์แบบไม่ต่อเนื่องด้วย Python

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

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

Preparing Video For Download...