Python Coding ขำ ๆ: ลอง simulate สถานการณ์ COVID-19 แบบง่าย ๆ ด้วย Python part 1
Tags: python, oop
Published: 2020-04-19 05:34:21

สำหรับสถานการณ์ช่วงนี้ที่ทั้งโลกกำลังเผชิญหน้ากับ COVID-19 เจ้าหน้าที่ที่มีหน้าที่รับผิดชอบในเรื่องนี้คงต้องคิดกันจนปวดหัวนะครับ ว่าจะ take action หรือออก policy อย่างไร ภายใต้ทรัพยากรที่จำกัด เงินจำกัด และคนก็จำกัด ควรจะลงทุนกับการวิจัย vaccine ก่อนดี หรือจะแก้เฉพาะหน้าไปก่อนดี _และแต่ละ action จะส่งผลอย่างไร มากหรือน้อย_

ในการจะตอบคำถามต่าง ๆ นั้น ส่วนหนึ่งก็จำเป็นอาศัยการสร้าง model ทางคณิตศาสตร์ที่แม่นยำเพื่อทำนายผลในอนาคตล่วงหน้าเพื่อให้ทราบว่าสถานการณ์ข้างหน้ากำลังจะเป็นไปอย่างไร และถ้าทำอย่างนี้ไป จะเกิดอะไรขึ้น

ซึ่งงานในส่วนนี้โดยทั่วไปก็จะมี *นักระบาดวิทยา (Epidemiologist)* คอยทำหน้าที่ในการเก็บข้อมูลจริง เพื่อมาสร้างโมเดล หรือออกมาตรการรับมือต่าง ๆ อยู่แล้วครับ และยังมี model ทางคณิตศาตร์อื่น ๆ อีกมากที่สามารถใช้ในการทำนายได้จากหลากหลายสายงาน เช่น Data Scientist หรือ Economist ซึ่งสามารถให้ผลที่แม่นยำ และมี performance ในการคำนวณที่ดี เช่นกัน

