Tải bản đầy đủ (.pdf) (13 trang)

Tiểu luận môn cơ sở dữ liệu nâng cao KHÓA LUẬN TÌM ĐỒ THỊ CON ĐẲNG CẤU

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 (488.69 KB, 13 trang )

Nguyễn Thị Ngọc Thanh – CH1101132
1

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

ĐẠI HỌC CÔNG NGHỆ THÔNG TIN








CHUYÊN ĐỀ
CƠ SỞ DỮ LIỆU NÂNG CAO


KHÓA LUẬN
TÌM ĐỒ THỊ CON ĐẲNG CẤU





NGUYỄN THỊ NGỌC THANH
CH1101132

GIẢNG VIÊN HƢỚNG DẪN
PGS.TS. ĐỖ PHÚC

















2012

Nguyễn Thị Ngọc Thanh – CH1101132
2

GIỚI THIỆU

Đồ thị và đồ thị con đẳng cấu là những khái niệm được sử dụng rộng rãi trong nhiều ứng
dụng. Hơn 30 năm qua rất nhiều nhà nghiên cứu bài toán tính toán hiệu quả đồ thị và
đẳng cấu đồ thị con. Bài toán này thiết thực hơn bao giờ hết trong thời điểm hiện nay có
nhiều mạng xã hội ra đời, việc lưu trữ thông tin trên mạng xã hội không tránh khỏi phải
biểu diển theo đồ thị, và dò tìm đồ thị con đẳng cấu trên đồ thị lớn là công việc không thể
tránh khỏi. Ngày nay, bài toán này đã thực hiện tương đối hiệu quả nhờ thuật toán do
Messmer và Bunke đưa ra. Trong khoá luận này tôi trình bày ưu điểm của thuật toán so
với thuật toán mà Ulman đã đưa ra trước đó. Khoá luận được trình bày theo 4 chương.

Chương 1 giới thiệu đồ thị đẳng cấu, chương 2 là phương pháp tìm đồ thị con đẳng cấu
của Ulman, phương pháp làm của Messmer và Bunke được trình bày trong chương 3.
Thực nghiệm được mô tả trong chương 4.

Nguyễn Thị Ngọc Thanh – CH1101132
3

I. Đồ thị đẳng cấu

1. Định nghĩa

Các đồ thị G
1
= (V
1
,E
1
) và G
2
= (V
2
,E
2
) được gọi là đẳng cấu với nhau nếu có một
song ánh f: V
1
 V
2
sao cho nếu a và b là liền kề trong V
1

thì f(a) và f(b) liền kề trong
V
2
;  a, b  V
1
. Khi đó song ánh f được gọi là một đẳng cấu.
Nói cách khác, nếu 2 đồ thị là đẳng cấu thì sẽ tồn tại một song ánh giữa các đỉnh
của 2 đồ thị bảo toàn quan hệ liền kề.
 Chú ý: Nếu 2 đồ thị G
1
và G
2
là đẳng cấu thì chúng có:
+ Số đỉnh bằng nhau.
+ Số cạnh bằng nhau.
+ Hai đỉnh tương ứng có cùng bậc.
Đây là các điều kiện cần để hai đồ thị là đẳng cấu.
 Để chứng minh hai đồ thị đẳng cấu ta cần:
+ Chứng minh điều kiện cần thỏa.
+ Xây dựng một song ánh bảo toàn quan hệ liền kề giữa hai đồ thị (điều
kiện đủ để hai đồ thị đẳng cấu).
Ví dụ 1: Chứng minh rằng hai đồ thị sau là đẳng cấu với nhau:

 Xét điều kiện cần:
+ Hai đồ thị G và H đều có 4 đỉnh,
+ Hai đồ thị G và H đều có 4 cạnh,
+ Các đỉnh của hai đồ thị đều có bậc 2.
Vậy điều kiện cần thỏa.
 Xét điều kiện đủ:
Xét hàm f: V  W

