You are on page 1of 28

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH

TRƯỜNG ĐẠI HỌC BÁCH KHOA


KHOA KHOA HỌC & KỸ THUẬT MÁY TÍNH

Báo cáo Bài tập lớn


Petri Net
Mô Hình Hóa Toán Học (CO2011)

GVHD: Nguyễn An Khương


Nguyễn Tiến Thịnh

SV thực hiện: Nguyễn Đặng Anh Khoa 2010339


Võ Thái Toàn 2010709
Trần Chí Công 2010170
Lê Hoàng Ngọc Phát 2010502
Hoàng Kim Cương 2010968

Tp. Hồ Chí Minh, Tháng 11/2021


Trường Đại Học Bách Khoa Tp.Hồ Chí Minh
Khoa Khoa Học & Kỹ Thuật Máy Tính

CONTENTS

1 THEORY 3
1.1 Cơ sở lý thuyết . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

2 REVIEW & PROBLEM 5


Problem 5.1 Explain the following terms for Petri nets, and provide a specific example for
each term . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Problem 5.2 Consider the Petri net system in figure below . . . . . . . . . . . . . . . . . . . 7
1. Formalize this net as a quadruplet (P, T, F, M0 ) . . . . . . . . . . . . . . . . . . . . . 7
2. Give the preset and the postset of each transition . . . . . . . . . . . . . . . . . . . . 7
3. Which transitions are enabled at M0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
4. Give all reachable markings. What are the reachable terminal markings? . . . . . . . 8
5. Is there a reachable marking in which we have a nondeterministic choice? . . . . . . . 8
6. Does the number of reachable markings increase or decrease if we remove . . . . . . . 8
Problem 5.3 Consider a marked Petri net with N = (P, T, F ) with |P|= 4 = n the 4 start
places each initially get 3 tokens, and the exit node is specially designated as place OUT.
Besides, assume |T| = 4, and the initial marking is M0 . Denote TS for the whole transition
system made by the Petri net N = {P, T, F } . . . . . . . . . . . . . . . . . . . . . . . . . 9
1. Write down M0 , P, T of N . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2. If not allow concurrency in this process (marked Petri net) then how many states of
the transition system TS can be created? How many transitions are there? . . . . 9

3 ASSIGNMENT 10
Question 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
a. Write down states and transitions of the Petri net . . . . . . . . . . . . . . . . . . . . 10
b. Represent it as a transition system assuming that . . . . . . . . . . . . . . . . . . . . 10
i. Each place cannot contain more than one token in any marking . . . . . . . . . 10
ii. Each place may contain any natural number of tokens in any marking . . . . . 10
Question 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
a. Explain the possible meaning of a token in state inside of the net NP a . . . . . . . . . 11
b. Construct the Petri net NP a , assuming that there are five patients in state wait, no
patient in state inside, and one patient is in state done . . . . . . . . . . . . . . . . 12
Question 3 Determine the superimposed (merged) Petri net model N = Ns ⊕ NP a allow-
ing a specialist treating patients, assuming there are four patients are waiting to see the
specialist/doctor, one patient is in state done, and the doctor is in state free. . . . . . . . 12
Question 4 Consider an initial marking M0 = [3.wait, free, done] in the grand net N =
Ns ⊕ NP a . Which markings are reachable from M0 by firing one transition once? Why? . 14
Question 5 Is the superimposed Petri net N deadlock free? Explain properly. . . . . . . . . . 15
Question 6 Propose a similar Petri net with two specialists already for treating patients, with
explicitly explained construction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Question 7 Write a computational package to realize (implement) Items 1,2,3 and 4 above. . 17

Báo cáo Bài tập lớn Mô hình hóa toán học (CO2011) - Niên khóa 2021-2022 Trang 1/27
Trường Đại Học Bách Khoa Tp.Hồ Chí Minh
Khoa Khoa Học & Kỹ Thuật Máy Tính

7.1. Specialists Petri net (source file: quest1.cpp) . . . . . . . . . . . . . . . . . . . . . . 19


7.2. Patients Petri net (source file: quest2.cpp) . . . . . . . . . . . . . . . . . . . . . . . 21
7.3. Superimposed Petri net (source file: quest3.cpp) . . . . . . . . . . . . . . . . . . . . 22
7.4. Reachable Marking of Superimposed Petri net (source file: quest4.cpp) . . . . . . . 24

4 REFERENCES 27
4.1 Các nguồn đã tham khảo trong quá trình làm BTL: . . . . . . . . . . . . . . . . . . . . . 27

Báo cáo Bài tập lớn Mô hình hóa toán học (CO2011) - Niên khóa 2021-2022 Trang 2/27
Trường Đại Học Bách Khoa Tp.Hồ Chí Minh
Khoa Khoa Học & Kỹ Thuật Máy Tính

CHAPTER 1
THEORY

1.1 Cơ sở lý thuyết
Định nghĩa về Petri Net, transition và place:

• Petri net: là một đồ thị phân đôi có hướng được kí hiệu là N = (P, T, F ) với P là số hữu hạn các
place của đồ thị, T là số transitions, và F là số đường đi có trong đồ thị F ⊆ (T × P ) ∪ (P × T ).
• Transition: (T) là những active nodes của Petri net bởi nó có thể thay đổi được marking nhờ phép
fire.

• Place: (P) là những passive nodes của Petri net bởi vì nó không thể tự thay đổi marking như
transition, place có thể chứa các token nhưng transition thì không thể.
Preset và Postset
• Cho một mạng petri N=(P,T,F), xét tất cả những phần tử thuộc P ∪ T .

• Một node x là node input của node y khi và chỉ khi có một cạnh có hướng từ x đên y thường kí
hiệu là (x, y) ∈ F với F là tập các cạnh. Trong khi đó, node x là node output của node y kí hiệu là
(y, x) ∈ F .
• Với x ∈ P ∪ T , ta có:
• preset: ·x = {y|(y, x) ∈ F }

• postset x· = {y|(x, y) ∈ F }
Khái niệm và quy tắc merge Petri Net:
• Đầu tiên xét 2 mạng Petri với N1 = (P1 , T1 , F1 , M0 ) và N2 = (P2 , T2 , F2 , M0 ) với cùng initial
marking M0 .

• ⊕ : T1 x T2 −→ T trong đó T = T1 ∪ T2 , được định nghĩa như sau:


