Các bài toán về đường đi, trong đó đồ thị Hamilton là nội dung quan trọng của Lý thuyết đồ thị.. Sử dụng lý thuyết đồ thị để giải bài toán người du lịch không chỉ là toán học thuần túy m
Trang 1MỤC LỤC LỜi mở đầu
3 Ứng dụng của bài toán người du lịch 12
Trang 2LỜI MỞ ĐẦU
Lý thuyết đồ thị là một ngành Toán học có vị trí đặc biệt quan trọng về mặt lý thuyết cũng như ứng dụng 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 liê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 Konigsberg nổi tiếng Các bài toán
về đường đi, trong đó đồ thị Hamilton là nội dung quan trọng của Lý thuyết đồ thị
Bài toán “Người du lịch” cũng là một vấn đề thú vị cho các nhà kinh doanh cũng như ứng dụng vào đời sống Sử dụng lý thuyết đồ thị để giải bài toán người du lịch không chỉ là toán học thuần túy mà còn mở ra cho chúng ta nhiều phạm trù ứng dụng phong phú Mối liên hệ giữa bài toán “Người du lịch” với đồ thị Hamilton và những ứng dụng của nó
là một vấn đề mở, thu hút bất kỳ ai quan tâm đến nội dung này Vì vậy, nhóm chúng tôi chọn đề tài: “Đường đi Hamilton và ứng dụng” để nghiên cứu
Mặc dù các thành viên trong nhóm đã có nhiều cố gắng nhưng trong quá trình thực hiện bài tiểu luận sẽ có nhiều thiếu sót, nhóm chúng tôi rất mong nhận được sự góp ý của thầy và các bạn
Chúng tôi xin chân thành cảm ơn sự giúp đỡ nhiệt tình của PGS TSKH Trần Quốc Chiến trong môn học vừa qua
Nhóm chúng tôi gồm 4 thành viên:
1 Trần Duy Hà (trưởng nhóm) Ứng dụng, tổng hợp và hoàn thiện
2 Lê Thị Thanh Lam Đại cương về đồ thị Hamilton và thuật toán
3 Nguyễn Thị Cẩm Hường Thiết kế cấu trúc dữ liệu và thuật toán
4 Nguyễn Thị Hoài Thanh Cài đặt chương trình thuật toán
Trang 3NỘI DUNG ĐỀ TÀI
1 Đồ thị Hamilton
1.1 Khái niệm đường đi, chu trình Hamilton
Cho đồ thị G = (V, E) có n đỉnh
a Chu trình (x 1 , x 2 , , x n , x 1 ) được gọi là chu trình Hamilton nếu x i ≠ x j với 1 ≤ i < j ≤ n
b Đường đi (x 1 , x 2 , , x n ) được gọi là đường đi Hamilton nếu x i ≠ x j với 1 ≤ i < j ≤ n
Chúng ta có thể phát biểu lại như sau:
+ Chu trình Hamilton là chu trình xuất phát từ 1 đỉnh, đi thăm tất cả những đỉnh còn lại mỗi đỉnh đúng một lần, cuối cùng quay trở lại với đỉnh xuất phát
+ Đường đi Hamilton là đường đi qua tất cả các đỉnh của đồ thị, mỗi đỉnh đúng một lần
Khác với khái niệm chu trình Euler và đường đi Euler, một chu trình Hamilton không phải là đường đi Hamilton bởi có đỉnh xuất phát được thăm tới 2 lần
Ví dụ: Xét 3 đơn đồ thị G1, G2, G3 sau:
Đồ thị G1 có chu trình Hamilton (a, b, c, d, e, a) G2 không có chu trình Hamilton vì deg(a) = 1 nhưng có đường đi Hamilton (a, b, c, d) G3 không có cả chu trình Hamilton lẫn đường đi Hamilton
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
Trang 4* Hệ quả:
Giả sử đồ thị n đỉnh G có đường đi Hamilton P Khi đó:
(i) Đồ thị G liên thông
(ii) Có ít nhất n – 2 đỉ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.
1.2.2 Điều kiện đủ
* Định lí 1: Đồ thị đủ Kn với n lẻ n ≥3 có n – ½ chu trình Hamilton từng đôi một
không giao nhau
* Đị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 d(v) ≥ (n-1)/2 với mọi đỉnh v
của G thì G có đường đi Hamilton
* Định lý 4 : Cho G là đồ thị đơn n đỉnh (n≥3) Giả sử u và v là 2 đỉ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) có chu trình Hamilton
* Định lý 5 : Cho G là đồ thị đơn giản n đỉnh Giả sử G’ và G’’ là 2 đồ thị thu được từ
G bằng cách qui nạp nối tất cả cá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 nghĩa trên ta có thể định nghĩa khái niệm bao đóng của đồ thị
* 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
* Định lý 6: Đồ thị G có chu trình Hamilton khi và chỉ khi bao đóng của G có chu
trình Hamilton
* Định lý 7: Nếu bao đóng C(G) = Kn (n ≥3) thì đồ thị G có chu trình Hamilton
* Định lý 8 ( Định lý Ore): Cho G là đơn đồ thị n đỉnh (n ≥3)
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
Trang 5* Định lý 9 : Cho G là đơn đồ thị n đỉnh (n ≥ 3) và m cạnh Nếu m ≥ C(n-1,2) + 2 thì
đồ thị G có chu trình Hamilton
* Định lý 10: Cho đồ thị G là đồ thị lưỡng phân với 2 tập đỉnh V1 và V2 sao cho
card(v1) = card(v2) = n ≥ 2
Nếu deg(v) > n/2 với mọi đỉnh v của G thì G có chu trình Hamilton.
* Định lý 11: Đồ thị Km,n có chu trình Hamilton khi và chỉ khi m = n.
* Định lý 12: Đồ thị Km,n có đường đi Hamilton khi và chỉ khi m n− =1.
1.2.1 Đồ thị có hướng:
* Định lý 13: (Đ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) ≥ 2n - 1, ∀ u, v ∈G không kề nhauthì 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 ∀v ∈Gthì G có chu trình có hướng Hamilton
Trang 6thì G có đường đi có hướng Hamilton.
c Nếu
deg0(u) + deg 1 (v) ≥ n – 1 ∀u, v ∈G không tồn tại cung từ u đến v
thì G có đường đi có hướng Hamilton
* Định lý 15: (Konig) Mọi đồ thị có hướng đủ đều có đường đi có hướng Hamilton.
* Định lý 16: Đồ thị có hướng đủ G = (V, E) gọi là bắc cầu nếu (u, v) và (v, w) ∈ E
suy ra (u, w) ∈ E.
Từ định nghĩa ta thấy ngay, một đồ thị có hướng đủ là bắc cầu khi và chỉ khi nó không
có chu trình có hướng độ dài 3
* Định lý 17: Đồ thị có hướng đủ bắc cầu khi và chỉ khi nó không có chu trình có
hướng
* Định lý 18: Đường đi Hamilton trong đồ thị có hướng đủ là duy nhất khi và chỉ khi
đồ thị bắc cầu
* Định lý 19: (Moon – Moser) Cho G = (V, E) là đồ thị có hướng đủ liên thông mạnh
bậc n (n ≥ 3) Khi đó với mọi đỉnh v và số nguyên p (3 ≤ p ≤ n) luôn tồn tại chu trình
có hướng sơ cấp độ dài p qua đỉnh v.
* Định lý 20: (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 72 Thuật toán nhánh cận giải bài toán người du lịch
2.1 Thuật toán nhánh 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ông chứa
phương án tối ưu
2.2 Bài toán Người du lịch:
Một người xuất phát từ một thành phố nào đó muốn tới thăm n−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ự li 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)
Gọi C = { cij : i,j = 1,2, ,n} là ma trận chi phí
Mỗi hành trình: v = v(1)→v(2)→ →v(n-1)→v(n)→v(1) có thể viết dưới dạng:
v = (v(1),v(2)), (v(2),v(3)), , (v(n-1),v(n)), (v(n),v(1))Trong đó, mỗi thành phần (v(i-1),v(i)) gọi là một cạnh của hành trình
Xét đồ thị đầy đủ G = (V,E), với V = {1, 2, , n}, có trọng số với trọng số cij= c(i,j) có thể khác cji = c(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, 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.
2.3 Cách giải
Xét bài toán người du lịch:
Gọi C = { cij : i,j = 1,2, ,n} là ma trận chi phí
Mỗi hành trình: v = v(1)→v(2)→ →v(n-1)→v(n)→v(1) có thể viết dưới dạng:
v = (v(1),v(2)), (v(2),v(3)), , (v(n-1),v(n)), (v(n),v(1))Trong đó, mỗi thành phần (v(i-1),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ành trì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ọi việ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 minh họa bởi
Trang 8cây tìm kiếm:
Việc phân nhánh sẽ được dựa trên qui tắc hợp lý nào đó cho phép rút ngắn quá trình tìm kiếm phương án tối ưu Sau khi phân nhánh sẽ tính cận dưới của hàm mụ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ủa bài toán người du lịch Sau đó 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 Kỹ thuật tính cận dưới dựa trên thủ tục rút gọn dưới đây.
2.3.1 Thủ tục rút gọn
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 trừ bớt mỗi phần tử của một dò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ột lượ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ác phầ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à ma trậ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 ;
Trang 9- 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 hành trình con :
Trang 10(i) Khởi tạo : α := - ∞;
(ii) Với mỗi cặp (i,j) thoả cij = 0 (i=1, ,k; j=1, ,k) thực hiện
Trang 11 Hàm này thử chọn cho x[i] tất cả các giá trị nó có thể nhận
<Ghi nhận việc thử x[i] = V nếu cần>;
Try(i + 1); {Gọi đệ quy, chọn tiếp x[i+1]}
<Bỏ ghi nhận việc thử cho x[i] = V (nếu cần)>;
}end;
Trang 123 Ứng dụng của bài toán Người du lịch
Bài toán Người du lịch chỉ là mô hình tiêu biểu của ứng dụng chu trình Hamilton Từ mô hình này, ta sẽ thấy rất nhiều ứng dụng trong thực tế Tuy nhiên trong đề tài này, chúng tôi chỉ nêu một vài ứng dụng tiêu biểu đó là bài toán kinh tế và quản lý dữ liệu
Bài toán kinh tế:
Giả sử một công ty A muốn mở rộng các đại lý tiêu thụ sản phẩm Vị trí các cửa hàng như hình vẽ Để vận chuyển hàng hóa từ kho (vị trí 1) đến các cửa hàng (các vị trí còn lại), người quản lý phải tính toán sao cho quá trình vận chuyển qua mỗi cửa hàng chỉ đi đúng một lần với chi phí thấp nhất hoặc quãng đường đi ngắn nhất Để giải quyết vấn đề này,
rõ ràng phải sử dụng giải thuật của bài toán Người du lịch đã nêu trên
Qua hai ví dụ trên, ta có thể thấy những ứng dụng của Đồ thị Hamilton và bài toán Người
du lịch là rất phong phú và phổ biến trong cuộc sống hàng ngày Chẳng hạn ví dụ của bài toán trên có thể mở rộng cho bất kỳ lĩnh vực khác như:
- Xe cứu thương ở vị trí 1, bệnh nhân ở vị trí 3 Vậy phải tìm đường đi từ 1 đến 3 rồi trở về 1 như thế nào để đảm bảo thời gian đi là ít nhất
Trang 13- Nhà máy nước của một thành phố đặt ở vị trí 1, các hộ gia đình ở các vị trí còn lại Vậy phải lắp đặt hệ thống ống nước tới các hộ gia đình sao cho chi phí bỏ
ra là thấp nhất
4 Cài đặt chương trình và minh họa kết quả
4.1 Cấu trúc dữ liệu và giải thuật
4.1.1 Đầu vào, đầu ra
Input: file văn bản TRAVEL.INP
• Dòng 1: Chứa số thành phố n (1 ≤ n ≤ 100) và số tuyến đường m trong mạng lưới giao thông
• m dòng tiếp theo, mỗi dòng ghi số hiệu hai thành phố có đường đi trực tiếp và chi phí đi trên quãng đường đó (chi phí này là số nguyên dương ≤ 10000)
Output: file văn bản TRAVEL.OUT, ghi hành trình tìm được
4.1.2 Cấu trúc dữ liệu
Sử dụng ma trận C[size][size] để biểu diễn ma trận chi phí
Sử dụng ma trận X[size+1] để thử các khả năng, ma trận bestWay[size+1] để ghi nhận nghiệm
Sử dụng ma trận T[size+1] để lưu chi phí từ X1 đến Xi
Sử dụng ma trận Free[size] để đánh dấu, Freei=TRUE nếu chưa đi qua thành phần i
Biến N, M tương ứng số đỉnh (thành phố) sẽ đi qua, và số cạnh (đường đi) giữa các đỉnh
Trang 14Biến minSpending lưu giữ chi phí hành trình tối ưu.
4.1.3 Giải thuật
• Bước 1: Kiểm tra file dữ liệu đầu “TRAVEL.INP” vào nếu phù hợp chuyển sang
bước 2, ngược lại đưa ra màn hình thông báo lỗi
• Bước 2: Khởi tạo giá trị đầu (hàm khoiTao()),
Free[i] = TRUE, với i = 1 > n
Gán Free[1] = FALSE, các thành phố chưa đi qua, ngoại trừ thành phố 1
X[1] = 1, xuất phát từ thành phố 1
T[1] = 0, chi phí tại thành phố xuất phát là 0
minSpending = maxC, chi phí hành trình là lớn nhất (+∞)
• Bước 3: Thử các cách chọn Xi (hàm backTrack(int i), sử dụng giải thuật quay lui
để tìm thành phố có minSpending nhỏ nhất) Hàm được thiết kế như sau:
X[i] = j;
//Chi phí = Chi phí bước trước + Chi phí đường đi trực tiếp
T[i] = T[i-1] + C[X[i-1]][j];
//Hiển nhiên, nếu có điều này thì C[X[i-1]][j] < +∞ rồi
if (T[i] < minSpending) {//Nếu chưa đến được X[N]
if (i < N) {//Đánh dấu thành phố vừa thử, FREE[j] = 0
Trang 15}//Từ X[N] quay lại 1 vẫn tốn chi phí ít hơn trước
else if (T[N] + C[X[N]][1] < minSpending){//Cập nhật BestConfig
for (int var=1; var<=N; var++)
bestWay[var] = X[var];
minSpending = T[N] + C[X[N]][1];
• Bước 4: Xuất kết quả, sử dụng hàm xuatKQ()
Kết quả chương trình được lưu trong file “TRAVEL.OUT”
Trang 17F << "HAMILTON CYCLE IS: ";
for (int i=1; i<=N; i++)
for (int var=1; var<=N; var++)
bestWay[var] = X[var];
minSpending = T[N] + C[X[N]][1];
}} }
}
Trang 184.3 Minh họa kết quả
4.3.1 Dữ liệu đầu vào
Đồ thị G, minh họa các thành phố và chi phí tương ứng giữa các thành phố tương ứng
Dữ liệu đầu vào được lưu trong file “TRAVEL.INP”
Dữ liệu đầu vào với file dữ liệu “TRAVEL.INP”
2
3 4
1
41
2
Trang 19Dữ liệu đầu vào với file dữ liệu “TRAVEL1.INP”
4.1.4 Kết quả đầu ra
Kết quả chương trình được lưu ở file “TRAVEL.OUT”
Kết quả đầu ra của dữ liệu “TRAVEL.INP” lưu trên file “TRAVEL.OUT”
Kết quả đầu ra của dữ liệu “TRAVEL1.INP” lưu trên file “TRAVEL.OUT
Trang 20KẾT LUẬN
Qua nghiên cứu về chu trình Hamilton và những ứng dụng của nó thông qua bài toán Người du lịch, nhóm chúng tôi chỉ đề cập được một phần nhỏ trong các ứng dụng của nó Các vị dụ trong đề tài, chúng tôi chỉ nêu ở dạng mô hình đơn giản, số đỉnh đưa ra còn rất nhỏ Qua tìm hiểu, người ta bắt đầu thử và công bố các kết quả giải bài toán này trên máy tính với số đỉnh lớn hơn rất nhiều Từ năm 1954 (49 đỉnh), cho đến năm 2004 bài toán giải được với số đỉnh lên tới 24.978, và dự báo sẽ còn tiếp tục tăng cao nữa
Đây là một bài toán khó trong tin học, với độ phức tạp thuật toán cao, đòi hỏi cần nhiều thời gian nghiên cứu, do đó trong khuôn khổ của đề tài này, nhóm chúng tôi chỉ tổ chức xây dựng giải thuật và những ứng dụng của mô hình này trên thực tế Việc chạy chương trình ở cuối đề tài chỉ mang tính minh họa cho bài toán Người du lịch được viết bằng ngôn ngữ lập trình C++
Mặc dù đã có nhiều cố gắng nhưng kết quả của đề tài còn mang tính tương đối, tuy vậy đề tài cũng đáp ứng được yêu cầu đề ra ban đầu Dựa trên cơ sở nhóm đã tìm hiểu và thực hiện chương trình này có thể được mở rộng cho việc kiểm tra với các bộ dữ liệu lớn hơn Nhóm nghiên cứu nghĩ rằng những kiến thức thu được sẽ là hành trang và sẽ giúp ích rất nhiều cho mỗi thành viên trong quá trình phát triển về sau