H = (W,F) G = (V,E)
v
4
v
3
u
3
u
4
v
2
v
1
u
2
u
1
Nguyễn Thị Ngọc Thanh – CH1101132
4

u
1
 v
1

u
2
 v
4


u
3
 v
2

u
4
 v
3

 f là song ánh và bảo toàn quan hệ liền kề, điều kiện đủ thỏa. Vậy hai đồ thị G
và H đẳng cấu với nhau.

Ví dụ 2: không đẳng cấu vì số cạnh và đỉnh khác nhau. Điều kiện cần không thỏa
 G và G’ không đẳng cấu.
Ví dụ 3:

G và H có cùng số cạnh, số đỉnh nhưng H có đỉnh e' bậc 1, trong khi đó G không
có đỉnh nào bậc 1. Điều kiện cần không thỏa  G và H không đẳng cấu.
2. Đồ thị tự bù

Định nghĩa: Đồ thị G được gọi là tự bù (Self-complementary) nếu G đẳng cấu với
.

G
Nguyễn Thị Ngọc Thanh – CH1101132
5

Định lý 1.4: Nếu hai đồ thị G và H có ma trận liền kề (được liệt kê theo một thứ tự
nào đó của các đỉnh) bằng nhau thì G và H là hai đồ thị đẳng cấu với nhau.


Nguyễn Thị Ngọc Thanh – CH1101132
6

II. Tìm đồ thị con đẳng cấu
Đồ thị G = (V1, E1), và đồ thị H = (V2, E2)
Kiểm tra H là 1 đồ thị con đẳng cấu của G? Theo giải thuật của J.R.ULLMANN:
Ta có :
| V1 | = n;
| V2 | = m;
n ≥ m;
đồ thị G được biểu diễn bởi ma trận A(n x n)
đồ thị H được biểu diễn bởi ma trận B(m x m)
Ta tạo một ma trận M’(n x m) với các phần tử là 0 và 1, để mà mỗi dòng có duy nhất một
số1 và không có cột nào có nhiều hơn một số 1. Ma trận M’ được dùng để hoán vị các
dòng vàcác cột của ma trận B để tạo thành ma trận C. Với C được định nghĩa như sau:
C = M’(M’B)
T
trong đó T có nghĩa là sự chuyển vị. Nếu điều đó đúng thì:

i,j (1 ≤ i,j ≤ n) : (A[i][j] = 1) → (C[i][j] = 1) ( 1 )
Và M’ là 1 đẳng cấu giữa H và 1 đồ thị con của G. Trong trường hợp này , nếu M’[i][j] =
1
Thì điểm thứ j của đồ thị G là tương ứng với điểm thứ i của đồ thị H trong sự đẳng cấu
này.Bắt đầu giải thuật liệt kê, chúng ta tạo một ma trận M
0
(n x m)
Thỏa: M
0
[i][j] = 1 nếu bậc của đỉnh thứ j của H lớn hơn hoặc bằng với bậc của đỉnh thứ

icủa G. Ngược lại M
0
[i][j] = 0.
Giải thuật liệt kê làm việc bằng cách tạo ra các ma trận M’ để mà trong mỗi ma trận M’
ta có:

M’[i][j] : M’[i][j] = 1 → M
0
[i][j] = 1. Với mỗi M’, giải thuật sẽ kiểm tra tính đẳng cấu
dựavào điều kiện (1). Trong cây tìm kiếm, những node cha có bậc d = n và chúng tương
ứng với một ma trận M’ nhất định, những node con có bậc d < n và tương ứng với 1 ma
trận M nhất định khác với ma trận M
0
. Giải thuật sử dụng mảng F có m phàn tử để đánh
dấu các cột được chọn để lưu trạng thái tức thời của các đỉnh (Fi = 0 hoặc Fi = 1), mảng
E có n phần tử để đánh dấu các cột được chọn ở 1 bậc nào đó.
Bước 1:
M = M
0
; d = 1; E[1] = 0;
Duyệt tất cả các đỉnh của đồ thị G, gán F[i] = 0 ( i = 1 n)
Nguyễn Thị Ngọc Thanh – CH1101132
7

