Giải bài toán người đưa thư tương đương với bài toán tìm chu trình ngắn nhất đi qua tất cả các cạnh của một đồ thị cho trước.. Nhắc lại: Trong lý thuyết đồ thị, một đường đi Hamilton là
Trang 1Giảng v
Học viên
Mã số: C
TRƯỜ
BÀI YMBO
Đề t
iên: PGS
n: Đào Th
CH110111
ỜNG ĐẠI ĐẠI HỌ
THU OLIC V
ài: Bài
.TS Đỗ V
hị Phấn
18
TPH
HỌC CÔN
ỌC QUỐC
HOẠC
VÀ TR
i toán
ăn Nhơn
HCM, Thá
NG NGHỆ
C GIA TP
CH MÔ
RÍ TUỆ
người
áng 02/20
Ệ THÔNG HCM
ÔN H
Ệ NHÂ
i đưa t
13
G TIN
ỌC
ÂN TẠ
thư
ẠO
Trang 2Lời nói đầu
Tiểu luận này nhằm trình bày bài toán người đưa thư, đồng thời trình bày cấu trúc dữ liệu sử dụng cũng như các thuật toán nhằm giải quyết vấn đề bài toán Tiểu luận cũng nêu lên kết quả chạy thử cho bài toán với dữ liệu thử tương đối nhỏ
Em xin chân thành cảm ơn PGS.TS Đỗ Văn Nhơn – Giảng viên môn học
“Symbolic và trí tuệ nhân tạo” đã truyền đạt cho em những kiến thức vô cùng quý báu Em cũng xin chân thành cảm ơn quý Thầy Cô thuộc phòng đào tạo Sau đại học
và các bạn về tài liệu tham khảo để em có thể hoàn thành môn học này
Chân thành cảm ơn!
Trang 3Mục lục
1 Phát biểu bài toán người đưa thư 4
2 Cách giải 4
3 Cấu trúc dữ liệu 4
4 Các thuật toán 5
5 Chạy thử 8
6 Hạn chế 9
Trang 41 Phát biểu bài toán người đưa thư
Một người đưa thư xuất phát từ bưu điện phải đến một số con đường để phát thư rồi quay trở về điểm xuất phát, hỏi người đó phải đi như thế nào để số đường đi
là ít nhất
2 Cách giải
Bài toán giải bằng phương pháp đồ thị Dựng một đồ thị có các cạnh tương ứng với các con đường mà người đưa thư phải đi qua Một chu trình đi qua tất cả các cạnh gọi là một hành trình Giải bài toán người đưa thư tương đương với bài toán tìm chu trình ngắn nhất đi qua tất cả các cạnh của một đồ thị cho trước Đỉnh xuất phát của chu trình này tương ứng với vị trí của bưu điện Các đỉnh khác trên đường đi ứng với các nơi mà người đưa thư cần giao thư Giả sử ở đây sử dụng đồ thị vô hướng có trọng số dương
Giả sử đồ thị có n đỉnh, khi đó thuật toán tối ưu sẽ là thuật toán tìm chu trình Hamilton ngắn nhất, có độ phức tạp là O(n!)
Nhắc lại: Trong lý thuyết đồ thị, một đường đi Hamilton là một đường
đi trong đồ thị vô hướng đi qua tất cả các đỉnh của đồ thị, mỗi đỉnh đúng một lần Một chu trình Hamilton là một đường đi Hamilton sau đi qua tất cả các đỉnh của đồ thị thì trở về đỉnh xuất phát
3 Cấu trúc dữ liệu
Định nghĩa một kiểu dữ liệu dothi là một danh sách gồm có 2 thành phần, thành
phần thứ nhất là tập các đỉnh, mỗi đỉnh là một cái tên (name) thành phần thứ hai là tập các cạnh kèm trọng số, mỗi cạnh là một danh sách gồm 3 thành phần, 2 thành phần đầu là 2 đỉnh tạo nên cạnh và thành phần thứ 3 là trọng số của cạnh Ở đây sử dụng đồ thị đơn, không có khuyên
Ví dụ: một đồ thị G có 4 đỉnh a, b, c, d và bốn cạnh (a,b), (b,c), (c,d), (d,a) có trọng số biểu diễn như sau:
Trang 54 Các thuật toán
Trước khi tìm hành trình ngắn nhất (chu trình ngắn nhất), đồ thị sẽ được kiểm tra tính liên thông Nếu đồ thị liên thông mới tiến hành việc tìm chu trình, ngược lại thì dừng
Giả sử có đồ thị vô hướng G(V,E), V là tập đỉnh và E là tập các cạnh Thủ tục tìm hành trình ngắn nhất cho người đưa thư mô tả ngắn gọn như sau:
Thủ tục nguoi_dua_thu(G)
IF lien_thong(G) THEN
Chọn v là đỉnh xuất phát
Tim_chu_trinh_min(v,G)
IF tồn tại chu trình THEN
Xuất chu trình
ELSE
Xuất “Không có chu trình trong đồ thị”
END IF
ELSE
Xuất “Đồ thị không liên thông”
END IF
Hết thủ tục
Thủ tục lien_thong(G) dùng để xét tính liên thông của đồ thị G Nó được xây dựng dựa trên kỹ thuật duyệt đồ thị theo chiều rộng Xuất phát từ một đỉnh của đồ thị, thăm các đỉnh kề với nó, và quá trình được lặp lại cho các đỉnh kề này, cho đến khi nào số đỉnh được thăm bằng với tập đỉnh của đồ thị hoặc không còn đỉnh nào để thăm nữa
Thủ tục lien_thong(G)
Chọn v là đỉnh đầu tiên của G
Trang 6Đưa v vào danh sách hàng đợi Q
Đưa v vào danh sách đã thăm L
WHILE Q khác rỗng DO
Lấy phần tử t đầu tiên trong Q FOR tất cả các đỉnh d trong tập cạnh V DO
IF tồn tại cạnh(d,t) trong G và d chưa thămTHEN Đưa d vào danh sách đã thăm L
Đưa d vào danh sách hàng đợi Q END IF
END FOR
IF L=V THEN return true //đồ thị liên thông END IF
END WHILE
return false //đồ thị không liên thông
Hết thủ tục
Thủ tục tim_chu_trinh_min(v,G) thực hiện tìm chu trình Hamilton ngắn nhất trong tất cả chu trình Hamilton có trong đồ thị G và bắt đầu từ đỉnh v Trong thủ tục này cần gọi đến một thủ tục khác là tim_chu_trinh(v,G) để tìm tất cả các chu trình Hamilton và sau đó chọn một chu trình ngắn nhất trong các chu trình tìm được và nếu chỉ có một chu trình được tìm thấy thì đó là chu trình ngắn nhất Thủ tục tim_chu_trinh_min(v,G) có thể mô tả như sau:
Thủ tục tim_chu_trinh_min(v,G)
Kqua={} //chứa danh sách các chu trình
Ct=[] //chứa 1 chu trình
L=0 //tổng độ dài các cạnh 1 chu trình
Tim_chu_trinh(v,G)
IF Kqua #{} THEN
Ct_min=Kqua[1] //xem chu trình thứ nhất là ngắn nhất
Trang 7D_min=phần tử cuối của Ct_min
FOR mỗi chu trình c trong Kqua DO
D=phần tử cuối của c //chiều dài của c
IF D < D_min THEN Cập nhật D_min=D Cập nhật Ct_min=c END IF
return Ct_min //trả chu trình ngắn nhất về
ELSE
return {} //không có chu trình END IF
Hết thủ tục
Thủ tục tim_chu_trinh(v,G) thực hiện tìm các chu trình Hamilton có trong đồ thị với đỉnh bắt đầu là v Thủ tục sẽ thực hiện đệ qui để tìm tất cả chu trình Hamilton trong đồ thị Mỗi một chu trình được lưu vào một danh sách và phần tử cuối của danh sách là độ dài của chu trình (tổng các cạnh trong chu trình) Ý tưởng của việc tìm tất cả chu trình Hamilton bằng đệ qui như sau:
B1: Đưa đỉnh v vào đường đi
B2: Kiểm tra chu trình đủ chiều dài chưa (bằng tập đỉnh?) đồng thời đỉnh đầu
và đỉnh cuối có cạnh nối hay không Nếu đúng, ghi nhận một chu trình Hamilton, ngược lại tới B3
B3: Duyệt tất cả các đỉnh kề x với v
B4: Nếu x chưa đi qua thì gọi đệ qui với đỉnh x để tìm chu trình
B5: Loại x ra khỏi chu trình
Dựa vào ý tưởng trên, thủ tục tim_chu_trinh(v,G) được thực hiện như sau:
Kqua={} //chứa danh sách các chu trình
Ct=[] //chứa 1 chu trình
L=0 //tổng độ dài các cạnh 1 chu trình
Trang 8ch
D
và
Thủ tụ
Đư
Cậ
IF
L)
EN
FO
EN
Hết th
5 Chạy
Mục n
hất cho bài
hứa 6 chu t
Dữ liệu đồ t
à kết quả s
ục Tim_chu
ưa đỉnh v v
ập nhật L=L
(L=tập đỉn
THEN
Temp=
Đưa Te
ND IF
OR mỗi đỉn
IF (x khô Tim Loạ END IF
ND FOR
hủ tục
y thử
ày trình bà
i toán ngườ
trình Hami
thị chạy thử
au khi chạy
u_trinh(v,G vào Ct L+ độ dài c
nh của G)
[Ct,L]
emp vào Kq
nh x trong G ông thuộc C m_chu_trin
ại x ra khỏ
ày kết quả c
ời đưa thư
ilton và các ử:
y:
G)
cạnh(2 đỉn AND (có
qua
G DO Ct) AND ( nh(x,G)
i Ct
chạy thử ch
Ở đây, dữ
c thuật toán
nh cuối tron cạnh nối g
(có cạnh nố //gọi
ho thủ tục
ữ liệu chạy
n trên được
ng L) giữa đỉnh đ
ối giữa x và
đệ qui
tìm chu trì thử với đồ
c cài đặt trê
đầu và đỉnh
à v) THEN
ình Hamilt
ồ thị có 4 đỉ
ên Maple 1
h cuối của
N
on ngắn ỉnh và
16
a
Trang 9th
ch
Trong
ó có 2 chu
hì kết quả s
họn và dmi
6 Hạn
Thuật t
đỉnh cao
hình trên,
trình có cù
sẽ là chu trì
in là chiều
chế
oán chỉ chạ
hơn thì bị
dựa vào dữ ùng chiều d ình thứ nhấ dài chu trì
ạy tốt với đ lỗi đệ qui
ữ liệu của đ dài là 10, tu
ất, chính là ình được ch
đồ thị 4 đỉn lặp quá nh
đồ thị G, c
uy nhiên, v
à cmin ctm họn
nh, khi đồ t hiều lần
ó 6 chu trìn với thuật to min là chu t
thị có nhiề
nh Hamilto oán đã nêu trình ngắn
ều chu trình
on, trong bên trên nhất được
h với số