LỜI CAM ĐOAN Em xin cam đoan: Luận v n th c s Khoa học máy tính “ Bài toán tìm bộ ghép cực đại trên đồ thị, ứng dụng giải một số bài toán trong thực tế” này là công trình nghiên cứu thự
Trang 1ĐẠI HỌC THÁI NGUYÊN
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN & TRUYỀN THÔNG
Trang 2ĐẠI HỌC THÁI NGUYÊN
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN & TRUYỀN THÔNG
LUẬN VĂN THẠC SĨ KHOA HỌC MÁY TÍNH
NGƯỜI HƯỚNG DẪN KHOA HỌC: TS Trương Hà Hải
Thái Nguyên - 2015
Trang 3LỜI CAM ĐOAN
Em xin cam đoan: Luận v n th c s Khoa học máy tính “ Bài toán tìm bộ ghép cực đại trên đồ thị, ứng dụng giải một số bài toán trong thực tế” này
là công trình nghiên cứu thực sự của cá nhân em, được thực hiện trên cơ sở nghiên cứu lý thuyết và dưới sự hướng dẫn khoa học của Tiến s Trương Hà
Hải, Trường Đ i học Công nghệ Thông tin và Truyền thông
Em xin chịu trách nhiệm về lời cam đoan này
Thái Nguyên, ngày tháng n m 2015
Tác giả
Vũ Minh Tiệp
Trang 4LỜI CẢM ƠN
Để hoàn thành luận v n, em xin chân thành cảm ơn Trường Đ i học Công nghệ Thông tin và Truyền thông, Phòng Đào t o, các thầy, cô giáo giảng d y lớp cao học Khoa học máy tính K12E đã quan tâm, t o điều kiện thuận lợi, tận tình giảng d y và giúp đỡ em trong thời gian theo học t i trường
Đặc biệt, em xin bày tỏ lòng biết ơn sâu sắc đến TS Trương Hà Hải,
người đã dành nhiều thời gian, tâm huyết hướng dẫn em trong suốt quá trình nghiên cứu và hoàn thành luận v n
Em cũng xin cảm ơn các cán bộ, giảng viên đồng nghiệp ở Trường Trung Cấp Kỹ Thuật V nh Phúc đã t o điều kiện về thời gian để em có thể học tập và hoàn thành luận v n
Mặc d đã cố gắng hết sức hoàn thiện luận v n, tuy nhiên chắc chắn vẫn còn nhiều thiếu s t, rất mong sự g p qu báu của quý thầy cô và các b n
Xin trân trọng cảm ơn
u n n t n n m 5
Tác giả
Vũ Minh Tiệp
Trang 5MỤC LỤC
Đặt vấn đề 1
CHƯƠNG 1 CƠ SỞ LÝ THUYẾT VỀ ĐỒ THỊ VÀ ĐỘ PHỨC TẠP THUẬT TOÁN 4
1.1 CÁC KHÁI NIỆM CƠ BẢN 4
1.1.1 Khái niệm đồ thị 4
1.1.2 Các lo i đồ thị 5
1.1.3 Biểu diễn đồ thị 11
1.2 ĐỘ PHỨC TẠP TÍNH TOÁN VÀ TÍNH HIỆU QUẢ CỦA THUẬT TOÁN 16
1.2.1 Định ngh a thuật toán 16
1.2.2 Phân tích độ phức t p của thuật toán 17
1.2.3 Tối ưu thuật toán 18
1.3 MỘT SỐ THUẬT TOÁN TÌM KIẾM TRÊN ĐỒ THỊ 19
1.3.1 Thuật toán tìm kiếm theo chiều sâu (DEPTH FIRST SEARCH) 19
1.3.2 Thuật toán tìm kiếm theo chiều rộng (BREADTH FIRST SEARCH) 21
CHƯƠNG 2 BÀI TOÁN TÌM BỘ GHÉP CỰC ĐẠI TRÊN ĐỒ THỊ VÀ CÁC THUẬT TOÁN 24
2.1 ĐỒ THỊ HAI PHÍA 24
2.1.1 Định ngh a 24
2.1.2 Các bài toán trên đồ thị hai phía 26
2.2 BÀI TOÁN TÌM BỘ GHÉP CỰC ĐẠI TRÊN ĐỒ THỊ HAI PHÍA 26
2.2.1 Bài toán ghép đôi không trọng và các khái niệm 26
2.2.2 Thuật toán đường mở 28
2.2.3 Độ phức t p của thuật toán 29
2.3 BÀI TOÁN TÌM BỘ GHÉP CỰC ĐẠI VỚI TỔNG TRỌNG SỐ CỰC ĐẠI HOẶC CỰC TIỂU TRÊN ĐỒ THỊ HAI PHÍA 29
2.3.1 Bài toán phân công 29
2.3.2 Thuật toán tìm cặp ghép với tổng trọng số trên các c nh là lớn nhất hoặc nhỏ nhất 30
2.3.3 Thuật toán Hung-ga-ri 33
Trang 62.3.4 Phương pháp đối ngẫu Kuhn-Munkres 37
2.3.5 Đánh giá độ phức t p và cải tiến thuật toán 39
2.4 BÀI TOÁN TÌM BỘ GHÉP CỰC ĐẠI TRÊN ĐỒ THỊ TỔNG QUÁT 42
2.4.1 Các khái niệm 42
2.4.2 Thuật toán Edmonds (1965) 44
2.4.3 Thuật toán Lawler (1973) 46
CHƯƠNG 3 MỘT SỐ BÀI TOÁN ỨNG DỤNG TRONG THỰC TẾ 50
3.1 BÀI TOÁN ĐIỀU HÀNH TAXI 50
3.1.1 Phát biểu bài toán 50
3.1.2 Phân tích bài toán và xây dựng thuật toán 50
3.2 BÀI TOÁN XẾP LỚP HỌC THEO TÍN CHỈ 60
3.2.1 Mô hình đào t o theo học chế tín chỉ 60
3.2.2 Phát biểu bài toán 61
3.2.3 Phân tích bài toán và xây dựng thuật toán 62
TÀI LIỆU THAM KHẢO 73
Trang 7DANH MỤC C C H NH V
Hình 1: Ví dụ về mô hình đồ thị 4
Hình 2: Đơn đồ thị vô hướng và không phải đơn đồ thị vô hướng 5
Hình 3: Đa đồ thị vô hướng 6
Hình 4: Đơn đồ thị c hướng và không phải đơn đồ thị c hướng 7
Hình 5: Đa đồ thị c hướng 8
Hình 6: Đơn đồ thị vô hướng 9
Hình 7: Đồ thị c hướng 10
Hình 8: Ví dụ biểu diễn đồ thị danh sách c nh 12
Hình 9: Ví dụ biểu diễn đồ thị danh sách liền kề 13
Hình 10: Ví dụ biểu diễn đồ thị ma trận kề 14
Hình 11: Ví dụ biểu diễn đồ thị ma trận liên thuộc 16
Hình 12: Quá trình tìm kiếm theo chiều sâu 20
Hình 13: Cây BFS 21
Hình 14: Quá trình tìm kiếm theo chiều rộng 23
Hình 15: Ví dụ về đồ thị hai phía và không phải là đồ thị hai phía 24
Hình 16: Đồ thị hai phía 28
Hình 17: Ví dụ bài toán tìm bộ ghép cực đ i trên đồ thị 43
Hình 18: Phép chập Blossom 45
Hình 19: Nở Blossom để dò đường xuyên qua Blossom 46
Trang 8Đặt vấn đề
Ngày nay việc giải quyết các bài toán lớn cho hệ thống đòi hỏi sự hợp tác chặt chẽ giữa các chuyên gia trong các l nh vực chuyên môn, như các chuyên gia Toán, Toán ứng dụng và các chuyên gia Tin học, kỹ sư lập trình Việc thiết lập được một mô hình hợp lý, phản ánh được bản chất của bài toán thực tế đồng thời khả thi về phương diện tính toán luôn là điều đáng được quan tâm
Đặc biệt trong các chuyên ngành liên quan thì toán học là chuyên ngành rất được quan tâm, một trong số đ là L thuyết đồ thị Đồ thị biểu diễn được rất nhiều cấu trúc, nhiều bài toán thực tế có thể được biểu diễn bằng đồ thị Ví dụ, cấu trúc liên kết của một website có thể được biểu diễn bằng một
đồ thị c hướng như sau: các đỉnh là các trang web hiện có t i website, tồn t i một c nh c hướng nối từ trang A tới trang B khi và chỉ khi A có chứa 1 liên kết tới B Do vậy, sự phát triển của các thuật toán xử l đồ thị là một trong các mối quan tâm chính của khoa học máy tính
Mặc dù Lý thuyết đồ thị đã được khoa học phát triển từ rất lâu nhưng l i
có nhiều ứng dụng hiện đ i, đặc biệt là các thuật toán trên đồ thị đã có nhiều ứng dụng trong nhiều l nh vực khác nhau như: M ng máy tính, Lý thuyết mã, Tối ưu hoá, Kinh tế học .Những tưởng cơ bản của lý thuyết đồ thị được nhà toán học Thụy s Leonhard Euler đưa ra từ thế kỷ 18 Ông đã d ng l thuyết đồ thị để giải quyết bài toán cầu Konigsberg nổi tiếng
Đồ thị cũng được d ng để giải nhiều bài toán thuộc những l nh vực rất khác nhau như: người ta có thể dùng đồ thị để biểu diễn sự c nh tranh của các loài trong môi trường sinh thái, dùng đồ thị biểu diễn ai có ảnh hưởng đến ai trong một tổ chức nào đ và cũng c thể dùng đồ thị để giải các bài toán như bài toán tính số các tổ hợp khác nhau của các chuyến xe giữa hai thành phố trong một m ng giao thông, bài toán đi tham quan tất cả các phố của một
Trang 9thành phố sao cho mỗi phố đi qua đúng một lần, hay bài toán tìm số màu cần thiết để tô các vùng khác nhau của một bản đồ, Đồ thị với các trọng số được gán cho các c nh của nó có thể d ng để giải các bài toán như bài toán tìm đường đi ngắn nhất giữa hai thành phố trong một m ng giao thông, bài toán phân công lao động sao cho tổng lợi nhuận thu được là lớn nhất Đặc biệt, nhiều bài toán trong thực tế sử dụng mô hình đồ thị và các thuật toán trên đồ thị được giải quyết rất hiệu quả như: bài toán điều hành taxi, bài toán xếp lớp học theo tín chỉ có thể đưa về mô hình bài toán tìm bộ ghép cực đ i trên đồ thị
và sử dụng các thuật toán tương ứng
Chính vì đồ thị có thể được sử dụng để giải quyết nhiều bài toán thuộc nhiều l nh vực khác nhau một cách dễ dàng và phổ biến như vậy nên đồ thị giữ một vai trò hết sức quan trọng trong cuộc sống, đặc biệt là trong l nh vực công nghệ thông tin, dựa vào đồ thị và các thuật toán trên đồ thị người ta có thể xây dựng nên các phần mềm hữu ích giải các bài toán thực tế một cách nhanh chóng và tối ưu
Nhận thấy tính thiết thực của vấn đề này và được sự gợi ý của giảng
viên hướng dẫn, tôi đã chọn nội dung nghiên cứu về ―Bài toán tìm bộ ghép cực đại trên đồ thị, ứng dụng giải một số bài toán trong thực tế.” làm đề tài
cho luận v n tốt nghiệp của mình
Luận v n được bố cục thành 3 chương:
Chương 1 Cơ sở về lý thuyết đồ thị và độ phức tạp thuật toán: C ươn
này trình bày các khái niệm cơ bản về Lý thuyết đồ thị v độ phức tạp thuật toán
Chương 2 Bài toán tìm bộ ghép cực đại trên đồ thị và các thuật toán:
C ươn n p t b ểu các dạng bài toán tìm bộ ghép cực đạ tr n đồ thị, trình bày các thuật toán v đ n độ phức tạp của các thuật toán
Chương 3 Một số bài toán ứng dụng trong thực tế: Tìm hiểu một số bài
toán ứng dụng trong thực tế: B to n đ ều hành taxi, bài toán xếp lớp học theo tín
Trang 10chỉ … xâ dựn c ươn trìn t ử nghiệm giải các bài toán này ứng dụng bài toán xếp lớp học theo tín chỉ tạ trường Trung cấp Kỹ thuật Vĩn P úc
Trang 11Đồ thị là một cấu trúc rời r c gồm các đỉnh và các c nh nối các đỉnh đ
Đồ thị đƣợc k hiệu là G = (V, E), trong đ V là tập đỉnh và E là tập c nh Có thể coi E là tập các cặp(u,v) với u và v là hai đỉnh của V
Một số hình ảnh của đồ thị
Hình 1: Ví dụ về mô ìn đồ t ị
Trang 12Ví dụ
a) Đơn đồ thị vô hướng b) Không phải đơn đồ
thị vô hướng do c các cặp c nh nối c ng một
cặp đỉnh
c) Không phải đơn đồ thị vô hướng do c c nh nối một đỉnh với chính n
Hìn : Đơn đồ t ị vô ướn v k ôn p ả đơn đồ t ị vô ướn
Trang 13Tuy nhiên, trên thực tế, cũng c thể trong một hệ thống giao thông vẫn tồn t i nhiều con đường đi nối c ng hai địa điểm, hoặc cũng c thể c một con đường để đi từ một địa điểm nào đ rồi l i quay về chính n (đây c thể
là một con đường nội bộ của một trung tâm mua sắm, …) Khi đ , tính chất của đơn đồ thị vô hướng như định ngh a trên không cho phép n biểu diễn được hệ thống giao thông trong trường hợp này Muốn vậy, ta phải d ng một
lo i đồ thị tổng quát hơn, đ là: đa đồ thị vô hướng
- Các c nh nối c ng một cặp đỉnh được gọi là các c nh song song
- Các c nh nối từ một đỉnh với chính n được gọi là khuyên
Ví dụ
a) Đa đồ thị vô hướng: e1 và e2 là
các c nh song song
b) Đa đồ thị vô hướng: e là khuyên
Hìn 3: Đa đồ t ị vô ướn
e1
e2
e
Trang 14Điểm chung của hai lo i đồ thị đã được định ngh a ở trên là tính chất
vô hướng (hai chiều) của các c nh Trong thực tế, cũng c khi ta phải chú trọng đến tính c hướng của các c nh nối này (chẳng h n như biểu diễn các con đường một chiều) Từ đ , ta c thêm lo i đồ thị: Đơn đồ thị c hướng và
đa đồ thị c hướng Về cơ bản, hai lo i này cũng tương tự như hai lo i mà ta định ngh a ở trên, chỉ thêm sự khác biệt là tính chất c thứ tự của các c nh
c) Không phải đơn đồ thị c hướng do c cung nối một
Trang 15- E là một họ các cặp c thứ tự của V gọi là các cung
Các cung nối c ng một cặp đỉnh được gọi là các cung song song
Ví dụ
a) Đa đồ thị c hướng: e1 và e2 là các
cung song song
b) Đa đồ thị c hướng: e là khuyên
Hìn 5: Đa đồ t ị có ướn
Định nghĩa 5:
Một giả đồ thị G = (V, E) gồm một tập các đỉnh V, một tập các c nh E và một hàm f từ E tới {{u,v} | u,v V } Một c nh là một khuyên nếu f(e) = {u} với một đỉnh u nào đ
Một số thuật ngữ cơ bản
+ Cho đồ thị vô hướng G = <V,E>
- Hai đỉnh u và v của đồ thị được gọi là kề nhau nếu (u,v) là một c nh của đồ thị
- Nếu e = (u,v) là c nh của đồ thị thì ta n i c nh này là liên thuộc với hai đỉnh u và v C nh được n i là nối đỉnh u và v Đỉnh u và v được gọi là đỉnh đầu của c nh e
+ Cho đồ thị vô hướng G = <V,E> Bậc của đỉnh v trong đồ thị, k hiệu là
e2 e1
e
Trang 16deg(v), là số c nh liên thuộc với n Đỉnh c bậc 0 được gọi là đỉnh cô lập,đỉnh c bậc 1 gọi là đỉnh treo
Ví dụ
Cho đồ thị vô hướng G = <V,E> sau:
Hìn 6: Đơn đồ t ị vô ướn
- V = {1, 2, 3, 4, 5, 6}
- E = {(1,2), (2,3), (1,4), (1,5), (2,5), (4,5), (2,4)}
- Bậc của các đỉnh:
- deg(1) = 3 deg(2) = 4 deg(3) = 1
- deg(4) = 3 deg(5) = 3 deg(6) = 0
Trang 17- Hai đỉnh u và v của đồ thị đƣợc gọi là kề nhau nếu (u,v) là một cung của đồ thị
- Nếu e=(u,v) là cung của đồ thị thì ta n i cung này đi ra khỏi đỉnh u và
đi vào đỉnh v Đỉnh u đƣợc gọi là đỉnh đầu của cung e và đỉnh v đƣợc gọi là đỉnh cuối của cung e
Trang 18- Bán bậc ra: deg+(1)=2 deg+(2)=2 deg+(3)=1
deg+(4)=1 deg+(5)=2 deg+(6)=2
- Bán bậc vào: deg-(1)=1 deg-(2)=2 deg-(3)=2
deg-(4)=2 deg-(1)=2 deg-(1)=1 Tương tự như đồ thị vô hướng, đối với đồ thị c hướng ta cũng c kết quả gần tương tự về bậc của các đỉnh của đồ thị
+ Cho G = <V,E> là đồ thị c hướng Tổng bán bậc ra của các đỉnh bằng tổng bán bậc vào của các đỉnh và bằng số c nh của đồ thị
Lý thuyết đồ thị được ứng dụng trong rất nhiều l nh vực khác nhau Để
sử dụng được đồ thị hiệu quả và nhanh ch ng hơn, chúng ta phải biểu diễn và
xử l được đồ thị với máy tính Cách biểu diễn thông thường bằng hình vẽ và
mô tả tập hợp sẽ không ph hợp với cách thức lưu trữ dữ liệu và xử l trên máy tính Chúng ta phải tìm một cấu trúc dữ liệu thích hợp để biểu diễn đồ thị trên máy tính
C nhiều phương pháp khác nhau để biểu diễn đồ thị trên máy tính Sau đây chúng ta sẽ lần lượt tìm hiểu một số phương pháp thông dụng
Trang 19(u, v) tương ứng với một c nh của đồ thị (Trong trường hợp đồ thị c hướng thì mỗi cặp (u, v) tương ứng với một cung, u là đỉnh đầu và v là đỉnh cuối của cung) Danh sách được lưu trong bộ nhớ dưới d ng mảng hoặc danh sách m c nối
Ví dụ với đồ thị dưới đây:
Ưu đ ểm của dan s c cạn :
• Trong trường hợp đồ thị thưa (c số c nh tương đối nhỏ: chẳng h n
m < 6n), cách biểu diễn bằng danh sách c nh sẽ tiết kiệm được không gian lưu trữ, bởi n chỉ cần 2m ô nhớ để lưu danh sách c nh
• Trong một số trường hợp, ta phải xét tất cả các c nh của đồ thị thì
1
3
4
Trang 20cài đặt trên danh sách c nh làm cho việc duyệt các c nh dễ dàng hơn (Thuật toán Kruskal chẳng h n)
ược đ ểm của dan s c cạn :
• Nhược điểm cơ bản của danh sách c nh là khi ta cần duyệt tất cả các đỉnh kề với đỉnh v nào đ của đồ thị, thì chẳng c cách nào khác là phải duyệt tất cả các c nh, lọc ra những c nh c chứa đỉnh v và xét đỉnh còn l i Điều đ khá tốn thời gian trong trường hợp đồ thị dày (nhiều c nh)
Ưu đ ểm của dan s c kề:
• Đối với danh sách kề, việc duyệt tất cả các đỉnh kề với một đỉnh v cho trước là hết sức dễ dàng, cái tên "danh sách kề" đã cho thấy rõ điều này Việc duyệt tất cả các c nh cũng đơn giản vì một c nh thực ra là nối một đỉnh với một đỉnh khác kề n
Trang 21ược đ ểm của dan s c kề
• Về l thuyết, so với hai phương pháp biểu diễn trên, danh sách kề tốt hơn hẳn Chỉ c điều, trong trường hợp cụ thể mà ma trận kề hay danh sách c nh không thể hiện nhược điểm thì ta nên d ng ma trận kề (hay danh sách c nh) bởi cài đặt danh sách kề c phần dài dòng hơn
c Ma trận liền kề
Giả sử G = (V, E) là một đồ thị đơn trong đ |V| = n và các đỉnh được liệt kê tuỳ v1,…,vn Ma trận liền kề A của G ứng với danh sách các đỉnh này là ma trận không - một cấp n*n c phần tử hàng i, cột j bằng 1 nếu vi và
vj liền kề nhau, và bằng 0 nếu chúng không được nối với nhau
3 Nếu G là đồ thị c hướng và A là ma trận liền kề tương ứng thì trên ma trận A:
Trang 22• Tổng các số trên hàng i = Bán bậc ra của đỉnh i = deg+(i)
• Tổng các số trên cột i = Bán bậc vào của đỉnh i = deg-(i)
Trong trường hợp G là đơn đồ thị, ta c thể biểu diễn ma trận liền kề A tương ứng là các phần tử logic.Aij = TRUE nếu (i, j) E và aij = FALSE nếu (i, j) ∉ E
Ưu đ ểm của ma trận l ền kề:
• Đơn giản, trực quan, dễ cài đặt trên máy tính
• Để kiểm tra xem hai đỉnh (u, v) của đồ thị c kề nhau hay không, ta chỉ việc kiểm tra bằng một phép so sánh: auv ≠ 0
ược đ ểm của ma trận l ền kề:
• Bất kể số c nh của đồ thị là nhiều hay ít, ma trận liền kề luôn luôn đòi hỏi n2 ô nhớ để lưu các phần tử ma trận, điều đ gây lãng phí bộ nhớ dẫn tới việc không thể biểu diễn được đồ thị với số đỉnh lớn
Với một đỉnh u bất kỳ của đồ thị, nhiều khi ta phải xét tất cả các đỉnh v khác kề với n , hoặc xét tất cả các c nh liên thuộc với n Trên ma trận liền
kề việc đ được thực hiện bằng cách xét tất cả các đỉnh v và kiểm tra điều kiện auv ≠ 0 Như vậy, ngay cả khi đỉnh u là đỉnh cô lập (không kề với đỉnh nào) hoặc đỉnh treo (chỉ kề với 1 đỉnh) ta cũng buộc phải xét tất cả các đỉnh
và kiểm tra điều kiện trên dẫn tới lãng phí thời gian
Trang 23mij = 0 nếu c nh ej không nối với
1.2.1 Định nghĩa thuật toán
Thuật toán là một dãy hữu h n các bước, mỗi bước mô tả chính xác các phép toán hoặc hành động cần thực hiện để cho ta lời giải của bài toán
- Thao tác , hay còn gọi là tác vụ, phép toán ( Operation ) hay lệnh (Command), chỉ thị (Instruction) là một hành động cần được thực hiện bởi
cơ chế thực hiện thuật toán
Mỗi thao tác biến đổi bài toán từ một tr ng thái trước (hay tr ng thái nhập) sang tr ng thái sau (hay tr ng thái xuất).Thực tế mỗi thao tác thường sử dụng một số đối tượng trong tr ng thái nhập (các đối tượng nhập )và sản sinh
ra các đối tượng mới trong tr ng thái xuất (các đối tượng xuất) Quan hệ giữa
2 tr ng thái xuất và nhập cho thấy tác động của thao tác Dãy các thao tác của thuật toán nối tiếp nhau nhằm biến đổi bài toán từ tr ng thái ban đầu đến tr ng thái kết quả
Trang 24Mỗi thao tác có thể phân tích thành các thao tác đơn giản hơn Trình tự thực hiện các thao tác phải được xác định rõ ràng trong thuật toán Cùng một tập hợp thao tác nhưng xếp đặt theo trình tự khác nhau sẽ cho kết quả khác nhau
1.2.2 Phân tích độ phức tạp của thuật toán
Trong khi giải một bài toán c thể c một số giải thuật khác nhau, vấn
đề là cần phải đánh giá các giải thuật đ để lựa chọn một giải thuật tốt nhất Thông thường người ta c n cứ vào các tiêu chuẩn sau:
- Tiêu chuẩn về tính đúng đắn của thuật toán, thuật toán c cho lời giải đúng của bài toán hay không ?
- Tiêu chuẩn về tính đơn giản của thuật toán Thường ta mong muốn c được một thuật toán đơn giản, dễ hiểu, dễ lập trình Đặc biệt là những thuật toán chỉ d ng một vài lần ta cần coi trọng tính chất này, vì công sức và thời gian bỏ ra để xây dựng thuật toán thường lớn hơn rất nhiều so với thời gian thực hiện n
- Tiêu chuẩn về thời gian: Thời gian ch y của thuật toán c nhanh không? Khi một chương trình được sử dụng nhiều lần thì yêu cầu tiết kiệm thời gian thực hiện chương trình l i rất quan trọng, đặc biệt đối với những bài toán mà dữ liệu đầu vào lớn thì tiêu chuẩn này là rất quan trọng
Trong phần này ta quan tâm chủ yếu đến độ phức t p thời gian của thuật toán
Các bước trong quá trình phân tích đánh giá thời gian chạy của thuật toán:
- Bước đầu tiên trong việc phân tích thời gian ch y của thuật toán là quan tâm đến kích thước dữ liệu, sẽ được d ng như dữ liệu nhập của thuật toán và quyết định phân tích thuật toán nào là thích hợp Ta c thể xem thời gian ch y của thuật toán là một hàm theo kích thước của dữ liệu nhập Nếu
Trang 25gọi n là kích thước của dữ liệu nhập thì thời gian thực hiện T của thuật toán được biểu diễn như một hàm theo n, k hiệu là: T(n) Người ta thường coi T(n) là thời gian thực hiện chương trình trong trường hợp xâu nhất trên dữ liệu vào c kích thước n, tức là: T(n) là thời gian lớn nhất để thực hiện chương trình đối với mọi dữ liệu vào c cúng kích thước n
- Bước thứ hai trong việc phân tích thời gian ch y của một thuật toán là nhân ra các thao tác trừu tượng của thuật toán để tách biệt sự phân tích và sự cài đặt Bởi vì ta biết rằng tốc độ xử l của máy tính và các bộ dịch của ngôn ngữ lập trình cao cấp đều ảnh hưởng đến thời gian ch y của thuật toán, nhưng những thao tác này không đồng đều trên các lo i máy trên đ cài đặt thuật toán, vì vậy không thể dựa và chúng để đánh giá thời gian ch y của thuật toán Chẳng h n ta tách biệt sự xem xét xem c bao nhiêu phép toán so sánh trong một thuật toán sắp xếp khỏi sự xác định cần bao nhiêu micro giây ch y trên một máy tính cụ thể Yếu tố thứ nhất được xác định bởi tính chất của thuật toán, còn yếu tố thứ hai được xác định bởi tính n ng của máy tính Điều này cho thấy rằng T(n) không thể được biểu diễn bằng giây, phút … được; cách tốt nhất là biểu diễn theo số các chỉ thị trong thuật toán
1.2.3 Tối ưu thuật toán
Tiến trình tổng quát của việc t o ra các sửa đổi ngày càng tiến bộ hơn cho một thuật toán để sinh ra một phiên bản khác ch y nhanh hơn được gọi là tối ưu thuật toán Khi tối ưu một thuật toán ta thường dựa vào một nguyên lý,
đ là nguyên l Profile : ― Tìm điểm mất thời gian nhiều nhất của thuật toán ― Một số kỹ thuật thường d ng để tối ưu thuật toán là:
Kỹ thuật tố ưu c c vòn lặp và tố ưu v ệc rẽ nhánh
Đây là điểm quan tâm đầu tiên khi cải tiến thuật toán,vì vòng lặp là câu lệnh thường làm t ng độ phức t p của thuật toán Việc cải tiến tập trung vào :
- Cố gắng giảm các vòng lặp lồng nhau
Trang 26- T ng số lệnh thực hiện trong một bước lặp để giảm số lượng các bước lặp
- Tách các lệnh không phụ thuộc vào chỉ số lặp ra khỏi vòng lặp
1.3 MỘT SỐ THUẬT TOÁN TÌM KIẾM TRÊN ĐỒ THỊ
1.3.1 Thuật toán tìm kiếm theo chiều sâu (DEPTH FIRST SEARCH)
a Ý tưởng
Tư tưởng của thuật toán có thể trình bày như sau: Trước hết, mọi đỉnh x
kề với S tất nhiên sẽ đến được từ S Với mỗi đỉnh x kề với S đ thì tất nhiên những đỉnh y kề với x cũng đến được từ S Điều đ gợi ý cho ta viết một thủ tục đệ quy DFS(u) mô tả việc duyệt từ đỉnh u bằng cách thông báo th m đỉnh
u và tiếp tục quá trình duyệt DFS(v) với v là một đỉnh chưa th m kề với u
- Để không một đỉnh nào bị liệt kê tới hai lần, ta sử dụng kỹ thuật đánh dấu, mỗi lần th m một đỉnh, ta đánh dấu đỉnh đ l i để các bước duyệt đệ quy kế tiếp không duyệt l i đỉnh đ nữa
- Để lưu l i đường đi từ đỉnh xuất phát S, trong thủ tục DFS(u), trước khi gọi đệ quy DFS(v) với v là một đỉnh kề với u mà chưa đánh dấu,
ta lưu l i vết đường đi từ u tới v bằng cách đặt TRACE[v] := u, tức
là TRACE[v] lưu l i đỉnh liền trước v trong đường đi từ S tới v Khi quá trình tìm kiếm theo chiều sâu kết thúc, đường đi từ S tới F sẽ là:
Trang 27begin
Trace[v] := u; {Lưu vết đường đi, đỉnh mà từ đ tới v là u}
DFS(v); {Gọi đệ quy duyệt tương tự đối với v}
< Nếu F chưa bị đánh dấu thì không thể c đường đi từ S tới F >;
< Nếu F đã bị đánh dấu thì truy theo vết để tìm đường đi từ S tới F >;
end
Ví dụ: Với đồ thị sau đây, đỉnh xuất phát S = 1: quá trình duyệt đệ quy có thể
vẽ trên cây tìm kiếm DFS sau (Mũi tên u→v chỉ thao tác đệ quy: DFS(u) gọi
Trang 281.3.2 Thuật toán tìm kiếm theo chiều rộng (BREADTH FIRST SEARCH)
Cơ sở của phương pháp cài đặt này là "lập lịch" duyệt các đỉnh Việc
th m một đỉnh sẽ lên lịch duyệt các đỉnh kề nó sao cho thứ tự duyệt là ưu tiên chiều rộng (đỉnh nào gần S hơn sẽ được duyệt trước) Ví dụ: Bắt đầu ta th m đỉnh S Việc th m đỉnh S sẽ phát sinh thứ tự duyệt những đỉnh (x1, x2, , xp)
kề với S (những đỉnh gần S nhất) Khi th m đỉnh x1 sẽ l i phát sinh yêu cầu duyệt những đỉnh (u1, u2 , uq) kề với x1 Nhưng rõ ràng các đỉnh u này
"xa" S hơn những đỉnh x nên chúng chỉ được duyệt khi tất cả những đỉnh x đã duyệt xong Tức là thứ tự duyệt đỉnh sau khi đã th m x1 sẽ là: (x2, x3 , xp, u1, u2, , uq)
Hình 13: Cây BFS
Giả sử ta c một danh sách chứa những đỉnh đang "chờ" th m T i mỗi bước, ta th m một đỉnh đầu danh sách và cho những đỉnh chưa "xếp hàng" kề với n xếp hàng thêm vào cuối danh sách Chính vì nguyên tắc đ nên danh sách chứa những đỉnh đang chờ sẽ được tổ chức dưới d ng hàng đợi (Queue)
Ta sẽ dựng giải thuật như sau:
Trang 29Bước 1: Khởi t o:
• Các đỉnh đều ở tr ng thái chưa đánh dấu, ngo i trừ đỉnh xuất phát S
là đã đánh dấu
• Một hàng đợi (Queue), ban đầu chỉ c một phần tử là S Hàng đợi
d ng để chứa các đỉnh sẽ được duyệt theo thứ tự ưu tiên chiều rộng
Bước 2: Lặp các bước sau đến khi hàng đợi rỗng:
• Lấy u khỏi hàng đợi, thông báo th m u (Bắt đầu việc duyệt đỉnh u)
• Xét tất cả những đỉnh v kề với u mà chưa được đánh dấu, với mỗi đỉnh v đ :
9
Trang 30Hàng đợi Đỉnh u
(lấy ra từ hàng đợi)
Hàng đợi (sau khi lấy u ra)
Để thứ tự các phần tử lấy ra khỏi hàng đợi, ta thấy trước hết là 1; sau đ
đến 2, 3; rồi mới tới 4, 5; cuối c ng là 6 Rõ ràng là đỉnh gần S hơn sẽ được
duyệt trước Và như vậy, ta c nhận xét: nếu kết hợp lưu vết tìm đường đi thì
đường đi từ S tới F sẽ là đường đi ngắn nhất (theo ngh a qua ít c nh nhất)
Trang 31CHƯƠNG 2 BÀI TO N T M BỘ GHÉP CỰC ĐẠI TRÊN ĐỒ THỊ
VÀ C C THUẬT TO N 2.1 ĐỒ THỊ HAI PHÍA
Phần này được tham khảo trong các tài liệu [1], [7], [10]
2.1.1 Định nghĩa
Một đơn đồ thị vô hướng G = (V, E) được gọi là đồ thị hai phía nếu tập các đỉnh V c thể phân thành hai tập con không rỗng, rời nhau X và Y sao cho mỗi c nh của đồ thị nối một đỉnh của X với một đỉnh của Y
Khi đ , người ta còn ký hiệu G là ( X Y, E) và gọi một tập (giả sử
là tập X) là tập c c đỉn tr và tập còn l i là tập c c đỉn p ả của đồ thị
hai phía G Các đỉnh thuộc X còn gọi là các X_đỉnh, các đỉnh thuộc Y gọi là các Y_đỉnh
Đồ thị hai phía Không phải đồ thị hai phía
Hình 15: Ví dụ về đồ t ị a p ía v k ôn p ả l đồ t ị a p ía
Để kiểm tra một đồ thị liên thông c phải là đồ thị hai phía hay không, ta
c thể áp dụng thuật toán sau:
Với một đỉnh v bất kỳ:
Trang 32
X := {v}; Y := ∅;
repeat
Y := Y ∪ Kề(X);
X := X ∪ Kề(Y);
until (X∩Y ≠ ∅) or (X và Y là tối đ i - không bổ sung được nữa);
if X∩Y ≠ ∅ then < Không phải đồ thị hai phía >
else <Đây là đồ thị hai phía, X là tập các đỉnh trái: các đỉnh đến được từ v qua một số chẵn c nh, Y là tập các đỉnh phải: các đỉnh đến được từ v qua một số
lẻ c nh>;
Đồ thị hai phía gặp rất nhiều mô hình trong thực tế Chẳng h n quan hệ hôn nhân giữa tập những người đàn ông và tập những người đàn bà, việc sinh viên chọn trường, thầy giáo chọn tiết d y trong thời khoá biểu, bài toán xếp lớp học theo học chế tín chỉ v.v
Tính chất
• một đồ thị là hai phía khi và chỉ khi n không chứa chu trình lẻ
• kích thước của phủ đỉnh nhỏ nhất bằng kích thước của cặp ghép lớn nhất
• kích thước của tập độc lập lớn nhất cộng kích thước của cặp ghép lớn nhất bằng số đỉnh
• trong đồ thị hai phía liên thông, kích thước của phủ c nh nhỏ nhất bằng kích thước tập độc lập lớn nhất
• trong đồ thị hai phía liên thông, kích thước của phủ c nh nhỏ nhất cộng kích thước của phủ đỉnh nhỏ nhất bằng số đỉnh
• một đồ thị là hai phía khi và chỉ khi c thể tô n bằng hai màu
Trang 332.1.2 Các bài toán trên đồ thị hai phía
Đồ thị hai phía thường được d ng để mô hình các bài toán ghép cặp (matching problem) Ví dụ như bài toán phân công công việc, giả sử ta c một
nh m người P và một tập công việc J, trong đ không phải ai cũng hợp với mọi công việc Ta c thể mô hình bài toán bằng một đồ thị với tập đỉnh là P +
J Nếu người pi c thể làm công việc ji, đồ thị sẽ c một c nh nối giữa pi và ji Định l hôn nhân cung cấp một đặc điểm của đồ thị hai phía: tồn t i cặp ghép hoàn hảo (perfect matching)
Đồ thị hai phía được sử dụng trong l thuyết mã h a (coding theory) hiện đ i, đặc biệt khi giải mã các codeword nhận được từ kênh Đồ thị nhân tử (factor graph) và đồ thị Tanner là các ví dụ
Đồ thị hai phía được ứng dụng rất nhiều trong thực tế Chính vì vậy
c rất nhiều bài toán trên đồ thị hai phía đã được phát biểu Một số các bài toán đ là :
- Bài toán ghép đôi không trọng
- Bài toán phân công
- Bài toán tìm bộ ghép cực đ i với tổng trọng số cực đ i hoặc cực tiểu trên đồ thị hai phía
- …
2.2 BÀI TO N T M BỘ GHÉP CỰC ĐẠI TRÊN ĐỒ THỊ HAI PHÍA
Phần này được tham khảo trong các tài liệu [6], [7]
2.2.1 Bài toán ghép đôi không trọng và các khái niệm
Cho một đồ thị hai phía G = ( X Y, E) ở đây X là tập các đỉnh trái và Y là tập các đỉnh phải của G, X = { x[l], x[2], , x[m] }, Y = { y[l], y[2 ],y[n ] } Một bộ ghép của G là tập hợp các c nh của G đôi một không c đỉnh chung
Trang 34Bài toán ghép đôi là tìm một bộ ghép lớn nhất (ngh a là c số c nh lớn nhất) của G
đỉnh nh t gọi là đường pha (alternating path), một đường đi từ một
x_đỉnh là đỉnh nh t tới một Y_đỉnh là đỉnh nh t gọi là đường mở
(augmenting path)
Một cách dễ hiểu, c thể quan niệm như sau:
• Một đường pha là một đường đi đơn trong G bắt đầu bằng một x_đỉnh
là đỉnh nh t, đi theo một c nh nh t sang Y rồi đến một c nh đậm về X, rồi l i đến một c nh nh t sang Y cứ xen kẽ nhau như vậy
• Một đường mở là một đường pha Bắt đầu từ một x_đỉnh là đỉnh nh t kết thúc bằng một Y_đỉnh là đỉnh nh t
Ví dụ: Với đồ thị hai phía trong hình 16 với bộ ghép M = {(x[l],y[1]), (x[2],
y[2])}
x[3] và y[3] là những đỉnh nh t, các đỉnh khác là đỉnh đậm
Đường (x[3], y[2], x[2], y[l]) là đường pha
Đường (x[3], y[2], x[2], y[l], x[l], y[3]) là đường mở
Trang 35Bước :
Tìm một đường mở
Bước 3:
Nếu bước 2 tìm được đường mở thì mở rộng bộ ghép M: Trên đường mở, lo i bỏ những c nh đã ghép (c nh đậm) khỏi M và thêm vào M những c nh chưa ghép (c nh nh t) Sau đ lặp l i bước 2
Nếu bước 2 không tìm được đường mở thì thuật toán kết thúc
Ví dụ: Như ví dụ trên, với bộ ghép hai c nh M = {(X1, Y1), (X2, Y2)}
Trang 362.2.3 Độ phức tạp của thuật toán
Vì đường mở bắt đầu từ một đỉnh chưa ghép thuộc tập X, đi theo một
c nh chưa ghép sang tập Y, rồi theo một c nh đã ghép về tập X,…cuối c ng
là c nh chưa ghép tới một đỉnh thuộc tập Y chưa ghép Nên ta thấy độ dài đường mở là lẻ và trên đường mở số c nh thuộc M ít hơn số c nh không thuộc M là 1 c nh Ta c thể sử dụng thuật toán tìm kiếm theo chiều rộng (BFS) để đường mở tìm được là đường đi ngắn nhất, giảm bớt công việc cho bước t ng cặp ghép Người ta đã chứng minh được chi phí thời gian thực hiện giải thuật này trong trường hợp xấu nhất sẽ là 0(n3) đối với đồ thị dày và 0(n(n+m)logn) đối với đồ thị thưa (trong đ n là số đỉnh và m là số c nh của
đồ thị)
2.3 BÀI TO N T M BỘ GHÉP CỰC ĐẠI VỚI TỔNG TRỌNG SỐ CỰC ĐẠI HOẶC CỰC TIỂU TRÊN ĐỒ THỊ HAI PHÍA
2.3.1 Bài toán phân công
Đây là một d ng bài toán phát biểu như sau: C m người (đánh số 1, 2, , m) và n công việc (đánh số 1, 2, , n), mỗi người c khả n ng thực hiện một
số công việc nào đ Để giao cho người i thực hiện công việc j cần một chi
Trang 37phí là c[i, j] ≥ 0 Cần phân cho mỗi thợ một việc và mỗi việc chỉ do một thợ thực hiện sao cho số công việc c thể thực hiện được là nhiều nhất và nếu c
≥ 2 phương án đều thực hiện được nhiều công việc nhất thì chỉ ra phương án chi phí ít nhất
Dựng đồ thị hai phía G = (X Y, E) với X là tập m người, Y là tập n việc và (u, v) E với trọng số c[u, v] nếu như người u làm được công việc v Bài toán đưa về tìm bộ ghép nhiều c nh nhất của G c trọng số nhỏ nhất
Gọi k = max(m, n) Bổ sung vào tập X và Y một số đỉnh giả để |X|=|Y|= k Gọi M là một số dương đủ lớn hơn chi phí của mọi phép phân công c thể Với mỗi cặp đỉnh (u, v): u X và v Y Nếu (u, v) ∉ E thì ta bổ sung c nh (u, v) vào E với trọng số là M
Khi đ ta được G là một đồ thị hai phía đầy đủ (Đồ thị hai phía mà giữa một đỉnh bất kỳ của X và một đỉnh bất kỳ của Y đều c c nh nối) Và nếu như ta tìm được bộ ghép đầy đủ k c nh mang trọng số nhỏ nhất thì ta chỉ cần lo i bỏ khỏi bộ ghép đ những c nh mang trọng số M vừa thêm vào thì sẽ được kế
ho ch phân công 1 người ↔ 1 việc cần tìm Điều này dễ hiểu bởi bộ ghép đầy
đủ mang trọng số nhỏ nhất tức là phải ít c nh trọng số M nhất, tức là số phép phân công là nhiều nhất, và tất nhiên trong số các phương án ghép ít c nh trọng số M nhất thì đây là phương án trọng số nhỏ nhất, tức là tổng chi phí trên các phép phân công là ít nhất
2.3.2 Thuật toán tìm cặp ghép với tổng trọng số trên các cạnh là lớn nhất hoặc nhỏ nhất
* Thuật toán tìm cặp ghép với tổng trọng số trên các c nh là lớn nhất:
Bước 1:
+ T o đồ thị hai phía (X là phía máy c M đỉnh, Y là phía người c N đỉnh)
Trang 38C cung (i,j) với trọng số C[i,j] nếu công nhân i làm việc trên máy j t o lợi nhuận C[ij]
+ T o nhãn ban đầu chấp nhận được Fx và Fy theo quy tắc:
Fx[i] = Max( C[i,j], Vj: 1 <= j <= M) Fy[j]=0,Vj: 1 < = j < = M
(FX, FY gọi là chấp nhận được nếu thoả mãn bất đẳng thức Fx[i] + Fy[j] >= C[ij])
Nếu Fx[i] + Fy[j] = C[i,j] thì ta coi c nh (i,j) là c nh đậm (là đã ghép máy i cho công nhân j), các c nh còn l i là c nh nh t Hai đầu c nh đậm là đỉnh đậm, các đỉnh còn l i là đỉnh nh t
Vậy bằng cách t o nhãn ban đầu như trên chúng ta c cặp ghép M ban đầu (ghép được một số máy với công nhân t o lợi nhuận trên các máy đ ) Bước 2:
Tìm dây chuyền (bằng logic hoặc đệ qui)
Nếu không c dây chuyền thì sửa nhãn
Ngược l i t ng cặp ghép trên dây chuyền này
C o đến k tìm được dâ c u ền;
End;
Trang 39Trong thuật toán trên phải thực hiện các thao tác: tìm dây chuyền, sửa nhãn và t ng cặp ghép
Sửa n ãn: Phải thực hên khi dây chuyền không kết thúc đƣợc bằng
đỉnh nh t bên Y mà kết thúc bằng đỉnh đậm bên X (ta gọi là dây chuyền ―dở dang‖) Trên các cung nối một đỉnh bên X đã n p vào dây chuyền tới các đỉnh j thuộc Y chƣa thuộc dây chuyền, chọn giá trị bé nhất trong các giá trị:
Fx[i] + Fy[j] – C[i,j]. Giá tri này đƣợc chọn làm lƣợng sửa nhãn (kí hiệu là m) Sửa nhãn theo cách nhƣ sau: Nhãn các đỉnh của X thuộc dây chuyền sẽ giảm đi một lƣợng là m, nhãn các đỉnh của Y thuộc dây chuyền sẽ t ng thêm một lƣợng là m, để đảm bảo Fx[i] + Fy[ị] – C[i,j] >= 0 Sau khi các đỉnh thuộc dây chuyền ―dở dang‖ đã đƣợc sửa nhãn thì n c khả n ng mới kết hợp với các đỉnh j bên Y t o nên một dây chuyền hoàn chỉnh (vì sẽ xuất hiện những cặp (i,j) mới mà Fx[i] + Fy[j] = C[i,j])
n cặp ép: Đổi màu các cung, bắt đầu từ cung nh t cuối c ng của
dây chuyền đổi ngƣợc dần về cung nh t đầu tiên của dây chuyền
ìm dâ c u ền: C thể tìm kiếm theo chiều sâu hoặc tìm kiếm theo
chiều rộng Yêu cầu dây chuyền xuất phát từ một đỉnh nh t của X, kết thúc bằng một đỉnh nh t của Y, đồng thời các cung nh t và đậm liên tiếp xen kẽ nhau (đo cung đầu và cung cuối đều nh t, nên số cung nh t lớn hơn số cung đậm là 1)
* Nếu là bài toán tìm tổng nhỏ nhất thì đổi dấu C[i,j] và cuối c ng đổi dấu tổng hoặc khởi trị C[i,j] = vô c ng, nhãn ban đầu i X: Fx[i] = Min { C[i,j] j Y}, Fy[j] = 0, j Y Lƣợng sửa nhãn m = Min { C[i,j] – Fx[i] – Fy[j] }
Trang 402.3.3 Thuật toán Hung-ga-ri
Hoặc không tìm thấy đường mở thì c thể xác định được
VisitedX = {Tập những X_đỉnh c thể đến được từ x* bằng một đường pha}
VisitedY = {Tập những Y_đỉnh c thể đến được từx* bằng một đường pha}
Gọi ∆ là trọng số nhỏ nhất của các c nh nối giữa một đỉnh thuộc VisitedX với một đỉnh không thuộc VisitedY Dễ thấy ∆> 0 bởi nếu ∆= 0 thì tồn t i một 0_c nh (x, y) với x∈VisitedX và y∉VisitedY Vì x* đến được x bằng một đường pha và (x, y) là một 0_c nh nên x* cũng đến được y bằng một đường pha, dẫn tới
y ∈VisitedY, điều này vô lý
Biến đổi đồ thị G như sau: Với ∀x ∈VisitedX, trừ ∆ vào trọng số những c nh liên thuộc với x, Với ∀y ∈VisitedY, cộng ∆ vào trọng
số những c nh liên thuộc với y
Lặp l i thủ tục tìm kiếm trên đồ thị thử tìm đường mở xuất phát ở