Tải bản đầy đủ (.docx) (24 trang)

Tiểu luận môn Thuật Toán và Phương Pháp Giải Quyết Vấn Đề XÂY DỰNG THUẬT TOÁN KIỂM TRA SỰ ĐẲNG CẤU CHO HAI ĐỒ THỊ VÔ HƯỚNG ĐƠN GIẢN

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (328.64 KB, 24 trang )

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
Tiểu luận:
XÂY DỰNG THUẬT TOÁN KIỂM TRA SỰ ĐẲNG CẤU CHO HAI
ĐỒ THỊ VÔ HƯỚNG ĐƠN GIẢN

HVTH: Võ Thành Nhân
MSHV: CH1301103
GVPT: PGS.TS. Đỗ Văn Nhơn
Thành phố Hồ Chí Minh 10 – 2014.
ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
Tiểu luận môn học: Thuật toán & PP giải quyết vấn đề
Tiểu luận:
XÂY DỰNG THUẬT TOÁN KIỂM TRA SỰ ĐẲNG CẤU
CHO HAI ĐỒ THỊ VÔ HƯỚNG ĐƠN GIẢN

HVTH: Võ Thành Nhân
MSHV: CH1301103
GVPT: PGS.TS. Đỗ Văn Nhơn
Thành phố Hồ Chí Minh 10 – 2014.
Mục lục
2
Tiểu luận môn học: Thuật toán & PP giải quyết vấn đề
3
Tiểu luận môn học: Thuật toán & PP giải quyết vấn đề
1. Mở đầu
1.1 Tại sao phải nghiên cứu bài toán này
Bài toán đẳng cấu đồ thị nhận được sự quan tâm đáng kể của các nhà nghiên cứu vì
đó là bài toán cơ sở có rất nhiều ứng dụng trong khoa học-kỹ thuật cũng như trong thực tế.
Tuy nhiên, cho đến nay vẫn chưa xác định được nó thuộc lớp P hay NP-Complete. Các


thuật toán kiểm tra sự đẳng cấu của hai đồ thị tốt nhất hiện nay vẫn có độ phức tạp cho
trường hợp xấu nhất là hàm mũ. Như vậy có thể xác định rằng đây là một bài toán NP-
Hard đóng vai trò cơ sở cho nhiều bài toán khác trong khoa học, thực tiễn. Vì vậy việc
nghiên cứu, tìm hiểu bài toán này rất cần thiết cho người làm tin học(cả lý thuyết lẫn thực
hành).
1.2 Vài ứng dụng của bài toán đẳng cấu đồ thị
• Trong hóa học, các hợp chất khác nhau có thể có cùng công thức phân tử nhưng có
cấu trúc khác nhau. Người ta mô hình hóa một hợp chất hóa học bằng đồ thị. Như
vậy hai hợp chất giống nhau thì đồ thị tương ứng của chúng sẽ đẳng cấu với nhau.
Bằng cách này có thể kiểm tra một hợp chất là mới hay không.
• Trong khoa học máy tính, đẳng cấu đồ thị được dùng để tối ưu hóa các tính toán
trong trình biên dịch, phân tích cấu trúc mạng xã hội, nhận dạng người dùng dựa
trên hành vi trên một website…
• Trong công nghệ phần mềm, bằng cách mô hình hóa các design pattern đã biết
thành những đồ thị. Sau đó, source code của chương trình phần mềm cũng được mô
hình thành đồ thị. Lúc này có thể tìm xem trong đồ thị của chương trình có đồ thị
con nào đẳng cấu với một trong những đồ thị của các design pattern hay không để
tìm ra design pattern mà phần mềm đã sử dụng.
• Trong công nghiệp điện tử, đẳng cấu đồ thị được dùng để thiết kế các mạch điện tử
tự động hóa nhằm làm đơn giản và tối ưu hóa các mạch điện tử.
4
Tiểu luận môn học: Thuật toán & PP giải quyết vấn đề
1.3 Mục tiêu của tiểu luận
Tiểu luận sẽ tập trung vào các công việc sau:
• trình bày khái niệm về vấn đề và quy trình xây dựng giải pháp cho một vấn
đề theo tiếp cận thuật toán.
• trình bày một số định nghĩa, định lý cùng các chứng minh của lý thuyết đồ thị
cần thiết cho bài toán đẳng cấu đồ thị làm cơ sở cho việc thành lập các thuật
toán kiểm tra sự đẳng cấu.
• xây dựng giải pháp kiểm tra sự đẳng cấu cho hai đồ thị vô hướng, đơn giản.

2. Vấn đề và quy trình giải quyết vấn đề theo tiếp cận thuật toán
2.1 Khái niệm vấn đề
Vấn đề(bài toán) là đề cập đến một nhu cầu cần được giải quyết dựa trên cơ sở gồm
các dữ liệu, thông tin, tri thức được cho trước. Một vấn đề thường có 2 đặc điểm sau đây:
• nhu cầu cần giải quyết thường không đơn giản.
• để giải quyết vấn đề thường phải nghiên cứu, phân tích các dữ kiện cho
trước, thực hiện một số suy luận, tính toán hoặc chứng minh các sự kiện, kết
quả ,luật…
Ví dụ một số vấn đề bài toán:
• bài toán xét sự đẳng cấu của 2 đồ thị
• bài toán sắp thời khóa biểu cho một trường đại học
• bài toán tìm chu trình Hamilton ngắn nhất trên đồ thị có trọng số.