![SEIR-equation.png](https://dev-to-uploads.s3.amazonaws.com/i/ph2rmqrwj41z3kaxov1v.png)
ตัวอย่างโมเดลโรคระบาดในมุมของระบาดวิทยา: สมการ differential equation ของ SEIR Model (simplified) 
([https://towardsdatascience.com/social-distancing-to-slow-the-coronavirus-768292f04296](https://towardsdatascience.com/social-distancing-to-slow-the-coronavirus-768292f04296))

ในบทความนี้ เพื่อให้เข้าใจถึงความซับซ้อนของปัญหา และปัจจัยต่าง ๆ ที่ต้องคำนึงถึง จึงลองทำเป็น project simulation เล็ก ๆ ง่าย ๆ ขึ้นมาเล่น ๆ ให้มองว่าเป็น project ฝึกฝีมือเขียนโปรแกรมแบบ OOP ขำ ๆ โดยมีเป้าหมายเพื่อศึกษาดูการแพร่กระจายของ virus สมมุติชนิดหนึ่ง ชื่อว่า DIVOC-91 ซึ่งแพร่ระบาดบนโลกสมมุติแห่งหนึ่ง แล้วดูว่าถ้าเราเป็นรัฐบาลหรือเจ้าหน้าที่จะตัดสินใจออกมาตรการรับมืออย่างไร แบบง่าย ๆ ก่อน แล้วจากนั้นจะค่อย ๆ เพิ่มความซับซ้อนของ simulation ขึ้นเรื่อย ๆ ใน part ต่อ ๆ ไป เพื่อให้ใกล้เคียงกับโลกความเป็นจริงมากขึ้นครับ

# **Scenario**
ใน part ที่ 1 นี้เพื่อความง่าย เราลองเริ่มจากสร้างโลกขึ้นมาแบบง่าย ๆ โดยการกำหนดเป็น rules ต่าง ๆ ออกมาดังนี้ครับ
- โลกนี้มีประชากร **7,000 คน**
- คนแต่ละคนจะมี 3 สถานะ คือ **`สุขภาพดี`, `ติดเชื้อ`, และ `เสียชีวิต`**
- ในแต่ละวัน คนที่ยังไม่เสียชีวิต (แน่นอน 555) แต่ละคนจะเดินทางไปพบเจอคนอื่นที่ยังไม่เสียชีวิต **แบบสุ่ม 10 คน**
- ถ้าคนที่ `ติดเชื้อ` และคนที่ `สุขภาพดี` พบกัน คนที่สุขภาพดีจะมีโอกาสติดเชื้อ **10%**
- ในแต่ละวัน คนที่ `ติดเชื้อ` จะมีโอกาสเสียชีวิต **0.01%** (ใจดีมาก)
- แต่ถ้าไม่เสียชีวิต ในแต่ละวัน ผู้ติดเชื้อคนดังกล่าว จะมีโอกาสหาย กลับมาเป็น `สุขภาพดี` **1%**
- โดยจะเริ่มจากให้มีผู้ติดเชื้อ 1 คน ในวันแรกนะครับ

ใน part นี้ให้เงื่อนไขเป็นแบบง่าย ๆ ตามนี้ก่อน ซึ่งอาจจะดูไม่ค่อยสมจริงบ้าง ใน part ต่อ ๆ ไปก็จะค่อย ๆ เพิ่มเงื่อนไขเข้าไปนะครับ

# **Get Started**
โค้ดของบทความนี้จะแชร์ไว้บน Google Colab ใน [link นี้](https://colab.research.google.com/drive/1MwCxN9pZUkCt4gNdfCWf0R5bbIa2KaGo) นะครับ เพื่อความสะดวก สามารถแก้โค้ดและรันบน browser ได้ทันที ไม่ต้อง download หรือ install อะไรลงบนเครื่อง ผู้อ่านสามารถรันโค้ดจริงไปพร้อมกับอ่านบทความนี้ได้เลยครับ

### **วิธีการรันโค้ดใน colab notebook**
1. ให้คลิกที่ File มุมซ้ายบน แล้วเลือก `Save a copy in drive...` ก่อนนะครับ
2. จากนั้นให้คลิกเลือก block ที่ต้องการจะรันแล้วกด `Ctrl+Enter` นะครับ

โดยในบทความจะหยิบเฉพาะโค้ดใน part ที่สำคัญ ๆ เช่น modelling บางส่วนมาอธิบายนะครับ และจะข้ามส่วนที่เป็นรายละเอียดเล็ก ๆ น้อย ๆ ไป เช่น function เสริมบางส่วน หรือการ plot graph แนะนำให้ลองดูโค้ดใน Colab ไปพร้อม ๆ กัน จะช่วยให้เข้าใจมากขึ้นครับ 

เริ่มกันเลยนะครับ
### **ใส่ค่าคงตัวต่าง ๆ**
จาก [rules](#scenario) ต่าง ๆ ที่เรากำหนดขึ้นมา อย่างแรกผมเอาแค่คงตัวต่าง ๆ ใส่เข้าไปในโปรแกรมก่อนครับ ได้แก่
- **จำนวนประชากร (N_POPULATION)**
- **จำนวนผู้ติดเชื้อเริ่มต้น (N_INFECTED_INIT)**
- **จำนวนคนที่ไปพบเจอในแต่ละวัน (N_MEETINGS)**
- **โอกาสติดเชื้อ (PROB_INFECT)**
- **โอกาสเสียชีวิต (PROB_DIE)**
- **โอกาสหาย (PROB_CURED)**

โดยจะเก็บเป็น `dict` และส่งเป็น parameter เข้าไปให้กับตัว simulator นะครับ เพื่อให้สะดวก เวลาทดลองแก้ค่าต่าง ๆ

```python
default_config = {
    'N_POPULATION': 7_000,
    'N_INFECTED_INIT': 1,

    'N_MEETINGS': 10,

    'PROB_INFECT': 0.1,
    'PROB_DIE': 0.0001,
    'PROB_CURED': 0.01,
}
```

### **สร้างตัว Simulator**
ต่อไปเราจะมาสร้างตัว Simulator กันนะครับ โดยตัว Simulator เนี่ย มีหน้าที่วนลูปเพื่ออัพเดตค่าต่าง ๆ ในแต่ละวัน และ monitor status ในแต่ละว่ามีคนสุขภาพดี ติดเชื้อ หรือเสียชีวิตกี่คนแล้ว นะครับ

อันนี้โค้ดในส่วนของการวนลูปเพื่ออัพเดตค่าต่าง ๆ ในแต่ละวันนะครับ จะใช้ method ชื่อ `run()` และรัน input เป็น จำนวนวันที่จะทำการคำนวณ
```python
class Simulator:
    ...
    def run(self, max_days):
        for self.days in range(1, max_days+1):
            random.shuffle(self.people)

            self.meet_friends()

            for person in self.people:
                person.update()

            self.monitor()
    ...
```
โดยในแต่ละรอบลูปของ method `run()` เนี่ย ก็จะทำการ shuffle list ของคนนะครับ เพื่อให้ลำดับของคนใน list แตกต่างกันออกไปในแต่ละวัน จากนั้น `self.meet_friends()` ก็จะทำการสุ่มคนออกมาและจับให้เจอกันนะครับ

แล้วก็เรียก `person.update()` เพื่ออัพเดตสถานะของคนนั้น เช่น อัพเดตสถานะจาก `ติดเชื้อ` เป็น `สุขภาพดี` หรือ `เสียชีวิต`

สุดท้ายก็ monitor ค่าต่าง ๆ ในวันนั้น ๆ และเก็บเอาไว้เพื่อไป plot graph ตอนจบนะครับ

อันนี้เป็น method `meet_friends()` ก็ไม่มีอะไรซับซ้อน แค่วนลูปคนแต่ละคน แล้ว sample คนออกมา เท่ากับ `N_MEETINGS` ก็คือ sample คนออกมา 10 คน แล้วก็ให้เจอกัน โดยเรียกคำสั่ง `person.meet_with(friend)`
```python
class Simulator:
    ...
    def meet_friends(self):
        for person in self.people:

            friends = random.sample(self.people, self.config['N_MEETINGS'])

            for friend in friends:
                person.meet_with(friend)
    ...
```

### **สร้างคน (Person)**
ต่อไปก็จะสร้าง class Person ขึ้นมา โดยสิ่งที่ Person ต้องทำก็จะมี 2 method ที่ต้องเขียน (1) คือ method `update()` คือใช้ในการ update สถานะว่าหลังจากติดเชื้อ จะให้ติดเชื้อต่อไป หรือหายดี หรือเสียชีวิต ตามความน่าจะเป็นที่เราได้นิยามเอาไว้ใน [scenario](#scenario) และ (2) คือ method `meet_with()` ใช้เป็นตัวแทนของการเจอกัน ของคนสองคนนะครับ โดยถ้าหากคนใดคนหนึ่งมีสถานะเป็น `ติดเชื้อ` อีกคนจะมีโอกาสติดเชื้อ เป็น `PROB_INFECT` ครับ

เริ่มจาก method `update()` มี logic เป็นอย่างนี้ครับ
1. ถ้าสถานะเป็น `เสียชีวิต` หรือ `สุขภาพดี`: ไม่ต้องทำอะไร
2. สุ่มเลขตั้งแต่ 0 ถึง 1 ถ้ามีค่าน้อยกว่า `PROB_DIE` (0.0001) จะเปลี่ยนสถานะเป็น `เสียชีวิต` ก็คือจะมีโอกาส 0.01% ที่จะเสียชีวิตนั้นเองครับ
3. แต่ถ้าไม่เสียชีวิต: ให้สุ่มเลขตั้งแต่ 0 ถึง 1 ถ้ามีค่าน้อยกว่า `PROB_CURED` (0.01) จะเปลี่ยนสถานะกลับเป็น `สุขภาพดี` ก็คือจะมีโอกาส 1% ที่จะหายเป็นปกติ ตามที่เรากำหนดเอาไว้ครับ

```python
class Person:
    ...
    def update(self):
        if self.is_died or not self.is_infected:
            return

        # random result whether this infected one will die!!!
        if get_binary_random(prob=self.config['PROB_DIE']):
            self.is_died = True

        # random result whether this infected one will be cured!!!
        elif get_binary_random(prob=self.config['PROB_CURED']):
            self.cured()
    ...
```
ในโค้ดที่ใช้สุ่มเลขผมสร้างเป็น function ชื่อ `get_binary_random()` มาใช้แทนนะครับ เพราะคิดว่ามันสื่อความหมายมากกว่า ซึ่งตัว function ถูกประกาศเอาไว้อยู่ด้านบนนะครับ ตรงส่วน [util](https://colab.research.google.com/drive/1MwCxN9pZUkCt4gNdfCWf0R5bbIa2KaGo) สามารถเลื่อนขึ้นไปดูได้ครับ

ต่อไป method `meet_with()` ครับ การทำงานก็คือ ถ้ามีคนใดคนหนึ่งติดเชื้อ ส่วนอีกคนไม่ติด ก็จะสามารถมีการเพร่เชื้อได้ครับ โดยมีโอกาสแพร่เชื้อเป็น 10%

ในส่วนของเงื่อนไขผมเขียนเป็น condition แบบนี้
```python
        if self.is_infected + other.is_infected == 1:
```
`self.is_infected` จะให้ค่าเป็น `True` หรือ `False` ครับ ซึ่งถ้าเอามาบวกกัน ใน Python `True` จะมีค่าเป็นเลข `1` และ `False` จะมีค่าเป็นเลข `0` ในโค้ดจึงใช้การบวกกันแล้วตั้งเงื่อนไขเป็นเมื่อผลบวกเป็น 1 ซึ่งหมายถึงเมื่อมีผู้ติดเชื้อเป็นคนใดคนหนึ่ง แค่หนึ่งคนนั่นเองครับ

ส่วนในการแพร่เชื้อ ก็ใช้วิธีการสุ่มเลขแบบเดิมครับ ก็คือถ้าค่าสุ่มน้อยกว่า 0.1 สุดท้ายทั้งสองคนก็จะมีสถานะเป็น `ติดเชื้อ` ครับ

ได้โค้ดเต็ม ๆ เป็นดังนี้
```python
class Person:
    ...
    def meet_with(self, other):
        # condition: one is healthy and the other is sick (XOR)
        if self.is_infected + other.is_infected == 1:

            # random result whether the healthy one will be infected
            if get_binary_random(prob=self.config['PROB_INFECT']):
                self.infect()
                other.infect()
    ...
```

เท่านี้ก็ได้โค้ดที่ model โครงสร้างของโลกสมมุติ และโรคสมมุติของเราเรียบร้อยแล้วครับ ต่อไปก็มาลอง run จริงกันเลย

# **ลอง Simulate**
เพื่อความสะดวก ผมสร้าง function สำหรับการรัน simulation ขึ้นมา โดยรับ input เป็น dict ของ configuration ที่ต้องการใช้ และจำนวนวันที่ให้รันนะครับ

โดยใน function มีการทำงานดังนี้ครับ
1. สร้าง Simulator ขึ้นมา
2. add คนเข้าไปใน Simulator โดยให้ คนจำนวน `N_INFECTED_INIT` คนแรก มีสถานะเป็นติดเชื้อ (ใน default config ของเราก็คือให้คนที่ 1 เป็นผู้ติดเชื้อนั้นเองครับ)
3. run simulation

```python
def simulate(config, max_days):
    simulator = Simulator(config)

    n_population = config['N_POPULATION']
    for i in range(n_population):
        person = Person(config)

        # ทำให้คน N คนแรกมีสถานะ `ติดเชื้อ`
        if i < config['N_INFECTED_INIT']:
            person.infect()

        simulator.add_person(person)

    simulator.run(max_days)

    return simulator
```

ทีนี้ก็เริ่มลองรันจริงดูเลยครับ โดยใช้ default config ที่เรากำหนดเอาไว้ตอนแรกสุดก่อน เป็นเวลา 30 วัน
```python
simulator = simulate(default_config, 30)
```

ก็ใช้เวลารันสักพักนะครับ จากนั้น result ของ simulation คือ status ของระบบในแต่ละวัน ซึ่งมาจาก function `monitor()` สามารถเรียกดูได้แบบนี้ครับ
```python
report = simulator.report
print(report)
```
ก็จะได้เป็น list ของ dict อันใหญ่ ๆ ออกมา ซึ่งเป็นจำนวนของผู้ที่มีสุขภาพดี จำนวนของผู้ติดเชื้อ และจำนวนผู้เสียชีวิตรวมทั้งหมด ของแต่ละวันนะครับ เพื่อให้ดูง่ายก็จะ plot ออกมาเป็น graph ได้แบบนี้ครับ
![result-default-config.png](https://dev-to-uploads.s3.amazonaws.com/i/yrvu5uwh0avelaq1y318.png)
ในส่วนของการ plot graph ตรงนี้ ผมใช้ module `pandas` และ `matplotlib` นะครับ ถ้าสนใจสามารถศึกษาดูเพิ่มเติมได้ครับ

จะเห็นว่าใน 30 วันแรก จำนวนผู้เสียชีวิตไม่ค่อยเพิ่มขึ้นมาเท่าไหร่ เพราะเรากำหนดให้ความน่าจะเป็นในการเสียชีวิตค่อนข้างต่ำครับ แต่เพียงแค่ประมาณ 6 วันแรก แทบจะทุกคนกลายเป็นผู้ติดเชื้อไปเกือบหมดแล้ว ถ้ากลับไปดูจากข้อมูลดิบ **จะเห็นว่าในวันที่ 7 จำนวนผู้ติดเชื้อกลายเป็น 6804 คน จาก 7,000 คน อย่างรวดเร็ว คิดเป็น 97% ภายใน 1 สัปดาห์** โชคดีนะครับที่ไวรัสตัวนี้อยู่แค่ในโลกสมมุติ 5555

**สรุปรวมยอดของ DIVOC-91 ใน 1 เดือนแรก เหลือคนสุขภาพดีอยู่ 63 คน เป็นผู้ติดเชื้ออยู่ 6913 คน และเสียชีวิตไปแล้ว 24 คนครับ**

# **ลองเป็นรัฐบาล แล้วแก้ปัญหาดูเองเลย!**
คำถามครับ สมมุติว่าเราเป็นรัฐบาลที่ฉลาดครับ รู้ล่วงหน้าตั้งแต่วันแรกละ ว่าในอีก 1 เดือนข้างหน้าจะเกิดอะไรขึ้น แล้วเรามีงบอยู่ก้อนหนึ่ง ถามว่าเราจะทำอย่างไร มี choice ให้ครับ:
**1. ลดการรวมกลุ่ม**
**2. ปรับปรุงการรักษา**
**3. แจกหน้ากากและเจลล้างมือ**

วิธีการเลือกเนี่ย เราก็ต้องวิเคราะห์ดูว่าแต่ละตัวเลือก จะส่งผลกับ parameter ตัวไหนในโมเดล ให้เปลี่ยนแปลงไปอย่างไรครับ

ทีนี้สมมุติมีทีมนักวิจัยเอาข้อมูลของแต่ละตัวเลือกมาให้เพิ่ม เป็นอย่างนี้ครับ
**1. ลดการรวมกลุ่ม** น่าจะส่งผลให้จำนวนของคนที่เจอในแต่ละวัน (**N_MEETINGS**) ลดลง จาก **10 คน เป็น 6 คน**

**2. ปรับปรุงการรักษา** จะช่วยให้ผู้ติดเชื้อเนี่ยเข้าถึงการรักษาได้ง่ายขึ้น และช่วยสนับสนุนเครื่องมือแพทย์ต่าง ๆ จะทำให้โอกาสการหายติดเชื้อ (**PROB_CURED**) เพิ่มขึ้น จาก **1% เป็น 10%**

**3. แจกหน้ากากและเจลล้างมือ** แจกหน้ากากเนี่ยก็จะทำให้เวลาเจอกันมีโอกาสการติดเชื้อต่ำลง และทำความสะอาดด้วยเจลล้างมือก็จะป้องกันไวรัสจากการสัมผัสได้อีก จะทำให้ **PROB_INFECT** ลดลง จาก **10% เป็น 3%** เท่านั้น

ถ้าได้ตัวเลขประมาณแบบนี้ก็สบายแล้วใช่ไหมครับ เราก็สามารถใช้โมเดลที่เรามีมา simulate ดูเอาได้เลย ว่าเมื่อทำแต่ละ choice อีก 30 วัน จะเกิดอะไรขึ้น

ผมสร้าง function ชื่อ `try_new_config()` ขึ้นมา เพื่อให้สามารถแก้ config และรันได้ง่าย ๆ นะครับ โค้ดข้างในก็คือเอาโค้ดที่เรา simulate และ plot มาต่อกันเฉย ๆ ครับ ไม่มีอะไร

### **1. ลดการรวมกลุ่ม**
**N_MEETINGS: 10 -> 6**
![result-custom-4-2.png](https://dev-to-uploads.s3.amazonaws.com/i/0qz1d9hcils8ovdvs2e8.png)
จะเห็นว่าการลดการรวมกลุ่มช่วยชะลอการแพร่เชื้อได้เล็กน้อยครับ สังเกตุได้จากจุดตัดของจำนวนคนสุขภาพดี (สีฟ้า) และจำนวนผู้ติดเชื้อ (สีเหลือง) จะอยู่ที่ประมาณวันที่ 8 ในขณะที่กราฟเดิมของเราจะอยู่ที่ประมาณวันที่ 4 แต่เมื่อผ่านไป 30 วัน จำนวนผู้ป่วยก็ไม่ต่างกันมาก ส่วนจำนวนผู้เสียชีวิตลดลงมาเป็น 19 คน จาก 24 คนครับ

### **2. ปรับปรุงการรักษา**
**PROB_CURED: 0.01 -> 0.1**
![result-custom-4-1.png](https://dev-to-uploads.s3.amazonaws.com/i/pixmhkufl25kdb70475o.png)
ที่น่าสนใจคือจุดพีคของเส้นจำนวนผู้ติดเชื้อ (สีเหลือง) ต่ำกว่ากราฟเดิม ประมาณ 700 คน เนื่องจากผู้ป่วยฟื้นตัวกลับมาสุขภาพดีได้เร็วมากขึ้นนั่นเองครับ

### **3. แจกหน้ากากและเจลล้างมือ**
**PROB_INFECT: 0.1 -> 0.03**
![result-custom-3.png](https://dev-to-uploads.s3.amazonaws.com/i/p9c4b4xzdn6duerddmuq.png)
ผลกระทบที่ดูจากกราฟนี้จะ **คล้ายกับมาตรการลดการรวมกลุ่ม** คือเป็นการชะลอการแพร่เชื้อออกไป แต่ไกลกว่า ทำให้จำนวนผู้เสียชีวิตต่ำกว่ามาก คือแค่ 9 คน จากเดิม 24 คนครับ ถ้ามองหาการแก้ปัญหาเฉพาะหน้าสำหรับ 1 เดือน วิธีนี้ก็อาจจะไม่เลว

ผลลัพธ์และข้อสรุปที่ได้อาจจะแปลก ๆ ไปสักหน่อย **เพราะตัวเลขพวกนี้ผมมั่วขึ้นมาเองทั้งหมดครับ 5555 ทำให้ไม่สามารถนำไปอ้างอิงในโลกความเป็นจริงได้** แต่สำหรับในโลกสมมุตินี้ ถ้าเราเป็นรัฐบาลและตัดสินใจโดยใช้โมเดลและข้อมูลการวิจัย จะเห็นว่าเราสามารถเลือกตัดสินใจได้อย่างมีเหตุมีผล และสามารถรู้หรือทำนายล่วงหน้าได้ว่าทำอะไรไปจะเกิดผลกระทบแบบไหน ก็จะสามารถวางแผนเตรียมการต่อไปได้อย่างมีประสิทธิภาพครับ

ส่วนจะเลือก choice ไหนนั้น ให้ผู้อ่านตัดสินใจเองได้เลยครับ ว่าจะเลือกจากจำนวนผู้เสียชีวิตในระยะสั้น หรือการรักษาในระยะยาว หรือแม้แต่ choice อื่น เช่นเลือกทั้งการรักษาและแจกหน้ากากเป็นต้น ก็สามารถลองเล่นดูได้ใน [colab notebook](https://colab.research.google.com/drive/1MwCxN9pZUkCt4gNdfCWf0R5bbIa2KaGo) ได้เลยครับ

# **Summary**
ใน part นี้เราก็ได้สร้าง model แบบง่าย ๆ เพื่อ simulate การแพร่กระจายของโรคระบาดไปแล้วนะครับ ซึ่งหลาย ๆ ท่านก็จะเห็นว่าตัว model เอง มีความไม่สมเหตุสมผลอีกมาก เช่น
- _**ในแต่ละวัน model ใช้การสุ่มให้คนคนหนึ่งเจอใครก็ได้**_ แต่ในความเป็นจริงแล้วเราอาจจะไม่ได้มีโอกาสเจอทุกคนบนโลก อาจจะเจอได้เฉพาะคนที่อยู่ในบริเวณใกล้เคียงหรือทำงานที่เดียวกันเท่านั้น **นี่อาจจะเป็นสาเหตุให้ DIVOC-91 แพร่กระจายอย่างรวดเร็วเกินจริงครับ**
- _**ปกติเราอาจจะไม่ได้ออกจากบ้านและเจอคนถึง 10 คนทุกวัน**_ บางวันเราอาจจะแค่ไปจ่ายตลาดแล้วกลับมาบ้านก็ได้
- model นี้เรายังไม่ได้รวมการแพร่กระจายที่อาจจะเกิดขึ้นได้ _**จากคนที่อาศัยอยู่ในบ้านเดียวกัน**_

และอื่น ๆ อีกมาก ซึ่งใน part ต่อ ๆ ไป เราก็จะ implement model ให้ซับซ้อนยิ่งขึ้น เพื่อแก้ไขประเด็นดังกล่าวกันนะครับ

สุดท้ายนี้ ย้ำอีกสักเล็กน้อยว่าอยากให้มอง project นี้เป็น OOP project แบบขำ ๆ นะครับ ผลลพธ์จาก model ที่เราลองรันเล่นกันในนี้ไม่สามารถเอาไปสรุปหรือแย้งการตัดสินใจของเจ้าหน้าที่จริงที่มีความรู้เฉพาะทางและข้อมูลที่แม่นยำได้นะครับ

**note: ในการวิเคราะห์โดยทั่วไป เพื่อให้คำนวณได้อย่างมีประสิทธิภาพ ปกติก็จะต้อง formulate ออกมาเป็นโมเดลคณิตศาสตร์ และ derive ออกมาเป็นสมการ จะสามารถคำนวณผลลัพธ์ ณ จุดเวลาใด ๆ ได้เร็วกว่า แต่ใน project นี้ตั้งใจจะเขียนเป็น OOP project ครับ และใน part สุดท้ายก็คิดว่าจะ visualize ออกมาภาพเคลื่อนไหวสั้น ๆ อันหนึ่ง ให้เห็นเป็นตัวคนวิ่งไปวิ่งมาจริง ๆ ก็น่าจะสนุกดีครับ**

และถ้ามีเรื่องไหนที่สนใจเพิ่มเติมสามารถ comment เอาไว้ได้นะครับ

FB Page: [Copy Paste Engineer](https://www.facebook.com/CopyPasteEng)

<center>**- ขอบคุณที่อ่านครับ -**</center>