Bước 2: Kiểm tra xem có giá trị nào của j (j=1 m) sao cho M[d][j] = 1 và F[j] = 0 thì
đến bước 7. Ngược lại: M[d] := M
Nếu d = 1 thì k:= E[1]
Ngược lại k:= 0;
Bước 3: k:= k+1
Nếu M[d][k] = 0 hoặc F[k] = 1 thì quay lại bước 3

Ngược lại FOR j = 1 n (j ≠ k) và gán M[d][j]= 0
Bước 4: Nếu d < n thì đến bước 6
Ngược lại : sử dụng điều kiện (1) và xuất kết quả nếu có 1 đồ thị con được tìm thấy.
Bước 5: Kiếm tra nếu không có giá trị của j thoả M[d][j] = 1 và F[j] = 0 thì đến bước 7
Ngược lại gán: M = M[d]
Rồi quay lại bước 3.
Bước 6:
Gán : H[d] = k, F[k] = 1, d = d+1;
Rồi quay lại bước 2.
Bước 7: Kiểm tra nếu d = 1 thì kết thúc thuật toán
Ngược lại gán: F[k] = 0, d = d -1, M = M[d] , k = E[d]
Thuật toán của Ullman thực hiện theo kiểu đệ qui quay lui. Thuật toán này có rất nhiều
hạn chế khi số đỉnh của đồ thị lớn. Bài toán này thuộc lớp bài toán NP-Complete nên rất
khó xử lý với số đỉnh lớn. Tuy nhiên, thuật toán của Ullman được xem là tốt nhất trong
số các thuật toán dò tìm đẳng cấu đồ thị con trong đồ thị cha.
Thuật toán dựa trên ý tưởng tìm tất cả các đẳng cấu đồ thị con bằng cách giảm dần hoán
vị ma trận P theo từng hàng. Dể thấy thuật toán xuất ra tất cả ma trận hoán vị P. tuy
nhiên, đệ qui quay lui chỉ có thể áp dụng được cho 2 đồ thị tại cùng thời điểm. Nếu có
thêm đồ thị nào khác, thì thuật toán phải được gọi lại 1 lần. Vì vậy, độ phức tạp thuật
toán phụ thuộc tuyến tính vào số lượng đồ thị.

Nguyễn Thị Ngọc Thanh – CH1101132
8

III. Thuật toán cải tiến với thời gian đa thức
Cách tổ chưc đồ thị trên một cây quyết định sao cho mỗi ma trận của đồ thị con được
phân lớp theo cây. Các đặc trưng được sử dụng trong quá trình phân lớp là các thành
phần cá nhân trong các ma trận kề. Điều quan trọng là mục tiêu của cây quyết định là
phân lớp các ma trận kề. Trong trường hợp dò tìm đẳng cấu đồ thị con, các ma trận này
sẽ nhỏ hơn các ma trận ban đầu. Vì vậy, cần nhóm các thành phần cá nhân của ma trận kề

thành các đặc trưng sao cho việc phân lớp của mỗi cấp trên cây quyết định độc lập kích
thước ma trận kề được phân lớp. Hình 1 minh hoạ việc này.

Hình 1: biểu diển dòng-cột của ma trận kề
Sau đó ta tạo một cây quyết định biểu diển tất cả hoán vị, mỗi hoán vị ứng với mật đẳng
cấu, của một đồ thị. Hình 2 mô tả cách xây dựng cây quyết định dùng để phân lớp các ma
trận kề của đồ thị.
Cây quyết định này có ưu điểm có thể biểu diển một lúc nhiều đồ thị. Hình 3 minh hoạ 2
đồ thị g và g’ được biểu diển trên một cây.
Tuy nhiên, cây quyết định trên vẫn còn có thể nén được với những phần tương đương với
nhau, những thông tin trùng như vậy thực sự quá dư thừa. Để tránh dư thừa thông tin thì
ta có cách biểu diển khác của cây quyết định. Công việc này Messmer và Bunke gọi là
trộn cây quyết định, hàm trộn cây quyết định được mô tả trong bài báo của tác giả. Hình
4 minh hoạ cây quyết định đã được nén.