2.2 Xác định vấn đề
Để xác định một vấn đề(bài toán) ta cần phải xác định các yếu tố sau đây:
• cơ sở dữ liệu, thông tin, tri thức
• giả thiết (kí hiệu: A)
• mục tiêu, yêu cầu (kí hiệu: B)
• những điều kiện ràng buộc liên quan (nếu có)
5
Tiểu luận môn học: Thuật toán & PP giải quyết vấn đề
Tổng quát thì một vấn đề(bài toán) thường được kí hiệu: A → B(nghĩa là tìm hay
xác định B từ A). Có đôi lúc A và B đều không rõ ràng, chẳng hạn như trong vấn đề chẩn
đoán và chữa bệnh, dự báo thời tiết…
2.3 Quy trình xây dựng giải pháp
Ở đây ta xét giải pháp cho vấn đề theo tiếp cận thuật toán nghĩa là giải pháp được diễn
đạt dưới dạng thủ tục thỏa mãn 3 tính chất: xác định, hữu hạn và đúng. Quy trình gồm các
bước sau đây:
• Xác định và mô hình hóa vấn đề: vấn đề được xác định rõ ràng, chính xác,
mang tính hình thức cao bằng cách dùng các mô hình toán học, các sơ đồ

được quy ước rõ ràng về mặt ý nghĩa hoặc các ngôn ngữ đặc tả.
• Xây dựng thuật toán (thuật giải): đầu tiên là hình thành ý tưởng(có thể mô tả
bằng ngôn ngữ tự nhiên). Sau đó chuyển ý tưởng thành thuật toán, thuật giải
và cho ví dụ minh họa cách hoạt động của thuật toán.
• Chứng minh tính đúng đắn: về nguyên tắc là phải chứng minh tính đúng của
thuật toán bằng các công cụ toán học như logic toán và các cấu trúc đại số.
Tuy nhiên, trong trường hợp các chứng minh là khó khăn, phức tạp thì phải
lý giải và thuyết minh căn cứ trên các yếu tố trực quan, trực giác.
• Phân tích thuật toán (xét tính hiệu quả): đánh giá hiệu quả của thuật toán,
xem thuật toán thuộc lớp phức tạp nào. Tốt nhất là xác định chính xác độ
phức tạp của thuật toán(xác định big-theta: Θ) hoặc chỉ ra chận trên hợp
lý(xác định big-O: O).
• Cải tiến, nâng cao hiệu quả của thuật toán: bước này là tùy chọn sau khi đánh
giá thuật toán, nếu độ phức tạp của thuật toán quá lớn hoặc cảm thấy có thể
cải tiến thuật toán tốt hơn được nữa thì tiến hành cải tiến, nâng cao hiệu quả
thuật toán.
• Cài đặt ứng dụng và thử nghiệm: bước cuối cùng là tiến hành cài đặt thuật
toán, chọn mẫu dữ liệu để chạy. Nếu như ta đã không chứng minh tính đúng
của thuật toán bằng lý thuyết thì ở bước này ta phải chọn mẫu dữ liệu sao cho
bao phủ tất cả trường hợp, cho chạy thuật toán với các mẫu này và tiến hành
tính toán một vài tham số thống kê quan trọng như kì vọng, phương sai…
6
Tiểu luận môn học: Thuật toán & PP giải quyết vấn đề
3. Vài khái niệm cần thiết về lý thuyết đồ thị
Định nghĩa 1.
Một đồ thị vô hướng là một bộ G = (V, E) với:
• tập V ≠ Ø, hữu hạn gọi là tập đỉnh
• E gọi là tập cạnh là một đa tập hợp với các phần tử là các bộ không có thứ tự dạng
(v
i

, v
j
) với v
i
, v
j
∈ V
Nếu tập E là một đơn tập hợp và ∀ (v
i
, v
j
) ∈ E: v
i
≠ v
j
thì G gọi là đồ thị vô hướng
đơn giản. Trong phạm vi tiểu luận này ta chỉ xét các đồ thị vô hướng đơn giản.
Định nghĩa 2.
Cho đồ thị G = (V, E) và e = (v
i
, v
j
) ∈ E. Ta nói rằng cạnh a kề với hai đỉnh v
i
, v
j
và hai
đỉnh v
i
, v

j
là kề nhau.
Định nghĩa 3.
Cho đồ thị vô hướng, đơn giản G = (V, E), ∀ u ∈ V, đặt A(u) = { v ∈ V| (u, v) ∈ E } thì
bậc của đỉnh u kí hiệu là d(u) và d(u) = |A(u)|
Định nghĩa 4.
Cho 2 đồ thị vô hướng G = (V, E) và G’ = (V’, E’). Ta nói rằng G và G’ đẳng cấu và kí
hiệu G ≅ G’ nếu tồn tại một song ánh f: V → V’ sao cho
∀ (v
i
, v
j
) ∈ E ⇔ (f(v
i
), f(v
j
)) ∈ E’
Nhận Xét 1.
Từ định nghĩa trên đây ta thấy rằng nếu G và G’ đẳng cấu với nhau thì chúng có một số
tính chất sau đây được suy ra từ định nghĩa:
• phép đẳng cấu bảo toàn quan hệ kề(đỉnh kề đỉnh, cạnh kề cạnh, đỉnh kề cạnh)
• G và G’ có cùng số đỉnh
• G và G’có cùng số cạnh
• G và G’có cùng số đỉnh với bậc cho trước
7
Tiểu luận môn học: Thuật toán & PP giải quyết vấn đề
• số đỉnh kề với đỉnh v ∈ V và f(v) ∈ V’ là như nhau
Mệnh đề 1.
Cho G = (V, E) là đồ thị vô hướng, đơn giản, n = |V|.
Ta có V = , với I