– Nếu ·t1 = ·t2 thì (t1 , t2 ) 7→ ⊕(t1 , t2 ) = t ∈ T với ·t = ·t1
– Nếu ·t1 ̸= ·t2 thì (t1 , t2 ) 7→ ⊕(t1 , t2 ) = {t1 , t2 } ⊆ T
• Merge Petri Net N = N1 ⊕ N2 = (P1 ∪ P2 , T, F1 ∪ F2 , M0 )

Firing rule:
– Điều kiện cần: để một transition được fire nó phải được enable.
– Khi fire thì nó sẽ lấy ở mỗi đầu vào hay mỗi cạnh hướng vào một token và xuất ra một token
ở mỗi cạnh hướng ra khỏi transition đó.

Báo cáo Bài tập lớn Mô hình hóa toán học (CO2011) - Niên khóa 2021-2022 Trang 3/27
Trường Đại Học Bách Khoa Tp.Hồ Chí Minh
Khoa Khoa Học & Kỹ Thuật Máy Tính

– Biểu thức: (N,M)[t〉 thể hiện transition t được enable tại marking M.
⇒ (N,M)[t〉(N,M1 ): quá trình firing ở transition t được bắt đầu ở marking M và kết thúc tại
M1 .
Enabled Transition: Để có thể được enable thì mọi cạnh hướng vào transition phải có token và
có bao nhiêu cạnh hướng vào thì tại mỗi nơi xuất phát của cạnh đó đều phải có token (hoặc tại
mỗi input place đều phải có token).

Transition System: là hệ thống được biểu diễn dưới dạng TS = {S,A,T} với S là tập các trạng
thái (states), A là tập những hoạt động (activity) và T ⊆ S × A × S là tập các bước chuyển
(transitions).
– S start ⊆ S là set thuộc những states đầu tiền (hay còn được gọi là ‘start’ states), và S end ⊂ S
là set thuộc state cuối cùng (đôi khi còn gọi là ‘accept’ states).
– Tại sao chúng ta lại sử dụng transition systems ? Bởi đây là một phương án để mô hình hóa
trong việc chọn ra những công việc theo một thứ tự và thực thi theo thứ tự đó. Các công việc
thường được thực thi một cách tuần tự, có thể được lựa chọn xảy ra hoặc có thể xảy ra cùng
lúc, và hoàn toàn có thể xảy ra hiện tượng tái thực thi những hoạt động đã được thực thi.
– Những đặc tính của transition system: thường được nghiên cứu nhờ vào cấu trúc cũng như sự
linh động của nó. Một transition system bắt đầu từ initial state, và mọi điểm đến của nó đều
có thể dẫn đến thực thi những hoạt động kéo theo
– Một đường đi (path) được gọi là hoàn thành nếu nó kết thúc tại một trong những final states.
– Một path được gọi là deadlocks khi nó bị mắc kẹt tại những non-final state (là trạng thái
không phải là trạng thái kết thúc và từ đó không tồn tại transition nào để đi đến những trạng
thái khác)

Báo cáo Bài tập lớn Mô hình hóa toán học (CO2011) - Niên khóa 2021-2022 Trang 4/27
Trường Đại Học Bách Khoa Tp.Hồ Chí Minh
Khoa Khoa Học & Kỹ Thuật Máy Tính

CHAPTER 2
REVIEW & PROBLEM

Problem 5.1 Explain the following terms for Petri nets, and pro-
vide a specific example for each term
− Enabled transition: một transitions được enable khi nó có chứa ít nhất một token ở mỗi input
places

Ví dụ 1:

Xét transition enter: có token ở input places wait và free nên enter là một enabled transition (token
là những chấm đen trong đồ thị trên)
− Firing of a transition : đây là một behaviour của Petri net, điều kiện cần để fire một transition
là nó phải được enable. Ta có thể hiểu một cách nôm na đây là một phép dịch chuyển những chấm
đen trên đồ thị theo một quy luật. Sau khi đã firing xong, thì các token được xếp vào những place
mới , và điều đó dẫn đến sự đa dạng của mạng lưới petri net
Ví dụ 2:

Báo cáo Bài tập lớn Mô hình hóa toán học (CO2011) - Niên khóa 2021-2022 Trang 5/27
Trường Đại Học Bách Khoa Tp.Hồ Chí Minh
Khoa Khoa Học & Kỹ Thuật Máy Tính

Ở ví dụ 2: là hình ảnh transition enter đã được fire khi so sánh với ví dụ 1


− Reachable marking : một marking M có thể reachable từ một initial marking M0 khi và chỉ khi
nó tồn tại một chuỗi enable transition khi thực hiện phép firing từ M0 tới M.
7→ Ký hiệu của một set reachable marking (N,M0 ) là [N,M0 〉.
Ví dụ 3:

Có tất cả 10 reachable marking trong đồ thị trên


− Terminal marking : khi những transitions firing cho đến khi chạm tới ngưỡng mà nó không còn
có thể enable ở bất cứ transition nào nữa, thì marking ở thời điểm đó được gọi là terminal marking
Ví dụ 4:

− Nondeterministic choice : là trường hợp mà khi nhiều transition cùng enable tại cùng một thời
điểm , do đó ta không biết chắc được transition nào sẽ fire nhưng chỉ biết được một trong số đó sẽ
được fire.

Ví dụ 5:

Báo cáo Bài tập lớn Mô hình hóa toán học (CO2011) - Niên khóa 2021-2022 Trang 6/27
Trường Đại Học Bách Khoa Tp.Hồ Chí Minh
Khoa Khoa Học & Kỹ Thuật Máy Tính

Tại thời điểm như ở đồ thị trên t1 và t3 đều có thể enable và có khả năng fire cùng nhau

Problem 5.2 Consider the Petri net system in figure below

1. Formalize this net as a quadruplet (P, T, F, M0 )


P : p1, p2, p3, p4
T : t1, t2, t3
F : {(p1, t1), (t1, p2), (p2, t2), (t2, p3), (t2, p4), (p4, t1), (p4, t3), (t3, p4), (p3, t3)}
M0 : (p1, p2, p3, p4) = (1, 0, 1, 2)

2. Give the preset and the postset of each transition


Transition t1

– preset: p1, p4
– postset: p2
Transition t2
– preset: p2
– postset: p3, p4
Transition t3
– preset: p3, p4
– postset: p4

3. Which transitions are enabled at M0


− t1: do ở p1 và p4 đều có token
− t3: do ở p3 và p4 có token

Báo cáo Bài tập lớn Mô hình hóa toán học (CO2011) - Niên khóa 2021-2022 Trang 7/27
Trường Đại Học Bách Khoa Tp.Hồ Chí Minh
Khoa Khoa Học & Kỹ Thuật Máy Tính

4. Give all reachable markings. What are the reachable terminal markings?
− Có tất cả 7 reachable marking (bao gồm cả marking khởi động ban đầu):
[1, 0, 2, 1], [0, 1, 1, 1], [0, 0, 2, 2], [0, 0, 2, 1], [0, 0, 2, 1], [0, 0, 2, 0], [0, 1, 1, 0], [1, 0, 2, 0]
− Terminal markings: [0, 0, 2, 0]

5. Is there a reachable marking in which we have a nondeterministic choice?


− Ta có marking mà ở đó có nondeterministic choice, ví dụ như ở initial marking [p1, p3, p42 ], chúng
ta không thể xác định được t1 hay t3 sẽ được fire trong khi ở marking [p2, p3, p4] thì không xác
định được t2 hay t3 sẽ fire.

6. Does the number of reachable markings increase or decrease if we remove


• Place p1 and its adjacent arcs

− Ta có: [p3, p42 ], [p2, p3, p4], [p32 , p42 ].[p42 ], [p2, p4].
Nếu ta bỏ đi place p1 và các cạnh kề của nó, thì số lượng reachable markings sẽ tăng lên, bởi vì
transition t1 sẽ dễ dàng được enabled và fired hơn so với khi tồn tại place p1, do đó sẽ có nhiều
reachable markings có thể có hơn.

• place p3 and its adjacent arcs

Ta có: [p2, p4], [p42 ]

Báo cáo Bài tập lớn Mô hình hóa toán học (CO2011) - Niên khóa 2021-2022 Trang 8/27
Trường Đại Học Bách Khoa Tp.Hồ Chí Minh
Khoa Khoa Học & Kỹ Thuật Máy Tính

− Ngược lại, khi ta bỏ đi place p3 và các cạnh kề của nó thì số lượng reachable markings sẽ giảm
xuống, do t1 chỉ có thể fired một lần duy nhất (vì chỉ có 1 token ở place p1 ở initial marking, khi
fire thì t1 sẽ tiêu thụ token duy nhất ở đó) và dù t3 có thể được fired nhiều lần (t3 lúc này khi đã
bỏ đi place p3 sẽ dễ dàng enabled và fired hơn so với lúc đầu), thế nhưng các marking sau khi thực
thi là trùng nhau. Do đó, số lượng reachable markings là ít hơn so với ban đầu

Problem 5.3 Consider a marked Petri net with N = (P, T, F )


with |P|= 4 = n the 4 start places each initially get
3 tokens, and the exit node is specially designated
as place OUT. Besides, assume |T| = 4, and the ini-
tial marking is M0 . Denote TS for the whole tran-
sition system made by the Petri net N = {P, T, F }

1. Write down M0 , P, T of N
Petri net N = (P, T, F ) cho phép sự đồng thời (concurrency), ta có M0 , P, T của Petri net N như sau:
• P = {a, b, c, d, OUT} là tập hợp các places.

• T = {t1, t2, t3, t4} là tập các transitions.


• M0 = [a3 , b3 , c3 , d3 ] là marking ở trạng thái ban đầu (initial marking).

2. If not allow concurrency in this process (marked Petri net) then how many
states of the transition system TS can be created? How many transitions
are there?
Nếu không cho phép concurrency trong petri net trên, marking của 1 trạng thái bất kì sẽ có dạng
sau:
[a, b, c, d, out]

Với:
+ a, b, c, d là số token trong Place a, b, c, d, có giá trị tướng ứng trong khoảng [0, 3].
+ out là số token tại Place out có giá trị phụ thuộc vào sự thay đổi về token của a, b, c, d.
− Do out phụ thuộc vào a, b, c, d, nên số cách chọn nó là 1.
− Mỗi a, b, c, d có 4 cách chọn cho mỗi place ứng với [0, 3] nên sẽ có 44 cách chọn [a, b, c, d].

→ Vậy sẽ có 256 reachable marking tương ứng 256 states của transition system.

Báo cáo Bài tập lớn Mô hình hóa toán học (CO2011) - Niên khóa 2021-2022 Trang 9/27
Trường Đại Học Bách Khoa Tp.Hồ Chí Minh
Khoa Khoa Học & Kỹ Thuật Máy Tính

CHAPTER 3
ASSIGNMENT

Question 1
a. Write down states and transitions of the Petri net
− NS = (P, T, F ) là Petri Net mô hình hóa trạng thái của chuyên gia.
− Các trạng thái (state) của Petri Net NS : P = {f ree, busy, docu}.
− Các transitions của Petri Net NS : T = {start, change, end}

b. Represent it as a transition system assuming that


i. Each place cannot contain more than one token in any marking
− Giả sử initial marking M0 = [free] = [1,0,0].
− Ở M0 , start enable → firing start, giả sử có: (N,M0 ) [start〉 (N,M1 ) ⇒ M1 = [busy] = [0,1,0].
− Ở M1 , change enable → firing change, giả sử có: (N,M1 ) [change〉 (N,M2 ) ⇒ M2 = [docu] = [0,0,1].
− Ở M2 , end enabled → firing end, giả sử có: (N,M2 ) [change〉 (N, M3 ) ⇒ M3 = [1,0,0] = M0 .
→ Transition System tương đương với Petri Net trên có ba state tương ứng với 3 marking ta tìm
được. Ta ký hiệu 3 state là: s0 , s1 , s2 . Giả sử s1 tương ứng với initial marking M0 là start state:
s0 =S start ={M0 }. Ta có tập TR = { (s0 ,start,s1 ), (s1 ,change,s2 ), (s2 ,end,s0 ) }

ii. Each place may contain any natural number of tokens in any marking
Ta giả sử initial M0 = [free] = [n,0,0] (với n là số tự nhiên, nghĩa là ở M0 , place free chứa một số
lượng token bất kì)
Các loại marking có thể thu được khi firing:
◦ Có 2 place không chứa token, 1 place chứa n token:
[n,0,0]: chỉ có transition start là enabled ⇒ firing start, ta thu được marking [n-1,1,0]

Báo cáo Bài tập lớn Mô hình hóa toán học (CO2011) - Niên khóa 2021-2022 Trang 10/27
Trường Đại Học Bách Khoa Tp.Hồ Chí Minh
Khoa Khoa Học & Kỹ Thuật Máy Tính

[0,n,0]: chỉ có transition change là enabled ⇒ firing change, ta thu được marking [0,n-1,1]
[0,0,n]: chỉ có transition end là enabled ⇒ firing end, ta thu được marking [1,0,n-1]
◦ Có 1 place không chứa token, 2 place còn lại đều chứa token, tổng token trong 2 place là n:
[0,a,b]: transition change, end là enabled ⇒ firing change, ta thu được marking [0,a-1,b+1]
⇒ firing end, ta thu được marking [1,a,b-1]
[a,0,b]: transition start, end là enabled ⇒ firing start, ta thu được marking [a-1,1,b] ⇒
firing end, ta thu được marking [a+1,0,b-1]
[a,b,0]: transition start, change là enabled ⇒ firing start, ta thu được marking [a-1,b+1,0]
⇒ firing change, ta thu được marking [a,b-1,1]
◦ Cả 3 place đều chứa token, tổng token trong 3 place là n. [a,b,c]: cả 3 transition start, change,
end đều enabled:
⇒ firing start, ta thu được marking [a-1,b+1,c]
⇒ firing change, ta thu được marking [a,b-1,c+1]
⇒ firing end, ta thu được marking [a+1,b,c-1]
Bổ đề: Transition System tương đương chứa các state tương ứng với tất cả các marking [a,b,c] với
2
a + b + c = n (n ≥ 3 và a,b,c là các số nguyên dương) ⇒ Hệ quả: số state của TS là Cn−1

Chứng minh cho bổ đề : Ta dùng bài toán chia kẹo Euler để chứng minh bổ đề trên. Ta trải n phần
tử thành một hàng ngang. Tiếp theo, ta dùng 2 vách ngăn đặt vào n-1 khe giữa các phần tử để chia
2
nó thành n phần. Như vậy, mỗi phần sẽ có một số lượng phần tử nhất định. Có Cn−1 cách chọn
2
nên số state của TS tương đương với loại marking này là Cn−1 .

Xác định tập TR: tập TR gồm tất cả các bộ ba (Si , transition, Sj ) với Si , Sj lần lượt tương ứng
Mi , Mj mà (N, Mi ) [transition〉 (N, Mi ) theo các trường hợp firing ở trên. Số phần tử của tập TR:
– Mi là loại 1: 3
– Mi là loại 2: 3 × 2 × (n − 1)
2
– Mi là loại 3: 3 × Cn−1

Xây dựng Petri net cụ thể với n=2 (ký hiệu các state là [x,y,z] để dễ hình dung về các marking của
petri net tương ứng )

Question 2
a. Explain the possible meaning of a token in state inside of the net NP a
Ý nghĩa của token trong trạng thái (state) inside trong mạng Petri NP a có thể là phòng khám
bệnh, mỗi token trong NP a sẽ đại diện cho một bệnh nhân đang trong giai đoạn được chuyên gia
điều trị.

Báo cáo Bài tập lớn Mô hình hóa toán học (CO2011) - Niên khóa 2021-2022 Trang 11/27
Trường Đại Học Bách Khoa Tp.Hồ Chí Minh
Khoa Khoa Học & Kỹ Thuật Máy Tính

Ví dụ: giả sử ở trạng thái “inside” chúng ta đang có 5 tokens, điều đó có ý nghĩa là ở thời điểm đó
có 5 bệnh nhân đang trong giai đoạn được chuyên gia điều trị.

b. Construct the Petri net NP a , assuming that there are five patients in state
wait, no patient in state inside, and one patient is in state done
Mạng Petri NP a = (PP a , TP a , FP a ) được xây dựng với mục đích mô hình hóa trạng thái của các
bệnh nhân. Trong đó:
– PP a = {wait, inside, done}, là tập hợp các places.
– TP a = {start, change}, là tập hợp các transitions.
– FP a = {(wait,start), (start,inside), (inside,change), (change, done)}, là tập các flow relations
(là các mũi tên có hướng).
Mạng Petri NP a trên (giả sử có 5 bệnh nhân ở trạng thái chờ (wait), không có bệnh nhân nào đang
được điều trị (inside), và có 1 bệnh nhân đã được điều trị xong (done)) được xây dựng như sau:

Question 3 Determine the superimposed (merged) Petri net model


N = Ns ⊕ NP a allowing a specialist treating patients,
assuming there are four patients are waiting to see
the specialist/doctor, one patient is in state done,
and the doctor is in state free.
• NS

• NP a

• N = NS ⊕ NP a

Báo cáo Bài tập lớn Mô hình hóa toán học (CO2011) - Niên khóa 2021-2022 Trang 12/27
Trường Đại Học Bách Khoa Tp.Hồ Chí Minh
Khoa Khoa Học & Kỹ Thuật Máy Tính

• Kí hiệu:
– NS = (PS , TS , FS , M0S )
– NP a = (PP a , TP a , FP a , M0P a )
– N = NS ⊕ NP a = (P, T, F, M0 )
• Xác định P: Tập places PNs của Ns và tập places PNP a của NP a disjoint ⇒ P = PNs ∪ PNP a =
{free, busy, docu, wait, inside, done}
• Xác định T:

– TNs = {start, change, end}


– TNP a = {start, change}
– Ta có: TNs × TNP a → T với T = TNs ∪ TNP a
∗ preset của start in Ns = {free} và preset của start in NP a = {wait} ⇒ preset of start in
N = {free, wait}
∗ preset của change in Ns = {busy} và preset của start in NP a = {inside} ⇒ preset of
change in N = {busy, inside}
∗ preset của end in Ns = {docu} và trong NP a không có transition là end ⇒ preset of change
in N = {docu}
⇒ T = {start, change, end}
– Xác định F: F = FNs ∪ FNP a
∗ FNs = {(free, start), (start, busy), (busy, change), (change, docu), (docu, end), (end, free)}
∗ FNP a = { (wait, start), (start, inside), (inside, change), (change, done) }
⇒ F = FN s ∪ FNP a = { (free, start), (start, busy), (busy, change), (change, docu), (docu,
end), (end, free), (wait, start), (start, inside), (inside, change), (change, done) }
– Điều kiện initial marking của N: Để từ initial marking M0 có thể firing chuyển sang marking
khác thì ở M0 , transition start phải enabled ⇒ ở place wait và free, mỗi place chứa ít nhất 1
token, nghĩa là có ít nhất một bệnh nhân đang đợi và một chuyên gia đang rảnh.

Báo cáo Bài tập lớn Mô hình hóa toán học (CO2011) - Niên khóa 2021-2022 Trang 13/27
Trường Đại Học Bách Khoa Tp.Hồ Chí Minh
Khoa Khoa Học & Kỹ Thuật Máy Tính

Question 4 Consider an initial marking M0 = [3.wait, free, done]


in the grand net N = Ns ⊕ NP a . Which markings
are reachable from M0 by firing one transition once?
Why?

• Firing start
– preset của start = {free, wait}
– postset của start = {busy, inside}
Ta thấy free có 1 token, wait có 3 token ⇒ start enabled. Khi firing, 1 token trong mỗi input
được tiêu thụ và 1 token được đưa vào trong mỗi output của transitions.
⇒ Sau khi firing start ⇒ free không còn token, wait còn 2 token, busy có 1 token và inside có 1
token, done vẫn giữ nguyên 1 token. Giả sử (N, M0 ) [start〉 (N, M1 ) thì M1 = [2.wait, busy,
inside, done]

• Firing change:
– preset của change = {busy, inside}
– postset của change = {docu, done}
⇒ Ta thấy busy và inside ở marking M0 đều không chứa token nào ⇒ change không enabled
nên không thể firing để chuyển sang trạng thái marking khác.

Báo cáo Bài tập lớn Mô hình hóa toán học (CO2011) - Niên khóa 2021-2022 Trang 14/27
Trường Đại Học Bách Khoa Tp.Hồ Chí Minh
Khoa Khoa Học & Kỹ Thuật Máy Tính

• Firing end:

– preset của end = {docu}


– postset của end = {free}
⇒ Ta thấy docu ở marking M0 không chứa token nào ⇒ end không enabled nên không thể
firing để chuyển sang trạng thái marking khác.

Question 5 Is the superimposed Petri net N deadlock free? Ex-


plain properly.
∗ ∗ ∗ Marking prototype: [wait, f ree, busy, inside, docu, done]
Petri Net N = NS ⊕ NP a không phải là một mô hình deadlock free. Lấy ví dụ cho mô hình trên
với marking [0, 1, 0, 0, 0, 4].

Trong marking trên, không có trạng thái nào là một enabled transition. Đây là một phản ví dụ cho
câu hỏi này, hay mở rộng hơn là mô hình này không deadlock free khi mà chuyên gia đã khám xong
cho tất cả các bệnh nhân.

Question 6 Propose a similar Petri net with two specialists al-


ready for treating patients, with explicitly explained
construction
− Khi mô hình cần 2 specialists, ta đơn giản chỉ cần thêm 1 token vào Petri net Ns :

− Khi đó ta có Petri net N = Ns ⊕ NP a :

Báo cáo Bài tập lớn Mô hình hóa toán học (CO2011) - Niên khóa 2021-2022 Trang 15/27
Trường Đại Học Bách Khoa Tp.Hồ Chí Minh
Khoa Khoa Học & Kỹ Thuật Máy Tính

− Nhưng giả sử trường hợp đây là hai chuyên gia có chuyên môn không giống nhau và bệnh nhân đến
khám những bệnh cũng không giống nhau. Petri net phía trên chỉ ứng với trường hợp cả hai chuyên
gia luôn luôn có thể chữa mọi loại bệnh cho các bệnh nhân của mình, điều này không thường xuyên
đúng với thực tế. Khi đó ta sẽ vận dụng tới một khái niệm mới gọi là Colored Petri Net (CPN).
− Ta tiến hành gán cho các chuyên gia danh sách các bệnh mà họ có thể chữa theo chuyên môn của
họ và gán cho các bệnh nhân căn bệnh mà họ cần chữa.
− Giả sử ta có 2 chuyên gia: một chuyên gia chuyên trị các bệnh về tai mũi họng, người còn lại chuyên
trị các bệnh về răng hàm mặt, các bệnh thuộc chuyên môn của họ sẽ được gán lần lượt vào list 1
và list 2. Và ta có 4 bệnh nhân đang chờ điều trị các căn bệnh: viêm tai, sâu răng, viêm xoang,
viêm họng.
− Dựa vào những giả thuyết trên ta thành lập được CPN sau:

− Giải thích đôi chút về CPN phía trên: tại transition mới được thêm vào là control, transition này
sẽ đóng vai trò điều khiển, cụ thể nếu căn bệnh của một bệnh nhân bất kỳ ứng với chuyên môn của
chuyên gia đó (khi căn bệnh nằm trong danh sách các bệnh chuyên gia có thể chữa được), ta mới

Báo cáo Bài tập lớn Mô hình hóa toán học (CO2011) - Niên khóa 2021-2022 Trang 16/27
Trường Đại Học Bách Khoa Tp.Hồ Chí Minh
Khoa Khoa Học & Kỹ Thuật Máy Tính

tiến hành quá trình chữa bệnh nếu không thì quay lại trạng thái chờ đợi ban đầu. Place A được
thêm vào đóng vai trò như một vị trí chuyển tiếp trung gian.

− Ta cũng có thể đơn giản rút gọn CPN phía trên bằng một CPN với các tokens có “color" thực sự:

Question 7 Write a computational package to realize (imple-


ment) Items 1,2,3 and 4 above.
Ngôn ngữ sử dụng: C++

Nhằm thuận tiện cho việc triển khai Petri net của các bài 1, 2, 3, 4, ta tạo một file header khai báo
các đối tượng sẽ được sử dụng (source file: petri.h và petri.cpp).
• class Pos đại diện các node Place gồm thông số name là tên của place và tokens là số tokens tại
đó:
1 class Pos {
2 public:
3 string name;
4 int tokens;
5

6 Pos (const string& name, const int& tokens) : name(name), tokens(tokens) {}


7 };
• class Trans đại diện cho các node Transition gồm name là tên của Transition, tập hợp các place
đầu vào input và đầu ra output, với phương thức firing() nhằm fire transition đó và phương
thức revertEnergy() nhằm phục vụ cho việc fire:
1 class Trans {
2 public:
3 string name;
4 vector<Pos*> input;
5 vector<Pos*> output;
6

7 Trans (const string& name, const vector<Pos*>& in, const vector<Pos*>&


,→ out) : name(name), input(in), output(out) {}
8 bool enabledTrans() {
9 for (auto x : input)
10 if (!x->tokens)

Báo cáo Bài tập lớn Mô hình hóa toán học (CO2011) - Niên khóa 2021-2022 Trang 17/27
Trường Đại Học Bách Khoa Tp.Hồ Chí Minh
Khoa Khoa Học & Kỹ Thuật Máy Tính

11 return false;
12

13 return true;
14 }
15 int firing() {
16 if (enabledTrans()) {
17 for (auto x : input) {
18 x->tokens--;
19 }
20 for (auto x : output) {
21 x->tokens++;
22 }
23 return 1;
24 }
25 else
26 return 0;
27 }
28 void revertEnergy() {
29 for (auto x : input) {
30 x->tokens++;
31 }
32 for (auto x : output) {
33 x->tokens--;
34 }
35 }
36 };

• class PetriNet đại diện cho toàn cục một Petri net với places là tập hợp các Place, trans là
tập hợp các Transition, dictionaryOfPlaces là một map để xác định được vị trí của places trong
vector bằng tên của place, và các phương thức phục vụ bài 1, 2, 3 ,4:
1 class PetriNet {
2 public:
3 vector<Pos*> places;
4 vector<Trans*> trans;
5 map<string, int> dictionaryOfPlace;
6

7 ~PetriNet() {
8 for (auto x : places) delete x;
9 for (auto x : trans) delete x;
10 places.erase(places.begin(), places.end());
11 trans.erase(trans.begin(), trans.end());
12 }
13

14 string marking() const;


15 vector<vector<Pos*>> converttoPos(const vector<vector<string>>& raw);
16 void addPlace(Pos* place);
17 void addTrans(Trans* transition);
18 void printSequence(const vector<string>& sequence);
19 void BacktrackRec(vector<string>& reachableMarkings, vector<string>& sequence);
20 void solveBacktracking();
21 void firetilDone();
22 };

Báo cáo Bài tập lớn Mô hình hóa toán học (CO2011) - Niên khóa 2021-2022 Trang 18/27
Trường Đại Học Bách Khoa Tp.Hồ Chí Minh
Khoa Khoa Học & Kỹ Thuật Máy Tính

7.1. Specialists Petri net (source file: quest1.cpp)

− Đầu tiên ta nhập số tokens của các place f ree, busy, docu:.
1 int doc, busy, docu;
2 do {
3 cout << "Number Of Free Specialists (place free): ";
4 cin >> doc;
5 } while (doc < 0);
6 do {
7 cout << "Number Of Working Specialists (place busy): ";
8 cin >> busy;
9 } while (busy < 0);
10 do {
11 cout << "Number Of Specialists That Are Working On Data (place docu): ";
12 cin >> docu;
13 } while (docu < 0);
14

− Ta khởi tạo Petri net và thêm các places với transition vào Petri net, chương trình sau sẽ in ra các
reachable markings có thể của Petri net Ns :

1 PetriNet* net = new PetriNet();


2 // Mapping places
3 vector<string> nameOfPlaces {"free", "busy", "docu"};
4 vector<int> tokens { doc, busy, docu};
5 map<string, int> dictionaryOfPlace;
6

7 for (int i = 0; i < (int) tokens.size(); i++) {


8 net->addPlace(new Pos(nameOfPlaces[i], tokens[i]));
9 }
10

11 // Mapping Transition
12 vector<string> nameOfTrans {"start", "change", "end"};
13 vector<vector<string>> rawInp {
14 {"free"},
15 {"busy"},
16 {"docu"}
17 };
18 vector<vector<string>> rawOut {
19 {"busy"},
20 {"docu"},
21 {"free"}
22 };

Báo cáo Bài tập lớn Mô hình hóa toán học (CO2011) - Niên khóa 2021-2022 Trang 19/27
Trường Đại Học Bách Khoa Tp.Hồ Chí Minh
Khoa Khoa Học & Kỹ Thuật Máy Tính

23 vector<vector<Pos*>> inppos = net->converttoPos(rawInp);


24 vector<vector<Pos*>> outpos = net->converttoPos(rawOut);
25 map<string, int> dictionaryOfTrans;
26

27 for (int i = 0; i < (int) nameOfTrans.size(); i++) {


28 dictionaryOfTrans.insert(pair<string, int>(nameOfTrans[i], i));
29 net->addTrans(new Trans(nameOfTrans[i], inppos[i], outpos[i]));
30 }
31 net->solveBacktracking();
32

33 delete net;
34

35 return 0;

− Ta kiểm thử chương trình trên với testcase sau:


✓ Input:
Number Of Free Specialists (place free): 2
Number Of Working Specialists (place busy): 1
Number Of Specialists That Are Working On Data (place docu): 0

✓ Output:
Init: [2 1 0]

Sequence: [start]
Marking: [1 2 0]

Sequence: [start, start]


Marking: [0 3 0]

Sequence: [start, start, change]


Marking: [0 2 1]

Sequence: [start, start, change, change]


Marking: [0 1 2]

Sequence: [start, start, change, change, change]


Marking: [0 0 3]

Sequence: [start, start, change, change, change, end]


Marking: [1 0 2]

Sequence: [start, start, change, change, change, end, end]


Marking: [2 0 1]

Sequence: [start, start, change, change, change, end, end, start]


Marking: [1 1 1]

Sequence: [start, start, change, change, change, end, end, end]


Marking: [3 0 0]

There are 10 reachable markings in total!

Báo cáo Bài tập lớn Mô hình hóa toán học (CO2011) - Niên khóa 2021-2022 Trang 20/27
Trường Đại Học Bách Khoa Tp.Hồ Chí Minh
Khoa Khoa Học & Kỹ Thuật Máy Tính

7.2. Patients Petri net (source file: quest2.cpp)

− Đầu tiên ta nhập số tokens của các place wait, inside, done với ràng buộc số tokens tại place
wait ⩽ 10:

1 int pat, insi, done;


2 do {
3 cout << "Number Of Waiting Patients (place wait): ";
4 cin >> pat;
5 } while (pat < 0 or pat > 10);
6 do {
7 cout << "Number Of Patients Being Examined (place inside): ";
8 cin >> insi;
9 } while (insi < 0);
10 do {
11 cout << "Number Of Patients That Are On ICU Beds (place done): ";
12 cin >> done;
13 } while (done < 0);

− Ta khởi tạo Petri net và thêm các places với transition vào Petri net, chương trình sau sẽ in ra các
trạng thái marking sau khi lần lượt fire các transition của Petri net NP a :

1 PetriNet* net = new PetriNet();


2 // Mapping places
3 vector<string> nameOfPlaces {"wait", "inside", "done"};
4 vector<int> tokens { pat, insi, done};
5 map<string, int> dictionaryOfPlace;
6

7 for (int i = 0; i < (int) tokens.size(); i++) {


8 net->addPlace(new Pos(nameOfPlaces[i], tokens[i]));
9 }
10

11 // Mapping Transition
12 vector<string> nameOfTrans {"start", "change"};
13 vector<vector<string>> rawInp {
14 {"wait"},
15 {"inside"}
16 };
17 vector<vector<string>> rawOut {
18 {"inside"},
19 {"done"}
20 };
21 vector<vector<Pos*>> inppos = net->converttoPos(rawInp);
22 vector<vector<Pos*>> outpos = net->converttoPos(rawOut);
23 map<string, int> dictionaryOfTrans;
24

25 for (int i = 0; i < (int) nameOfTrans.size(); i++) {


26 dictionaryOfTrans.insert(pair<string, int>(nameOfTrans[i], i));
27 net->addTrans(new Trans(nameOfTrans[i], inppos[i], outpos[i]));
28 }
29 net->firetilDone();
30

Báo cáo Bài tập lớn Mô hình hóa toán học (CO2011) - Niên khóa 2021-2022 Trang 21/27
Trường Đại Học Bách Khoa Tp.Hồ Chí Minh
Khoa Khoa Học & Kỹ Thuật Máy Tính

31 delete net;
32

33 return 0;

− Ta kiểm thử chương trình trên với testcase sau:

✓ Input:
Number Of Waiting Patients (place wait): 5
Number Of Patients Being Examined (place inside): 0
Number Of Patients That Are On ICU Beds (place done): 1

✓ Output:
Initializing the Petri net with marking: [5 0 1]
start fired!! =>[4 1 1]
start fired!! =>[3 2 1]
start fired!! =>[2 3 1]
start fired!! =>[1 4 1]
start fired!! =>[0 5 1]
change fired!! =>[0 4 2]
change fired!! =>[0 3 3]
change fired!! =>[0 2 4]
change fired!! =>[0 1 5]
change fired!! =>[0 0 6]
All patients are now being treated on ICU beds!!

7.3. Superimposed Petri net (source file: quest3.cpp)

− Đầu tiên ta nhập số tokens của các place wait, f ree, inside, busy, docu, done với ràng buộc số tokens
tại place wait ⩽ 10:

1 int pat, doc, busy, insi, docu, done;


2 do {
3 cout << "Number Of Waiting Patients (place wait): ";
4 cin >> pat;
5 } while (pat < 0 or pat > 10);
6 do {

Báo cáo Bài tập lớn Mô hình hóa toán học (CO2011) - Niên khóa 2021-2022 Trang 22/27
Trường Đại Học Bách Khoa Tp.Hồ Chí Minh
Khoa Khoa Học & Kỹ Thuật Máy Tính

7 cout << "Number Of Free Specialists (place free): ";


8 cin >> doc;
9 } while (doc < 0);
10 do {
11 cout << "Number Of Working Specialists (place busy): ";
12 cin >> busy;
13 } while (busy < 0);
14 do {
15 cout << "Number Of Patients Being Examined (place inside): ";
16 cin >> insi;
17 } while (insi < 0);
18 do {
19 cout << "Number Of Specialists That Are Working On Data (place docu): ";
20 cin >> docu;
21 } while (docu < 0);
22 do {
23 cout << "Number Of Patients That Are On ICU Beds (place done): ";
24 cin >> done;
25 } while (done < 0);

− Ta khởi tạo Petri net và thêm các places với transition vào Petri net, chương trình sau sẽ in ra các
trạng thái marking sau khi lần lượt fire các transition của Petri net N :

1 PetriNet* net = new PetriNet();


2 // Mapping places
3 vector<string> nameOfPlaces {"wait", "free", "busy", "inside", "docu", "done"};
4 vector<int> tokens { pat, doc, busy, insi, docu, done};
5 map<string, int> dictionaryOfPlace;
6

7 for (int i = 0; i < (int) tokens.size(); i++) {


8 net->addPlace(new Pos(nameOfPlaces[i], tokens[i]));
9 }
10

11 // Mapping Transition
12 vector<string> nameOfTrans {"start", "change", "end"};
13 vector<vector<string>> rawInp {
14 {"wait", "free"},
15 {"busy", "inside"},
16 {"docu"}
17 };
18 vector<vector<string>> rawOut {
19 {"busy", "inside"},
20 {"docu", "done"},
21 {"free"}
22 };
23 vector<vector<Pos*>> inppos = net->converttoPos(rawInp);
24 vector<vector<Pos*>> outpos = net->converttoPos(rawOut);
25 map<string, int> dictionaryOfTrans;
26

27 for (int i = 0; i < (int) nameOfTrans.size(); i++) {


28 dictionaryOfTrans.insert(make_pair(nameOfTrans[i], i));
29 net->addTrans(new Trans(nameOfTrans[i], inppos[i], outpos[i]));
30 }
31 net->firetilDone();
32

33 delete net;
34

Báo cáo Bài tập lớn Mô hình hóa toán học (CO2011) - Niên khóa 2021-2022 Trang 23/27
Trường Đại Học Bách Khoa Tp.Hồ Chí Minh
Khoa Khoa Học & Kỹ Thuật Máy Tính

35 return 0;

− Ta kiểm thử chương trình trên với testcase sau:


✓ Input:
Number Of Waiting Patients (place wait): 4
Number Of Free Specialists (place free): 1
Number Of Working Specialists (place busy): 0
Number Of Patients Being Examined (place inside): 0
Number Of Specialists That Are Working On Data (place docu): 0
Number Of Patients That Are On ICU Beds (place done): 1

✓ Output:
Initializing the Petri net with marking: [4 1 0 0 0 1]
start fired!! =>[3 0 1 1 0 1]
change fired!! =>[3 0 0 0 1 2]
end fired!! =>[3 1 0 0 0 2]
start fired!! =>[2 0 1 1 0 2]
change fired!! =>[2 0 0 0 1 3]
end fired!! =>[2 1 0 0 0 3]
start fired!! =>[1 0 1 1 0 3]
change fired!! =>[1 0 0 0 1 4]
end fired!! =>[1 1 0 0 0 4]
start fired!! =>[0 0 1 1 0 4]
change fired!! =>[0 0 0 0 1 5]
end fired!! =>[0 1 0 0 0 5]
All patients are now being treated on ICU beds!!

7.4. Reachable Marking of Superimposed Petri net (source file: quest4.cpp)


− Đầu tiên ta nhập số tokens của các place wait, f ree, inside, busy, docu, done với ràng buộc số tokens
tại place wait ⩽ 10:
1 int pat, doc, busy, insi, docu, done;
2 do {
3 cout << "Number Of Waiting Patients (place wait): ";
4 cin >> pat;
5 } while (pat < 0 or pat > 10);
6 do {
7 cout << "Number Of Free Specialists (place free): ";
8 cin >> doc;
9 } while (doc < 0);
10 do {
11 cout << "Number Of Working Specialists (place busy): ";
12 cin >> busy;
13 } while (busy < 0);
14 do {
15 cout << "Number Of Patients Being Examined (place inside): ";
16 cin >> insi;
17 } while (insi < 0);
18 do {
19 cout << "Number Of Specialists That Are Working On Data (place docu): ";
20 cin >> docu;
21 } while (docu < 0);
22 do {
23 cout << "Number Of Patients That Are On ICU Beds (place done): ";

Báo cáo Bài tập lớn Mô hình hóa toán học (CO2011) - Niên khóa 2021-2022 Trang 24/27
Trường Đại Học Bách Khoa Tp.Hồ Chí Minh
Khoa Khoa Học & Kỹ Thuật Máy Tính

24 cin >> done;


25 } while (done < 0);

− Ta khởi tạo Petri net và thêm các places với transition vào Petri net, chương trình sau sẽ in ra các
trạng thái marking sau khi lần lượt fire các transition của Petri net N :
1 PetriNet* net = new PetriNet();
2 // Mapping places
3 vector<string> nameOfPlaces {"wait", "free", "busy", "inside", "docu",
,→ "done"};
4 vector<int> tokens { pat, doc, busy, insi, docu,
,→ done};
5 map<string, int> dictionaryOfPlace;
6

7 for (int i = 0; i < (int) tokens.size(); i++) {


8 net->addPlace(new Pos(nameOfPlaces[i], tokens[i]));
9 }
10

11 // Mapping Transition
12 vector<string> nameOfTrans {"start", "change", "end"};
13 vector<vector<string>> rawInp {
14 {"wait", "free"},
15 {"busy", "inside"},
16 {"docu"}
17 };
18 vector<vector<string>> rawOut {
19 {"busy", "inside"},
20 {"docu", "done"},
21 {"free"}
22 };
23 vector<vector<Pos*>> inppos = net->converttoPos(rawInp);
24 vector<vector<Pos*>> outpos = net->converttoPos(rawOut);
25 map<string, int> dictionaryOfTrans;
26

27 for (int i = 0; i < (int) nameOfTrans.size(); i++) {


28 dictionaryOfTrans.insert(make_pair(nameOfTrans[i], i));
29 net->addTrans(new Trans(nameOfTrans[i], inppos[i], outpos[i]));
30 }
31

32 net->solveBacktracking();
33

34 delete net;
35

36 return 0;

− Ta kiểm thử chương trình trên với testcase sau:


✓ Input:
Number Of Waiting Patients (place wait): 3
Number Of Free Specialists (place free): 1
Number Of Working Specialists (place busy): 0
Number Of Patients Being Examined (place inside): 0
Number Of Specialists That Are Working On Data (place docu): 0
Number Of Patients That Are On ICU Beds (place done): 1

✓ Output:
Init: [3 1 0 0 0 1]

Báo cáo Bài tập lớn Mô hình hóa toán học (CO2011) - Niên khóa 2021-2022 Trang 25/27
Trường Đại Học Bách Khoa Tp.Hồ Chí Minh
Khoa Khoa Học & Kỹ Thuật Máy Tính

Sequence: [start]
Marking: [2 0 1 1 0 1]

Sequence: [start, change]


Marking: [2 0 0 0 1 2]

Sequence: [start, change, end]


Marking: [2 1 0 0 0 2]

Sequence: [start, change, end, start]


Marking: [1 0 1 1 0 2]

Sequence: [start, change, end, start, change]


Marking: [1 0 0 0 1 3]

Sequence: [start, change, end, start, change, end]


Marking: [1 1 0 0 0 3]

Sequence: [start, change, end, start, change, end, start]


Marking: [0 0 1 1 0 3]

Sequence: [start, change, end, start, change, end, start, change]


Marking: [0 0 0 0 1 4]

Sequence: [start, change, end, start, change, end, start, change, end]
Marking: [0 1 0 0 0 4]

There are 10 reachable markings in total!

Báo cáo Bài tập lớn Mô hình hóa toán học (CO2011) - Niên khóa 2021-2022 Trang 26/27
Trường Đại Học Bách Khoa Tp.Hồ Chí Minh
Khoa Khoa Học & Kỹ Thuật Máy Tính

CHAPTER 4
REFERENCES

4.1 Các nguồn đã tham khảo trong quá trình làm BTL:
1. Man VM. Nguyen, MATHEMATICAL MODELING And RISK ANALYSIS.

2. Giovanni Casu, G. Michele Pinna, “Merging relations: a way to compact Petri nets’ behaviors
uniformly”, Springer, https://core.ac.uk/download/pdf/80194288.pdf, truy cập ngày 20/11/2021.
3. Kurt Jense, “A brief introduction to coloured Petri net”, Springer,
https://link.springer.com/content/pdf/10.1007%252FBFb0035389.pdf, truy cập ngày 20/11/2021.

Báo cáo Bài tập lớn Mô hình hóa toán học (CO2011) - Niên khóa 2021-2022 Trang 27/27

You might also like