Trình bày thuật toán nhánh cận giải bài toán người du lịch.. - Trình bày thuật toán nhánh cận giải bài toán người du lịch.. - Trình bày thuật toán nhánh cận giải bài toán người du lịch..
Trang 1MỤC LỤC
LỜI MỞ ĐẦU 1
PHẦN 1: LÝ THUYẾT 3
1 Đường đi, chu trình Hamilton 3
1.1.1 Định nghĩa 3
1.1.2 Điều kiện cần 3
1.1.3 Điều kiện đủ 6
2 Thuật toán nhánh cận giải bài toán người du lịch 9
2.1.1 Giới thiệu bài toán 9
2.1.2 Phương pháp nhánh và cận 9
2.1.3 Cơ sở lý luận của phép toán 10
2.1.4 Ma trận rút gọn 10
2.1.5 Phân nhánh 10
2.1.6 Thủ tục chọn cạnh phân nhánh 11
2.1.7 Chọn 2 cạnh cuối cùng 11
PHẦN 2: THIẾT KẾ CẤU TRÚC DỮ LIỆU VÀ CÀI ĐẶT THUẬT TOÁN 12
1 Thiết kế CTDL 12
2 Thuật toán 12
2.1.1 Hàm rút gọn 12
2.1.2 Thủ tục phân nhánh 14
2.1.3 Thủ tục chọn cạnh phân nhánh 15
PHẦN 3: CHƯƠNG TRÌNH 23
TÀI LIỆU THAM KHẢO 28
Trang 2LỜI MỞ ĐẦU
Trên thực tế có nhiều bài toán liên quan tới một tập các đối tượng và những mối lên hệ giữa chúng, đòi hỏi toán học phải đặt ra một mô hình biểu diễn một cách chặt chẽ và tổng quát bằng ngôn ngữ ký hiệu, đó là đồ thị Những ý tưởng cơ bản của nó được đưa ra từ thế kỷ thứ XVIII bởi nhà toán học Thụy Sỹ Leonhard Euler, ông đã dùng mô hình đồ thị để giải bài toán về những cây cầu Konisberg nổi tiếng.
Ngày nay 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 hóa, kinh tế học, Chẳng hạn như trả lời câu hỏi: hai máy tính trong mạng có thể liên hệ được với nhau hay không? hay vấn đề phân biệt hai hợp chất hóa học có cùng công thức phân tử nhưng lại khác nhau
về công thức cấu tạo cũng được giải quyết nhờ mô hình đồ thị Hiện nay, môn học này cũng như môn học Lý thuyết đồ thị là một trong những kiến thức cơ sở của bộ môn khoa học máy tính.
Trong quá trình xây dựng đề tài chắc chắn sẽ có nhiều thiếu sót, nhóm 9 rất mong nhận được sự góp ý của thầy và các bạn Qua đây, nhóm 9 xin chân thành cảm
ơn sự giúp đỡ nhiệt tình của Thầy, PGS TS Trần Quốc Chiến trong môn học vừa qua.
Trang 3ĐỀ TÀI 6 ĐƯỜNG ĐI HAMILTON & BÀI TOÁN NGƯỜI DU LỊCH
1 Trình bày khái niệm đường đi, chu trình Hamilton
2 Trình bày thuật toán nhánh cận giải bài toán người du lịch
3 Thiết kế cấu trúc dữ liệu và giải thuật nhánh cận
4 Viết chương trình cài đặt thuật toán nhánh cận giải bài toán người du lịch
File dữ liệu đầu vào: GRAPH.INP có cấu trúc
File dữ liệu đầu ra: TRAVEL.OUT có cấu trúc
- Trường hợp không tồn tại chu trình Hamilton:
NO HAMILTON CYCLE
- Trường hợp tồn tại chu trình Hamilton:
OPTIMAL COST: C (chi phí tối ưu)
OPTIMAL CYCLE: (hành trình tối ưu)
Trang 41 Đỗ Trường Linh
- Thiết kế cấu trúc dữ liệu và giải thuật nhánh cận
- Viết chương trình cài đặt thuật toán nhánh cận giải bài toán người du lịch
3 Phí Thị Lệ Tho
- Trình bày khái niệm đường
đi, chu trình Hamilton
- Trình bày thuật toán nhánh cận giải bài toán người du lịch
4 Nguyễn Hải Minh
- Trình bày khái niệm đường
đi, chu trình Hamilton
- Trình bày thuật toán nhánh cận giải bài toán người du lịch
Trang 5PHẦN 1: LÝ THUYẾT
1 Đường đi, chu trình Hamilton
1.1.1 Định nghĩa
Cho đồ thị (có hướng) G=(V,E)
Chu trình (có hướng) Hamilton là chu trình (có hướng) sơ cấp qua mọi đỉnh đồ thị Đường đi (có hướng) Hamilton là đường đi (có hướng) sơ cấp qua mọi đỉnh đồ thị.
Như vậy mọi chu trình Hamilton có độ dài bằng số đỉnh, và mọi đường điHamilton có độ dài bằng số đỉnh trừ 1
Đồ thị chứa chu trình (có hướng) Hamilton gọi là đồ thị Hamilton.
Định lí: Giả sử đồ thị G có chu trình Hamilton C Khi đó
(i) Đồ thị G liên thông
(ii) Mọi đỉnh của G có bậc lớn hơn hoặc bằng 2, và có đúng hai cạnh liên thuộcthuộc chu trình C
(iii) Nếu xóa đi k đỉnh bất kỳ cùng các cạnh liên thuộc chúng, thì đồ thị còn lại
sẽ có tối đa k thành phần liên thông.
Giả sử đồ thị n đỉnh G có đường đi Hamilton P Khi đó
(i) Đồ thị G liên thông
(ii) Có ít nhất n2 đỉnh bậc 2, và mỗi đỉnh có đúng hai cạnh liên thuộc thuộc
đường đi P
(iii) Nếu xóa đi k đỉnh bất kỳ cùng các cạnh liên thuộc chúng, thì đồ thị còn lại
sẽ có tối đa k +1 thành phần liên thông.
Trang 6Ví dụ 1 Xét đồ thị
Hình 2
Đồ thị không có chu trình Hamilton
Thật vậy, nếu tồn tại chu trình Hamilton C thì nó phải có 5 cạnh Vì bậcdeg(v2) = deg(v4) = 3 nên phải một cạnh tới v2 và một cạnh tới v4 không thuộc chutrình C Số cạnh còn lại là 4 nên C không thể có 5 cạnh được, mâu thuẫn
Ta cũng có thể áp dụng trực tiếp Định lý 2.4.1 Nếu bỏ đi 2 đỉnh v2 và v4 cùngcác cạnh liên thuộc chúng thì đồ thị còn lại là 3 đỉnh độc lập, có 3 thành phần liênthông Như vậy theo mệnh đề (iii) của Định lý 2.4.1 thì đồ thị không có chu trìnhHamilton
Ví dụ 2 Chứng minh rằng đồ thị sau không có đường đi Hamilton.
k =
7 1
i
i E card
Vì số cạnh liên thuộc 1 đỉnh nằm trên đường đi P nhiều nhất là 2 nên mỗi tập
E1, E2, E3, E7 có ít nhất 1 cạnh và mỗi tập E4, E5, E6 có ít nhất 3 cạnh Vì vậy
Trang 7k 4*1 + 3*3 =13.
mâu thuẫn với (**)
- Cách 2 Xét 9 đỉnh còn lại Đây là các đỉnh không kề nhau từng cặp một, trong
đó có ít nhất 7 đỉnh có 2 cạnh liên thuộc P và 2 đỉnh còn lại có ít nhất 1 cạnh liênthuộc P Như vậy số cạnh P ít nhất là 7*2+2 = 16, mâu thuẫn với (*)
- Cách 3 Xoá 7 đỉnh 1, 2, 3, 4, 5, 6, 7 và các cạnh liên thuộc thì đồ thị còn lại
có 9 đỉnh cô lập, tức 9 thành phần liên thông Theo hệ quả 2.4.2 (iii), đồ thị không cóđường đi Hamilton
Ví dụ 3 (Bài toán xếp chỗ ngồi) 9 người bạn cùng ngồi ăn trong bàn tròn 4 lần Mỗi
lần họ được xếp ngồi theo một thứ tự Hãy thay đổi chỗ ngồi mỗi lần sao cho không có
2 người ngồi gần nhau hơn 1 lần
Ta lập đồ thị 9 đỉnh 1,2, ,9, đỉnh i chỉ người i Ta đặt đỉnh 1 tại tâm và các đỉnhcòn lại trên đường tròn như hình vẽ Mỗi cách xếp là một chu trình Hamilton của đồthị
Trang 8Hình 6
1573928461
Hình 7
1795836241
1.1.3 Điều kiện đủ
Định lý 1 Đồ thị đủ Kn với n lẻ (n 3) có (n1)/2 chu trình Hamilton từng đôi
một không giao nhau (tức là không có cạnh chung)
Chứng minh
Tương tự như lời giải bài toán xếp 9 người trên bàn tròn, ta xây dựng cách xếptheo chu trình Hamilton trên đồ thị sau (n=2k+1):
123 2k2k+11
Hình 8
Trang 9Xoay chu trình lần lượt một góc /k theo chiều kim đồng hồ ta nhận được kcách xếp.
Định lý 2 (Dirac): Cho G là đơn đồ thị n đỉnh (n 3) Nếu bậc deg(v) n/2 với
mọi đỉnh v của G, thì G có chu trình Hamilton.
Định lý 3: Cho G là đồ thị đơn n đỉnh (n 3) Nếu bậc deg(v) (n1)/2 với mọi đỉnh
v của G thì G có đường đi Hamilton
Chứng minh
Nếu n = 1 thì G có đường Hamilton tầm thường là 1 đỉnh
Giả sử n > 1 Ta lập đồ thị H bằng cách thêm vào G đỉnh v và tất cả các cạnh nối vvới mọi đỉnh của G Đồ thị H có n + 1 đỉnh và deg(v) = n Với mọi đỉnh uG ta có:
degH(u) = degG(u) + 1 (n1)/2 + 1 = (n+1)/2
Theo định lý Dirac thì H có chu trình Hamilton C Bỏ đi v và các cạnh tới v tađược đường đi Hamilton trong G
Định lý 4: Cho G là đồ thị đơn n đỉnh (n 3) Giả sử u và v là hai đỉnh không kề
nhau của G sao cho:
deg(u) + deg(v) n
Khi đó G có chu trình Hamilton khi và chỉ khi đồ thị G+(u,v) (đồ thị G thêm cạnh(u,v)) có chu trình Hamilton
Định lý 5: Cho G là đồ thị đơn giản n đỉnh Giả sử G’ và G” là hai đồ thị thu được
từ G bằng quy nạp nối tất cả cặp đỉnh không kề nhau có tổng các bậc ít nhất bằng n.Khi đó ta có G’ = G”
Từ định lý trên ta có thể định nghĩa khái niệm bao đóng của đồ thị.
Định nghĩa 6: Bao đóng C(G) của đồ thị G n đỉnh là đồ thị thu được từ G bằng cách,
theo quy nạp, nối tất cả các cặp đỉnh không kề nhau mà tổng số bậc ít nhất bằng n cho
đến khi không còn cặp đỉnh nào như vậy nữa
Ví dụ 2.4.5 Minh hoạ cách xây dựng bao đóng.
Hình 9
Định lý 7: Đồ thị G có chu trình Hamilton khi và chỉ khi bao đóng của G có chu trình
Hamilton
Định lý 8: Nếu bao đóng C(G) = Kn (n3) thì đồ thị G có chu trình Hamilton
Định lý 9 (Định lý Ore): Cho G là đơn đồ thị n đỉnh (n3) Nếu deg(u)+deg(v)n
với mọi cặp đỉnh không kề nhau thì đồ thị G có chu trình Hamilton
Định lý 10: Cho G là đơn đồ thị n đỉnh (n3) và m cạnh Nếu m C(n1,2)+2 thì
đồ thị G có chu trình Hamilton
Trang 10Định lý 11: Cho đồ thị đơn G là đồ thị lưỡng phân với hai tập đỉnh V1 và V2 saocho:
card(V1) = card(V2) = n 2Nếu bậc deg(v) > n/2 với mọi đỉnh v của G, thì G có chu trình Hamilton
Đồ thị có hướng.
Cho đồ thị có hướng G với n đỉnh Ta có các kết quả phát biểu trong các định
lý sau
Định lý 12: (điều kiện đủ tồn tại chu trình có hướng Hamilton)
a (Meyniel) Nếu đồ thị G liên thông mạnh và
deg(u) + deg(v) 2n1 u, vG không kề nhau
thì G có chu trình có hướng Hamilton
b (Ghoula-Houri) Nếu đồ thị G liên thông mạnh và
deg(v) n vG
thì G có chu trình có hướng Hamilton
c (Woodall) Nếu
degO(u) + degI(v) n u, vG không tồn tại cung từ u đến v
thì G có chu trình có hướng Hamilton
deg(u) + deg(v) 2n3 u, vG không kề nhau
thì G có đường đi có hướng Hamilton.
b Nếu
deg(v) n 1 vG
thì G có đường đi có hướng Hamilton.
c Nếu
degO(u) + degI(v) n 1 u, vG không tồn tại cung từ u đến v
thì G có đường đi có hướng Hamilton.
d Nếu
degI(v) n/2 & degO(v) n/2 vG
thì G có đường đi có hướng Hamilton.
Bây giờ chúng ta sẽ nghiên cứu đường đi và chu trình có hướng Hamilton trong
đồ thị có hướng đủ (có đồ thị lót đủ) Trước hết là định lý khẳng định sự tồn tại đường
đi có hướng Hamilton trong đồ thị có hướng đủ
Định lý 14 (Konig) Mọi đồ thị có hướng đủ đều có đường đi có hướng Hamilton Định lý 15 (Camion) Đồ thị có hướng đủ có chu trình có hướng Hamilton khi và chỉ
khi nó liên thông mạnh
Trang 112 Thuật toán nhánh cận giải bài toán người du lịch
2.1.1 Giới thiệu bài toán
Một người xuất phát từ một thành phố nào đó muốn tới thăm n1 1 thành phố khác, mỗi thành phố đúng một lần, rồi quay về thành phố ban đầu Hỏi nên đi theo trình tự nào để độ dài tổng cộng các đoạn đường đi qua là ngắn nhất (khoảng cách giữa hai thành phố có thể hiểu là cự ly thông thường hoặc thời gian cần đi hoặc chi phí của hành trình, và xem như cho trước)
Xét đồ thị đầy đủ G=(V,E), với V={1, 2, ., n}, có trọng số với trọng số mij= m(i,j) có thể khác mji = m(j,i) Như vậy, ta có thể xem G như là một đồ thị có hướng đầy đủ “mạnh” theo nghĩa với mọi i, j=1, 2, ., n, i j, j, luôn có (i,j), (j,i)E Bài toán trở thành tìm chu trình Hamilton có độ dài ngắn nhất trong G.Bài toán nổi tiếng này đã có lời giải bằng cách sử dụng phương pháp “nhánh vàcận”
2.1.2 Phương pháp nhánh và cận
Thuật toán nhánh cận là một trong các phương pháp chủ yếu giải bài toán tối ưu
tổ hợp Tư tưởng cơ bản của nó là trong quá trình tìm kiếm ta phân hoạch các phương
án của bài toán ra thành hai hay nhiều tập con như là các nút của cây tìm kiếm và cốgắng đánh giá cận cho các nút, loại bỏ những nhánh mà ta biết chắc chắn là khôngchứa phương án tối ưu
Xét bài toán người du lịch Gọi
C = { c ij : i, j = 1,2, ,n}
là ma trận chi phí Mỗi hành trình
v = v(1)v(2) v(n1)v(n)v(1)có thể viết dưới dạng
v = (v(1),v(2)), (v(2),v(3)), , (v(n1),v(n)), (v(n),v(1))trong đó mỗi thành phần (v(i1),v(i)) gọi là một cạnh của hành trình
Trong bài toán người du lịch khi tiến hành tìm kiếm lời giải ta sẽ phân tập hànhtrình thành hai tập con: Một tập chứa cạnh (i,j) và tập không chứa cạnh này Ta gọiviệc đó là phân nhánh, mỗi tập con nói trên gọi là nhánh Việc phân nhánh được minhhoạ bởi cây tìm kiếm:
Tập tất cả hành trình
Các hành trình qua (i,j) Các hành trình không qua (i,j)
Việc phân nhánh sẽ được dựa trên qui tắc hợp lý nào đó cho phép ta rút ngắnquá trình tìm kiếm phương án tối ưu Sau khi phân nhánh ta sẽ tính cận dưới của hàmmục tiêu trong mỗi tập con nói trên Việc tìm kiếm sẽ tìm trên tập con có cận dưới nhỏhơn Thủ tục sẽ tiếp tục cho đến khi thu được hành trình đầy đủ, tức là phương án củabài toán người du lịch Sau đó ta chỉ cần xét những tập con có cận dưới nhỏ hơn giá trịhàm mục tiêu tìm được
Trang 122.1.3 Cơ sở lý luận của phép toán
Nếu không xác định thành phố xuất phát thì có n! hành trình, mỗi hành trình ứng với một hoán vị nào đó của tập {1, 2, , n} Còn nếu cho trước thành phố xuất phát thì có tất cả là (n1)! hành trình.1
Giả sử h=((1), (2), , (n), (1)) ( là một hoán vị) là một hành trình qua các thành phố (1), , (n) theo thứ tự đó rồi quay về (1) thì hàm mục tiêu
f(h) = m (1) (2) L m (n1 1) (n) m (n) (1) mij , (i, j )h
sẽ biểu thị tổng độ dài đã đi theo hành trình h, trong đó (i,j) ký hiệu một chặngđường của hành trình, tức là một cặp thành phố kề nhau theo hành trình h
2.1.4 Ma trận rút gọn
Rõ ràng tổng chi phí của một hành trình sẽ chứa đúng một phần tử trên mỗi dòng
và mỗi cột của ma trận chi phí C = (cij) Do đó nếu ta trừ bớt mỗi phần tử của mộtdòng (hay một cột) đi cùng một giá trị thì chi phí của tất cả hành trình sẽ giảm đi mộtlượng, vì thế hành trình tối ưu sẽ không thay đổi Vì vậy nếu tiến hành trừ bớt cácphần tử của mỗi dòng và mỗi cột đi một hằng số sao cho thu được ma trận không âm
và mỗi cột cũng như mỗi dòng chứa ít nhất một số 0 , thì tổng các hằng số trừ đi đó sẽcho ta cận dưới của mọi hành trình Thủ tục trừ bớt này gọi là thủ tục rút gọn, các hằng
số trừ ở mỗi dòng (cột) gọi là hằng số rút gọn dòng (cột), ma trận thu được gọi là matrận rút gọn
Thủ tục rút gọn:
Đầu vào : Ma trận chi phí C = (cij)
Đầu ra : Ma trận rút gọn và tổng hằng số rút gọn Sum
Thuật toán:
(i) Khởi tạo :
Sum := 0 ; (chỉ áp dụng cho ma trận chi phí ban đầu)
- Giảm cấp ma trận chi phí C bằng cách loại dòng r và cột s
- Ngăn cấm tạo chu trình con :
Cấm cạnh (s,r) bằng cách đặt csr =
Nếu (r,s) là cạnh phân nhánh thứ hai trở đi thì phải xét các cạnh đã chọn nối trước và sau cạnh (r,s) thành dãy nối tiếp các cạnh như hình sau
Trang 13
và cấm tất cả các cạnh dạng (h,i) bằng cách đặt chi =
Rút gọn ma trận chi phí ta có cận dưới := + (tổng hằng số rút gọn)
Ta có thể tiếp tục thủ tục phân nhánh theo nhánh này với ma trận chi phí đãđược hiệu chỉnh và giảm 1 bậc Việc chọn cạnh nào để phân nhánh ta sẽ bàn ở mụctiếp theo
2.1.6 Thủ tục chọn cạnh phân nhánh
Một cách lôgic là ta chọn cạnh phân nhánh (r,s) sao cho cận dưới của nhánhkhông chứa (r,s) sẽ tăng nhiều nhất
Thủ tục chọn cạnh phân nhánh (r,s)
Đầu vào : Ma trận rút gọn bậc k
Đầu ra : Cạnh phân nhánh (r,s)
Thuật toán :
(i) Khởi tạo : := ;
(ii) Với mỗi cặp (i,j) thoả c ij = 0 (i=1, ,k; j=1, ,k) thực hiện
- Xác định
minr = min{cih : h j }mins = min{chj : h i }
- Nếu < minr + mins , đặt
:= minr + mins; r := i; s := j;
2.1.7 Chọn 2 cạnh cuối cùng
Mỗi hành trình có n cạnh Sau khi đã chọn n2 cạnh, ta phải chọn nốt 2 cạnh còn
lại Lúc này ma trận rút gọn có bậc 2 và là một trong hai dạng sau
cùng cận dưới
Trong trường hợp (i) ta chọn hai cạnh (p,u) và (q,v), còn trong trường hợp (ii)
ta chọn hai cạnh (p,v) và (q,u) Tổng chi phí là
Trang 14PHẦN 2: THIẾT KẾ CẤU TRÚC DỮ LIỆU VÀ CÀI ĐẶT THUẬT TOÁN
1 Thiết kế CTDL
Để giải quyết các vấn đề của đồ thị bằng máy tính chúng ta cần lưu giữ đồ thị trong bộ nhớ của máy tính Do đó chúng ta cần đưa ra các phương pháp biểu diễn đồ thị bởi các cấu trúc dữ liệu Có nhiều phương pháp biểu diễn đồ thị: biểu diễn đồ thị bằng ma trận kề, ma trận liên thuộc, danh sách cạnh(cung) và danh sách kề
Trong đề tài này đồ thị được lưu trữ bởi ma trận vuông COST[n][n], với n là số
đỉnh của đồ thị và COST[I][J] là chi phí đi từ đỉnh i đến đỉnh j
20
15
51
55
201
0 20
2
Trang 15- Trừ tất cả các phần tử trên cột đi một lượng .
Trừ bớt các phần tử dòng 1, 2, 3, 4, 5, 6 đi các hằng số rút gọn tương ứng trên cột ta được ma trận