k
= { v ∈ V | d(v) = k}.
Chứng minh: hiển nhiên là { ⊆ V và I
k
∩ I
l
= Ø với k ≠ l , ta sẽ chứng minh V ⊆ {. Do
G là đồ thị vô hướng, đơn giản nên ∀ v ∈ V: 0 ≤ d(v) ≤ n – 1. Đặt k = d(v), ta có v ∈ I
k
⟹ V ⊆ {. Vậy V = .
Định nghĩa 5.
Cho G = (V, E) là đồ thị vô hướng, đơn giản và n = |V|. I
k
= { v ∈ V | d(v) = k}, 0 ≤ k ≤ n–
1. Đồ thị con sinh ra bởi I
k
được định nghĩa như sau: G
k
= (I
k
, E
k
), E
k
= {(u, v) ∈ E | u, v ∈
I
k
}.
Mệnh đề 2.
Cho G = (V, E) và G = (V’, E’) là hai đồ thị vô hướng, đơn giản đẳng cấu với nhau qua

song ánh f: V → V’ và G
k
= (I
k
, E
k
) và G’
k =
(I’
k
, E’
k
) là hai đồ thị con sinh bởi I
k
⊆ V, I’
k
⊆ V’, 0 ≤ k ≤ n – 1(n = |V|) thì G
k
cũng đẳng cấu với G’
k
qua song ánh f
k
: I
k
→ I’
k
f
k
(v)
= f(v).

Chứng minh: xét v
ki
≠ v
kj
∈ I
k
ta có f
k
(v
ki
) = f(v
ki
), f
k
(v
kj
) = f(v
kj
) mà f là song ánh ⟹
f
k
(v
ki
) ≠ f
k
(v
kj
) ⟹ f
k
là đơn ánh, mặt khác |I

k
| = |I’
k
| do G ≅ G’ ⟹ f
k
là song ánh (1). Ta
lại có ∀ (v
ki
, v
kj
) ∈ E
k
⇔ (f(v
ki
), f(v
kj
)) ∈ E’ ⇔ (f
k
(v
ki
), f
k
(v
kj
)) ∈ E’ ⇔ (f
k
(v
ki
), f
k

(v
kj
)) ∈ E’
k
(2). Từ (1) và (2) ⟹ G
k
và G’
k
đẳng cấu qua song ánh f
k
.
Nhận xét 2.
Từ mệnh đề 2 ta suy ra rằng:
• nếu G ≅ G’ qua song ánh f thì f(V) = {f(v) | v ∈ V} = với G
k
≅ G’
k
qua f
k
• nếu G
k
và G’
k
không đẳng cấu với nhau thì G và G’ cũng không đẳng cấu với nhau
8
Tiểu luận môn học: Thuật toán & PP giải quyết vấn đề
4. Xây dựng giải pháp kiểm tra đẳng cấu
4.1 Quy ước về kí hiệu và định dạng mã giả
Để tiện việc trình bày thuật toán, ta quy ước rằng:
• các đỉnh của đồ thị G được đánh số v

1
, v
2,
v
3

• đồ thị G, G’(cùng với tập đỉnh V, V’ tập cạnh E, E’) có phạm vi toàn cục,
được truy xuất tùy ý trong các function
• các đoạn mã có cùng tầm vực thì được gióng thẳng hàng với nhau mà không
có các chuỗi báo hiệu bắt đầu và kết thúc khối như begin, end, {, }.
4.2 Phát biểu bài toán
Bài toán có thể phát biểu bằng ngôn ngữ tự nhiên: “Cho hai đồ thị vô hướng, đơn
giản G = (V, E) và G’ = (V’, E’). Hãy kiểm tra xem hai đồ thị này có đẳng cấu hay không ?
Nếu có thì chỉ ra song ánh f tương ứng”. Từ mô tả này ta có thể mô hình hóa bài toán như
sau:
Input: G = (V, E), G’ = (V’, E’)
Output: isomorphic = “yes” hoặc “no” // “yes”: G ≅ G’, “no”: G ≇ G’
Nếu isomorphic = “yes” thì chỉ ra song ánh f tương ứng
Ràng buộc: G, G’ là 2 đồ thị vô hướng, đơn giản
4.3 Thuật toán kiểm tra 2 đồ thị đẳng cấu
Ý tưởng cơ bản của các thuật toán kiểm tra sự đẳng cấu của hai đồ thị là dò tìm một
song ánh f: V → V’ sao cho ∀ (vi, vj) ∈ E ⇔ (f(vi), f(vj)) ∈ E’. Như vậy, nói chung các
thuật toán này đều là các thuật toán vét cạn. Tuy nhiên, hiệu quả của thuật toán phụ thuộc
vào cách làm giảm không gian tìm kiếm song ánh này. Vì vậy, mặc dù là có nhiều thuật
toán kiểm tra đẳng cấu khác nhau nhưng chúng đều có chung một mục tiêu là giảm không
gian tìm kiếm song ánh f đến mức thấp nhất.
Thuật toán đơn giản nhất là kiểm tra mọi song ánh f: V → V’ có thỏa điều kiện bảo
toàn cạnh hay không. Đây là thuật toán kiểm tra sự đẳng cấu ngây thơ và đơn giản nhất. Ta
9
Tiểu luận môn học: Thuật toán & PP giải quyết vấn đề

tạm đặt cho nó tên là Native-Isomorphic-Checking. Đầu tiên nó kiểm tra một vài tiêu
chuẩn cơ bản như phải có: cùng số cạnh, cùng số đỉnh. Nếu hai đồ thị vẫn thỏa các tiêu
chuẩn này thì tiến hành vét cạn tất cả các song ánh f cho đến khi tìm được một song ánh
thỏa mãn điều kiện bảo toàn cạnh. Thuật toán được trình bày bằng mã giả như sau:
Native-Isomorphic-Checking (G, G’)
Input: G = (V, E); G’=(V’, E’) là 2 đồ thị
isomorphic = true
if (|V| != |V’| OR |E| != |E’|)
isomorphic = false
else
f = Find-Bijection(G, G’)
if (f == [])
isomorphic = false
if (isomorphic == true)
println “Hai đồ thị đẳng cấu qua ánh xạ:”
for i = 1 to length(f)
print v
i
+ “→” + v’
f[i]
else
println “Hai đồ thị không đẳng cấu”
function FindBijection ()
Output: song ánh f thỏa (v
i,
v
j
) ∈ E ⇔ (v’
f[i]
, v’

f[j]
) ∈ E’
valid = false
π = []
f = []
n = |V|
for i = 1 to n!
π = Next-Permutation(π, n)
f = π
valid = Is-Bijection-Valid(G, G’, f)
if (exists == false)
break
f = []
10
Tiểu luận môn học: Thuật toán & PP giải quyết vấn đề
return f
Như quy ước ban đầu, vì các đỉnh của đồ thị được đánh số từ v
1
, v
2
, …, v
n
nên việc tìm
song ánh f tương đương việc tìm một hoán vị của 1,2, ,n thỏa (vi, vj) ∈ E ⇔ (v’
f[i]
, v’
f[j]
) ∈
E’. Hàm Next-Permutation trả về hoán vị kế tiếp của hoán vị hiện hành theo thứ tự từ điển.
Hàm Is-Bijection-Valid kiểm tra hai đồ thị G, G’ có đẳng cấu qua song ánh f hay không.

Chi tiết về các hàm này xin xem phần Phụ lục.
4.4 Chứng minh tính đúng
Thuật toán hoàn toàn dựa vào định nghĩa, xét từng song ánh f để kiểm tra tính chất
∀ (vi, vj) ∈ E ⇔ (f(vi), f(vj)) ∈ E’ nên thuật toán hoạt động đúng như mong đợi. Các thuật
toán trong phần cải tiến mặc dù không xét từng song ánh một nhưng dựa vào những tính
chất được chứng minh là đúng về mặt toán học nên đảm bảo là không bỏ sót những song
ánh ứng viên. Chúng chỉ lược bỏ các song ánh chắc chắn không làm cho hai đồ thị đẳng
cấu. Với các song ánh còn lại chúng cũng tiến hành kiểm tra tính chất ∀ (vi, vj) ∈ E ⇔
(f(vi), f(vj)) ∈ E’, nên chúng cũng hoạt động đúng như mong đợi.
4.5 Đánh giá độ phức tạp
Độ phức tạp của thuật toán được quyết định bởi độ phức tạp của hàm
FindBijection. Một cách trực quan ta thấy ngay rằng vì hàm này vét cạn tất cả các song
ánh f: V → V’ để tìm ra song ánh thỏa mãn điều kiện bảo toàn cạnh, mà số song ánh là n!
(n = |V|), nên thuật toán có độ phức tạp trong trường hợp xấu nhất là O(n!). Độ phức tạp
này là quá cao, nên cần thiết tiến hành các cải tiến để có được một thuật toán có độ phức
tạp tốt hơn.
4.6 Cải tiến thuật toán
Như trong phần Nhận Xét 1 đã đề cập, nếu hai đồ thị là đẳng cấu thì ngoài cùng số
cạnh, số đỉnh ra thì chúng phải có cùng số đỉnh với bậc cho trước ⟹ chúng ta sẽ áp
dụng nhận xét này bằng cách tạo ra một dãy số gồm các bậc của các đỉnh trong mỗi đồ thị,
sau đó sắp xếp hai dãy này theo thứ tự tăng dần và rồi so sánh hai dãy kết quả với nhau.
Nếu hai dãy này không giống nhau thì kết luận là hai đồ thị không đẳng cấu. (1)
11
Tiểu luận môn học: Thuật toán & PP giải quyết vấn đề
Mặt khác, trong Nhận Xét 1 có một tính chất là nếu G ≅ G’ qua song ánh f thì số
đỉnh kề với đỉnh v ∈ V và f(v) ∈ V’ là như nhau ⟹ điều này có nghĩa rằng chúng
ta chỉ cần tìm song ánh của những đỉnh có cùng bậc. Chúng ta sẽ áp dụng tính chất này
bằng cách phân hoạch tập đỉnh của mỗi đồ thị ra thành hợp của các tập rời nhau, trong đó
mỗi tập là tập hợp các đỉnh có cùng bậc. Sau đó chúng ta chỉ xét những song ánh mà ánh
xạ các đỉnh cùng bậc. (2)

Về mặt kĩ thuật, việc phân hoạch này có thể thực hiện bằng cách sắp xếp các đỉnh
theo bậc của chúng theo hướng chung là hoặc tăng hoặc giảm. Kết quả là các đỉnh có cùng
bậc sẽ nằm liên tiếp nhau. Chi phí cho việc này vào khoảng O(nlogn) nếu dùng các thuật
toán như Quicksort hay Mergesort.
Như vậy rõ ràng là chúng ta đã bỏ qua những song ánh “không cần thiết”, những
song ánh mà ánh xạ một đỉnh bậc k thành một đỉnh bậc l trong V’ với l≠k, góp phần làm
giảm kích thước không gian tìm kiếm. Nếu V được phân hoạch thành k tập rời nhau thì độ
phức tạp thuật toán trong trường hợp xấu nhất là O((()!)
k
) < O(n!). Ta tạm đặt tên cho thuật
toán cải tiến này là Isomorphic-Checking-Improve1. Các cải tiến (1) và (2) được thể hiện
qua hàm Isomorphic-Graph-Checking2
function Isomorphic-Checking-Improve1 (G, G’)
Input: G = (V, E); G’=(V’, E’) là 2 đồ thị
isomorphic = true
if (|V| != |V’| OR |E| != |E’|)
isomorphic = false
else
[D
G
, indexG] = Partition-Vertex-By-Degree (G)
[D
G’
, indexG’] = Partition-Vertex-By-Degree (G’)
if (D
G
!= D
G’
)
isomorphic = false

else
f = Find-Bijection2(G, D
G
, indexG, G’, D
G’
, indexG’)
if (f == [])
isomorphic = false
if (isomorphic == true)
12
Tiểu luận môn học: Thuật toán & PP giải quyết vấn đề
println “Hai đồ thị đẳng cấu qua ánh xạ:”
for i = 1 to length(f)
print v
i
+ “→” + f[i]
else
println “Hai đồ thị không đẳng cấu”
Hàm Partition-Vertex-By-Degree phân hoạch tập đỉnh bằng cách sắp xếp các đỉnh
tăng dần theo bậc, danh sách D
G
chứa các bậc được sắp tăng dần và danh sách indexG chứa
chỉ số i của đỉnh v
i
tương ứng với bậc của nó trong D
G
. Hàm Find-Bijection2 tìm kiếm song
ánh theo phân hoạch. Chi tiết các hàm này xin tham khảo ở phần phụ lục.
Bây giờ nói chúng thuật toán sẽ chạy nhanh hơn so với ban đầu, nhưng nó vẫn còn
vét cạn các song ánh ở từng tập con tương ứng trong phân hoạch rồi tổ hợp lại thành song

ánh sau cùng và kiểm tra song ánh đó. Tuy nhiên, trong Nhận Xét 2 ta có lưu ý rằng nếu G
k
và G’
k
là không đẳng cấu thì G và G’ cũng không đẳng cấu. Điều này có nghĩa là với một
tập trong phân hoạch nếu ta không tìm được song ánh nào để hai đồ thị con sinh bởi hai tập
tương ứng(theo Định nghĩa 5) là đẳng cấu thì kết luận ngay G và G’ không đẳng cấu mà
không cần tìm song ánh con trong các tập khác. Điều này sẽ làm giảm đáng kể các song
ánh cần kiểm tra và giúp thuật toán chạy nhanh hơn với các trường hợp mà G và G’ không
đẳng cấu. Ta tạm đặt tên cho thuật toán cải tiến này là Isomorphic-Checking-Improve2.
Cải tiến này thể hiện qua hàm Find-Bijection3:
function Find-Bijection3 (D
G
, indexG, D
G’
, indexG’)
Input: D
G
– danh sách bậc của các đỉnh của G sắp tăng dần
indexG - chỉ số các đỉnh trong đồ thị G’
D
G’
– danh sách bậc của các đỉnh của G’ sắp tăng dần
indexG’ - chỉ số các đỉnh trong đồ thị G’
Output: song ánh f thỏa (v
i,
v
j
) ∈ E ⇔ (v’
f[i]

, v’
f[j]
) ∈ E’
numVerEachDeg = Count-Number-Vertex-ByDegree(D
G
)
π = []
do
f = Generate-Bijection2(numVerEachDeg, π, indexG, indexG’)
valid = IsBijectionValid(G, G’, f)
if (valid == true)
break
while (f != [])
13
Tiểu luận môn học: Thuật toán & PP giải quyết vấn đề
return f
function Generate-Bijection2 (numVerEachDeg, π, indexG, indexG’)
Input: numVerEachDeg – danh sách mà numVerEachDeg[i] là số phần tử cùng
bậc của đồ thị G
Π – danh sách mà Π[i] là một hoán vị từ 1 numVerEachDeg[i]
indexG – chỉ số các đỉnh trong đồ thị G
indexG’ - chỉ số các đỉnh trong đồ thị G’
Output: f – song ánh từ {1,…,length(indexG)} → {1,…,length(indexG)}
idx = 0
f[i] = 0 ∀ i = 1 length(indexG)
findF
k
= false
for i = 0 to length(numVerEachDeg) - 1
if (numVerEachDeg[i] == 0)

continue
f
k
= Find-Bijection-SubGraph(i,numVerEachDeg[i],π[i],indexG
, indexG’)
if (f
k
!= [])
for j = 1 to len(f
k
)
if (f
k
[j] != 0)
f[j] = f
k
[j]
idx = idx + numVerEachDeg[i]
else
f = []
break
return f
function Find-Bijection-SubGraph (k, nVerK, π, indexG, indexG’)
Input: numVerEachDeg – danh sách mà numVerEachDeg[i] là số phần tử cùng
bậc của đồ thị G
Π – danh sách mà Π[i] là một hoán vị từ 1 numVerEachDeg[i]
indexG – chỉ số các đỉnh trong đồ thị G
indexG’ - chỉ số các đỉnh trong đồ thị G’
Output: f – song ánh từ {1,…,length(indexG)} → {1,…,length(indexG)}
findF

k
= false
f
k
= []
G
k
= (I
k
, E
k
)
G’
k
= (I’
k
, E’
k
)
while (findF
k
== false)
π = Next-Permutation(π, nVerK)
if (π == [])
break
f
k
[l] = 0 ∀ l = 1 length(indexG)
14
Tiểu luận môn học: Thuật toán & PP giải quyết vấn đề

for i = 1 to nVerK
f
k
[indexG[idx + i]] = indexG’[idx + π[i]]
if (Is-Bijection-Valid (G
k
, G’
k
, f
k
) == true)
findF
k
= true
else
f
k
= []
return f
k
Điểm nhấn của cải tiến này là hàm Find-Bijection-SubGraph nó tiến hành tìm
những song ánh từ I
k
→ I’
k
mà đồ thị con sinh bởi hai tập này là đẳng cấu qua song ánh
này. Nếu không tìm được song ánh nào như vậy thì kết luận là hai đồ thị G và G’ là không
đẳng cấu.
4.7 Cài đặt và thử nghiệm
Tiểu luận sẽ tiến hành cài đặt và thử nghiệm các thuật toán kiểm tra sự đẳng cấu

của hai đồ thị. Đầu tiên tiểu luận sẽ tạo ra một tập các đồ thị để làm dữ liệu thử nghiệm.
Sau đó với mỗi thuật toán, chọn ngẫu nhiên hai đồ thị để kiểm tra đẳng cấu, lặp lại việc này
một số lần để lấy thời gian trung bình làm kết quả so sánh cho mỗi thuật toán. Các chương
trình được viết bằng VC ++ trên Visual Studio 2013, chạy trên một máy PC vi xử lý Intel
core i5 3.30 GHz, 8 GB RAM. Các tính năng sinh đồ thị và thực thi thử nghiệm có thể đạt
được bằng công cụ imgraph-exp.exe như sau:
Để sinh ra các đồ thị:
imgraph-exp gen_graph <số đỉnh> <số đồ thị trên mỗi dãy> <số lượng đồ thị cần sinh>
Ví dụ để sinh ra 5000 đồ thị 10 đỉnh, mà trong đó có 100 đồ thị cùng số cạnh, cùng số đỉnh
với bậc cho trước: imgraph-exp gen_graph 10 100 5000
Đề chạy thí nghiệm:
imgraph-exp isomorphic_checking <nGrapTest> <nLoop> <thuật toán><folder graph
data><file chứa kết quả>
15
Tiểu luận môn học: Thuật toán & PP giải quyết vấn đề
Ví dụ để thực hiện thí nghiệm cho kiểm tra đẳng cấu 1000 lần, lặp lại 100 lần, thuật toán là
Isomophic-Checking-Improve1, thư mục chứa đồ thị là Data, file chứa kết quả là res.txt:
imgraph-exp isomorphic_checking 1000 100 1 Data rest.txt
4.7.1 Tạo dữ liệu thử nghiệm
Để tạo ra các đồ thị làm dữ liệu đầu vào cho các thử nghiệm, tiểu luận sẽ tạo ra một
tập gồm 5000 đồ thị vô hướng, đơn giản có 10 đỉnh theo thuật toán sau đây:
graphs = {}
nGraph = 0
while (nGraph < 5000)
a = sinh ngẫu nhiên một dãy số nguyên [a
i
] gồm 10 phần tử, 0 ≤ a
i
≤ 9
nGraph_i = 0

graphs_i = {}
for π in { tập các hoán vị từ từ 1 đến 10 }
lập dãy mới [a’
i
] sao cho a’[i] = a[π[i]]
graph = tạo đơn đồ thị mới với đỉnh i có bậc là a’[i] tương ứng.
if (graph ≠ ⌀ AND graph ∉ graphs)
graphs_i = graphs_i ∪ {graph}
nGraph_i = nGraph_i + 1
if (nGraph_i == 100)
break
if (nGraph_i == 100)
graphs = graphs ∪ graphs_i
nGraph = nGraph + nGraph_i
Từ thuật toán trên ta thấy rằng mỗi dãy [a
i
] “hợp lệ” sẽ sinh ra 100 đồ thị có cùng số đỉnh,
cùng số cạnh, và cùng số đỉnh với bậc cho trước.
4.7.2 Cách thức thử nghiệm
Với mỗi thuật toán kiểm tra sự đẳng cấu đã trình bày ở trên, tiểu luận sẽ tiến hành
thử nghiệm như sau:
sumTime = 0
for i = 1 to nLoop
16
Tiểu luận môn học: Thuật toán & PP giải quyết vấn đề
for j = 1 to nGraphTest
graph1 = chọn ngẫu nhiên 1 đồ thị từ {graphs}
graph2 = chọn ngẫu nhiên 1 đồ thị từ {graphs}
t1 = lấy giờ hệ thống theo millisecond
kiểm tra sự đẳng cấu hai đồ thị với thuật toán đã chọn

t2 = lấy giờ hệ thống theo millisecond
sumTime = sumTime + (t2-t1)
sumTime = sumTime/nLoop
Với nGraphTest là số lần kiểm tra sự đẳng cấu của 2 đồ thị của thuật toán đã chọn, nLoop
là số lần lặp lại thao tác này để lấy thời gian trung bình.
4.7.3 Kết quả thử nghiệm
Tiểu luận đã thử nghiệm theo cách như trên với nLoop = 100 cho nGraphTest =
10000, 100000, 1000000, 10000000. Riêng đối với thuật toán Native-Isomorphic-Checking
thì không làm theo cách này bởi vì nó chạy rất lâu. Tiểu luận đã test với nGraphTest =
1000 và thời gian chạy trung bình của nó là 348.901 giây. Quá chậm so với hai thuật toán
còn lại. Do vậy trong kết quả trình bày dưới đây, tiểu luận chỉ trình bày cho hai thuật toán
Isomophic-Checking-Improve1(Cải tiến 1) và Isomophic-Checking-Improve2(Cải tiến
2)
Thuật toán
nGraphTest
Cải tiến 1
(giây)
Cải tiến 2
(giây)
10000 0.020 0.020
100000 0.208 0.201
1000000 1.830 2.015
10000000 20.321 18.226
Quan sát kết quả thử nghiệm ở trên ta thấy giữa 2 thuật toán này không có sự chênh lệch
lớn. Điều này là phù hợp với phần đánh giá ban đầu, do thuật toán Isomophic-Checking-
Improve2 chỉ cải tiến thuật toán Isomophic-Checking-Improve1 ở phần chọn song ánh
17
Tiểu luận môn học: Thuật toán & PP giải quyết vấn đề
để kiểm tra đẳng cấu. Dù vậy nó cũng tốn chi phí để kiểm tra các song ánh con cho các đồ
thị con sinh bởi I

k
nên nó chỉ tốt hơn thuật toán Isomophic-Checking-Improve1 nếu 2 đồ
thị ban đầu không đẳng cấu với nhau.
Kết luận
Tiểu luận đã đạt được một số mục tiêu sau:
• Giới thiệu bài toán kiểm tra sự đẳng cấu của hai đồ thị, ý nghĩa và sự ứng
dụng của nó trong khoa hoc-kỹ thuật.
• Mô tả khái niệm vấn đề và quy trình xây dựng giải pháp cho vấn đề theo tiếp
cận thuật toán.
• Trình bày một số định nghĩa, định lý cần thiết cho bài toán kiểm tra sự đẳng
cấu của hai đồ thị làm cơ sở cho việc cải thiện các thuật toán .
• Đề xuất xuất thuật toán kiểm tra sự đẳng cấu hai đồ thị vô hướng, đơn giản
cùng với các phân tích, cải tiến dựa trên cơ sở các chứng minh về mặt toán
học.
• Tiến hành cài đặt, thử nghiệm các thuật toán, đánh giá các kết quả về mặt
thực nghiệm so với lý thuyết.
Bên cạnh các kết quả đã đạt được, tiểu luận vẫn có một số hạn chế sau đây:
• Chưa có một sự tổng kết các cách tiếp cận khác nhau cho bài toán đẳng cấu
đồ thị mới xuất hiện trong thời gian gần đây cũng như chưa chỉ ra cách tiếp
cận nào là tốt nhất hiện nay(state-of-the-art).
• Các thuật toán trình bày có phần hơi chi tiết, đôi khi là khá dài dòng, số
lượng các tham số truyền vào các function là khá nhiều. Chưa đưa ra được
một định dạng tương đối gọn gàng, súc tích nhưng vẫn đảm bảo các tiêu
chuẩn của thuật toán.
Căn cứ vào các đánh giá trên, các công việc tiếp theo có thể là:
• Trình bày một cách hệ thống các cách tiếp cận khác nhau hiện nay cho bài
toán đẳng cấu đồ thị. Giới thiệu một số trường hợp đồ thị đặc biệt mà trong
đó các thuật toán kiểm tra đã đạt đến độ phức tạp thời gian đa thức.
18
Tiểu luận môn học: Thuật toán & PP giải quyết vấn đề

• Trình bày một định dạng mới cho các thuật toán sao cho ít chi tiết hơn, đơn
giản hơn nhưng vẫn dễ hiểu và đảm bảo các tiêu chuẩn của thuật toán.
• Phân tích, đánh giá các thuật toán bằng các công cụ toán học để chỉ ra độ
phức tạp cho các thuật toán cải tiến.
Tài liệu tham khảo
[1]. Trần Ngọc Danh(2004), Toán Rời Rạc Nâng Cao, NXB Đại học Quốc Gia TpHCM.
[2]. Bao Ngoc Tran, Thuc Dinh Nguyen. An Efficient Algorithm for Isomorphic Problem
on Generic Simple Graphs, Second Asia International Conference on Modelling &
Simulation(2008).
[3]. Aimin Hou, Zhifeng Hao, A Polynomial Time Algorithm for Undirected Graph
Isomorphism, WCE(2011)
[4]. Kenneth H.Rosen(2000), Discrete Mathematics And Its Applications, Mc Graw-Hill
Press.
[5]. Hồ Thuần(Chủ biên), Hồ Cẩm Hà, Trần Thiên Thành(2008), Cấu trúc dữ liệu, Phân
tích thuật toán và Phát triển phần mềm, NXB Giáo Dục.
Phụ lục
function Next-Permutation (π, n)
Input: n – số tự nhiên > 0
π - là một hoán vị của 1 n
Output: hoán vị kế tiếp của π theo thứ tự từ điển hoặc [] nếu π đã là
hoán vị lớn nhất
if (π == [])
for i = 1 to n
π[i] = i
19
Tiểu luận môn học: Thuật toán & PP giải quyết vấn đề
else
i = n - 1
while (i >= 1 AND π[i] > π[i+1])
i = i – 1

if (i >= 1)
j = n
while (π[j] < π[i])
j = j – 1
π[i] ⇄ π[j]
i = i + 1, j = n
while (i < j)
π[i] ⇄ π[j]
i = i + 1
j = j – 1
else
π = []
return π
function Is-Bijection-Valid (G1, G2, f)
Input: G
1
= (V
1
, E
1
), G
2
=(V
2
, E
2
) - là 2 đồ thị
f – song ánh từ {1,2,…,|V|} -> {1,2,…,|V|}
Output:
true – G

1
≅ G
2
qua song ánh f
false - G
1
≇ G
2
qua song ánh f
result = true
for each e = (v
i
, v
j
) ∈ E
e’ = (v’
f[i]
, v’
f[j]
)
if (e’ ∉ E’)
result = false
break
return result
function Find-Bijection2 (D
G
, indexG, D
G’
, indexG’)
Input: D

G
– danh sách bậc của các đỉnh của G sắp tăng dần
indexG - chỉ số các đỉnh trong đồ thị G’
20
Tiểu luận môn học: Thuật toán & PP giải quyết vấn đề
D
G’
– danh sách bậc của các đỉnh của G’ sắp tăng dần
indexG’ - chỉ số các đỉnh trong đồ thị G’
Output: song ánh f thỏa (v
i,
v
j
) ∈ E ⇔ (v’
f[i]
, v’
f[j]
) ∈ E’
numVerEachDeg = Count-Number-Vertex-ByDegree(D
G
)
nLoop =
π = []
for i = 1 to nLoop
f = Generate-Bijection(numVerEachDeg, π, indexG, indexG’)
valid = IsBijectionValid(G, G’, f)
if (valid == true)
break
f = []
return f

function Partition-Vertex-By-Degree (G)
Input: G = (V, E) - là 1 đồ thị
Output: một danh sách L gồm 2 phần tử
L[1] - một danh sách bậc của các đỉnh sắp tăng dần
L[2] – chỉ số đỉnh trong đồ thị tương ứng với danh sách trên
D
G
= []
n = |V|
index = []
for i = 1 to n
D
G
[i] = d(v
i
)
index[i] = i;
for i = 1 to n -1
for j = i + 1 to n
if (D
G
[i] > D
G
[j])
D
G
[i] ⇄ D
G
[j]
index[i] ⇄ index[j]

return [D
G
, index]
21
Tiểu luận môn học: Thuật toán & PP giải quyết vấn đề
function Count-Number-Vertex-ByDegree (D)
Input: D – một danh sách bậc các đỉnh sắp tăng dần
Output: numVerEachDeg - danh sách mà numVerEachDeg[i] là số phần tử có
bậc i
numVerEachDeg[i] = 0 ∀ i = 0 length(D) - 1
numDeg = 1
for i = 2 to length(D)
if (D
G
[i] != D
G
[i-1])
numVerEachDeg[D
G
[i-1]] = numDeg
numDeg = 1
else
numDeg = numDeg + 1
numVerEachDeg[D
G
[i]] = numDeg
return numVerEachDeg
function Generate-Bijection (numVerEachDeg, π, indexG, indexG’)
Input: numVerEachDeg – danh sách mà numVerEachDeg[i] là số phần tử cùng
bậc của đồ thị G

Π – danh sách mà Π[i] là một hoán vị từ 1 numVerEachDeg[i]
indexG – chỉ số các đỉnh trong đồ thị G
indexG’ - chỉ số các đỉnh trong đồ thị G’
Output: f – song ánh từ {1,…,length(indexG)} → {1,…,length(indexG)}
idx = 0
f = []
if (π == [])
for i = 1 to length(numVerEachDeg)
π[i] = Next-Permutation(π[i], numVerEachDeg[i])
else
for i = length(numVerEachDeg) down to 1
π[i] = Next-Permutation(π[i], numVerEachDeg[i])
if (π[i] != [])
for j = i + 1 to length(numVerEachDeg)
π[j] = []
π[j] = Next-Permutation(π[j], numVerEachDeg[j])
break
for j = 1 to numVerEachDeg[i]
f[indexG[idx + j]] = indexG’[idx + π[i][j]]
22
Tiểu luận môn học: Thuật toán & PP giải quyết vấn đề
idx = idx + numVerEachDeg[i]
return f
23

×