Mở đầu1.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-
Trang 1TRƯỜ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.
Trang 2TRƯỜ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.
Trang 3Mục lục
1 Mở đầu 3
1.1 Tại sao phải nghiên cứu bài toán này 3
1.2 Vài ứng dụng của bài toán đẳng cấu đồ thị 3
1.3 Mục tiêu của tiểu luận 4
2 Vấn đề và quy trình giải quyết vấn đề theo tiếp cận thuật toán 4
2.1 Khái niệm vấn đề 4
2.2 Xác định vấn đề 4
2.3 Quy trình xây dựng giải pháp 5
3 Vài khái niệm cần thiết về lý thuyết đồ thị 6
Định nghĩa 1 6
Định nghĩa 2 6
Định nghĩa 3 6
Định nghĩa 4 6
Nhận Xét 1 7
Mệnh đề 1 7
Định nghĩa 5 7
Mệnh đề 2 7
Nhận xét 2 8
4 Xây dựng giải pháp kiểm tra đẳng cấu 8
4.1 Quy ước về kí hiệu và định dạng mã giả 8
4.2 Phát biểu bài toán 8
4.3 Thuật toán kiểm tra 2 đồ thị đẳng cấu 9
Trang 44.4 Chứng minh tính đúng 10
4.5 Đánh giá độ phức tạp 10
4.6 Cải tiến thuật toán 11
4.7 Cài đặt và thử nghiệm 14
4.7.1 Tạo dữ liệu thử nghiệm 15
4.7.2 Cách thức thử nghiệm 16
4.7.3 Kết quả thử nghiệm 16
Kết luận 17
Tài liệu tham khảo 19
Phụ lục 19
function Next-Permutation (π, n)π, n) 19
function Is-Bijection-Valid (π, n)G1, G2, f) 20
function Find-Bijection2 (π, n)DG, indexG, DG’, indexG’) 20
function Partition-Vertex-By-Degree (π, n)G) 21
function Count-Number-Vertex-ByDegree (π, n)D) 21
function Generate-Bijection (π, n)numVerEachDeg, π, indexG, indexG’) 22
Trang 51 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 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
NP-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(π, n)cả lý thuyết lẫn thựchà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ántrong 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ựatrê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ếtthà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ử
Trang 61.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ậttoá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 đề(π, 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ồmcá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 chotrướ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ếtquả ,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 đề(π, 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 (π, n)kí hiệu: A)
Trang 7 mục tiêu, yêu cầu (π, n)kí hiệu: B)
những điều kiện ràng buộc liên quan (π, n)nếu có)
Tổng quát thì một vấn đề(π, n)bài toán) thường được kí hiệu: A → B(π, n)nghĩa là tìm hayxá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ácbướ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 (π, n)thuật giải): đầu tiên là hình thành ý tưởng(π, n)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ủathuậ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 (π, 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(π, n)xác định big-theta: Θ) hoặc chỉ ra chận trên hợplý(π, n)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 đánhgiá 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
Trang 8 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ậttoán, chọn mẫu dữ liệu để chạy Nếu như ta đã không chứng minh tính đúngcủ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 chobao 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ànhtính toán một vài tham số thống kê quan trọng như kì vọng, phương sai…
3 Vài khái niệm cần thiết về lý thuyết đồ thị
Trang 9 G và G’có cùng số đỉnh với bậc cho trước
số đỉnh kề với đỉnh v ∈ V và f(v) ∈ V’ là như nhau
Định nghĩa 5
Cho G = (π, n)V, E) là đồ thị vô hướng, đơn giản và n = |V| Ik = { v ∈ V | d(π, n)v) = k}, 0 ≤ k ≤ n–
1 Đồ thị con sinh ra bởi Ik được định nghĩa như sau: Gk = (π, n)Ik, Ek), Ek = {(π, n)u, v) ∈ E | u, v ∈
Trang 10lại có ∀ (π, n)vki, vkj) ∈ Ek ⇔ (π, n)f(π, n)vki), f(π, n)vkj)) ∈ E’ ⇔ (π, n)fk(π, n)vki), fk(π, n)vkj)) ∈ E’ ⇔ (π, n)fk(π, n)vki), fk(π, n)vkj)) ∈ E’k
(π, n)2) Từ (π, n)1) và (π, n)2) ⟹ Gk và G’k đẳng cấu qua song ánh fk
Nhận xét 2
Từ mệnh đề 2 ta suy ra rằng:
nếu G ≅ G’ qua song ánh f thì f(π, n)V) = {f(π, n)v) | v ∈ V} = ¿k =0¿n−1 f k(I k) với Gk ≅G’k qua fk
nếu Gk 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
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ố v1, v2, v3…
đồ thị G, G’(π, n)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, đơngiản G = (π, n)V, E) và G’ = (π, n)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 = (π, n)V, E), G’ = (π, n)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 ứngRàng buộc: G, G’ là 2 đồ thị vô hướng, đơn giản
Trang 114.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ộtsong ánh f: V → V’ sao cho ∀ (π, n)vi, vj) ∈ E ⇔ (π, n)f(π, n)vi), f(π, n)vj)) ∈ E’ Như vậy, nói chung cácthuậ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ộcvà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ậttoá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ônggian 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ảotoà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
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êuchuẩ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 ánhthỏ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:
Trang 12Hà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
∀ (π, n)vi, vj) ∈ E ⇔ (π, n)f(π, n)vi), f(π, n)vj)) ∈ E’ nên thuật toán hoạt động đúng như mong đợi Các thuậttoá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ínhchấ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ị đẳngcấ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 ∀ (π, n)vi, vj) ∈ E ⇔(π, n)f(π, n)vi), f(π, n)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
Trang 13á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)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)n!) Độ phức tạpnà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ứctạ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 (π, n)1)
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ằngcá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ỗitậ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 (π, n)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 đỉnhtheo 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ùngbậc sẽ nằm liên tiếp nhau Chi phí cho việc này vào khoảng O(π, n)nlogn) nếu dùng các thuậttoá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ữngsong á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àmgiả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(π, n)(π, n)(π, n)n k)!)k) < O(π, n)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 (π, n)1) và (π, n)2) được
thể hiện qua hàm Isomorphic-Graph-Checking2
Trang 14println “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 DG chứa các bậc được sắp tăng dần và danh sách indexG chứachỉ số i của đỉnh vi tương ứng với bậc của nó trong DG 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ònvé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 Gk
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ộttậ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ậptương ứng(π, n)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:
Trang 15function Find-Bijection3 (DG , indexG, D G’ , indexG’)
Input: DG – danh sách bậc của các đỉnh của G sắp tăng dần
function Generate-Bijection2 (numVerEachDeg, π, indexG, indexG’)
Input: numVerEachDeg – danh sách mà numVerEachDeg[i] là số phần tử cùng
idx = idx + numVerEachDeg[i]
else
f = []
break
return f
Trang 16function Find-Bijection-SubGraph (k, nVerK, π, indexG, indexG’)
Input: numVerEachDeg – danh sách mà numVerEachDeg[i] là số phần tử cùng
Đ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ừ Ik → I’k mà đồ thị con sinh bởi hai tập này là đẳng cấu qua song ánhnà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ấucủ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àymộ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ươngtrì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
Trang 17core 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:
imgraph-exp isomorphic_checking <nGrapTest> <nLoop> <thuật toán><folder graph
data><file chứa kết quả>
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ộttập gồm 5000 đồ thị vô hướng, đơn giản có 10 đỉnh theo thuật toán sau đây:
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