Nguyễn Thị Ngọc Thanh – CH1101132
9


Hình 2: cây quyết định dùng để phân lớp
Nguyễn Thị Ngọc Thanh – CH1101132
10


Hình 3: Biểu diển cả 2 đồ thị g và g’

Hình 4: Cây được nén
Nguyễn Thị Ngọc Thanh – CH1101132
11


Với cấu trúc cây như vậy, ta thấy chỉ cần tốn chi phí 1 lần cho việc xây dựng cây rồi sau
đó dùng để phân lớp (tìm kiếm) một đồ thị con đẳng cấu nào đó có tồn tại trên đồ thị hay
không với thời gian rất nhanh. Điều này rất cần thiết trong thời điểm hiện nay khi công
việc lưu trữ của máy tính không còn là vấn đề khó khăn nửa, và giúp ta có thể thực hiện
được trên những đồ thị lớn như là đồ thị lưu trữ mạng xã hội.
Việc phân tích độ phức tạp xữ lý và đánh giá không gian lưu trữ được mô tả trong bài báo
của tác giả cho thấy thời gian thực hiện đa thức.

Nguyễn Thị Ngọc Thanh – CH1101132
12

IV. Chƣơng trình minh hoạ

Hình 5: Chương trình minh hoạ Tìm đồ thị con đẳng cấu theo cây quyết định
Mô tả chương trình:
Chương trình được thực hiện bằng ngôn ngữ C# 2008. Thuật toán tìm đồ thị con đẳng cấu
của Messmer và Bunke đề nghị.
Chương trình trong hình 5 chỉ có một form, trong textfield thứ nhất cho phép nhập đồ thị
lớn, textfield thứ 2 cho phép nhập đồ thị con. Button thực hiện công việc xác định đồ thị
con đẳng cấu có tồn tại trên đồ thị chính hay không. Hai textfield còn lại là thông tin kết
quả.
Nguyễn Thị Ngọc Thanh – CH1101132
13

Chương trình được thử trên nhiều đồ thị nhỏ 3x3, 4x4, 5x5, 6x6, với kết quả đã được
kiểm chứng bằng tay, thì tính đúng đắn đã đạt được. Chưa so sánh tốc độ xử lý với thuật
toán của Ulman, đây là công việc có thể phát triển sau.
Mã chương trình:

















Tài liệu tham khảo:
[1] Bài giảng CSDL nâng cao – PGS. TS Đỗ Phúc
[2] Subgraph Isomorphism in Polynomial Time – B.T Messmer, H.Bunke
public bool Validate(AdjMatrix graph, AdjMatrix subgraph, out String tree)
{
//Xây dựng cây quyết định
AdjMatrix[] permutations = GetAllPermutation(graph);
Node root = new Node(null);
foreach (AdjMatrix p in permutations)
AppendGraphToDecisionTree(root, p);
tree = root.ToString("");

//Kiểm tra xem subgraph có thuộc cây quyết định
Node node = root;
for (int i = 0; i < subgraph.GetSize(); i++)
{

//lấy dòng kết tiếp của đồ thị con
byte[] line = subgraph.GetLine(i);

//kiểm tra xem nó có thuộc nhánh con đang xét
//nếu thuộc thì cứ thế đi tiếp
Node nextNode = null;
foreach(Node child in node.Children)
if (child.HasValue(line))
{
nextNode = child;
break;
}

//không thuộc return false
if (nextNode == null)
return false;
node = nextNode;
}
return true;
}

×