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

Tiểu luận LẬP TRÌNH SYMBOLIC Bài toán người đưa thư

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 (261.15 KB, 9 trang )












S
Y

Giảng v
Học viê
n
Mã số:
C
TRƯ

BÀI
Y
MB
O
Đề t
iên: PGS
n
: Đào T
h
C


H11011
1

NG ĐẠI
ĐẠI H

THU
O
LIC
V
ài: Bà
i
.TS Đỗ
V
h
ị Phấn
1
8
TP
H
HỌC CÔ
N

C QUỐ
C
HOẠ
C
V
À T
R

i
toán
ăn Nhơn
H
CM, Th
á
N
G NGH

C
GIA TP
C
H M
Ô
R
Í TU

ngườ
i
á
ng 02/20

THÔN
G
HCM
Ô
N H

NH
Â

i
đưa
t
13
G
TIN
ỌC
Â
N T

t


O
Trang 2

Lờ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 3


Mụ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 4

1. 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 5



4. 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 7

D_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
END FOR
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

n
h
c
h
D

v
à
Thủ t

Đ
ư
C


IF
L)
E
N
F
O
E
N
Hết t
h
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_ch
u
ư
a đỉnh v
v

p nhật L=
L
(L=tập đỉ
n
THEN
Temp=
Đưa T
e
N
D IF
O
R
m
ỗi đỉ
n
IF (x kh
ô
Ti
m
Lo

END IF
N
D FOR

h
ủ tục
y
thử
ày trình b
à
i
toán ngư

t
rình Ham
i
t
hị chạy th

au khi chạ
y
u
_trinh(v,
G
v
ào Ct
L
+ độ dài
c
n
h của G)
[Ct,L]
e
mp vào K

q
n
h x trong
G
ô
ng thuộc
C
m
_chu_tri
n

i x ra khỏ
à
y
k
ết quả
c

i đưa thư.
i
lton và cá
c

:
y
:
Trang
G
)
c

ạnh(2 đỉ
n
AND (có
q
ua
G
DO
C
t) AND
(
n
h(x,G)
i Ct
c
hạy thử c
h
Ở đây, d

c
thuật toá
n
8
n
h cuối tro
n
cạnh nối
g
(
có cạnh n


//gọi
h
o thủ tục

liệu chạy
n
trên đượ
c
n
g L)
g
iữa đỉnh
đ

i giữa x v
à
đệ qui
tìm chu tr
ì
thử với đ

c
cài đặt tr
ê
đ
ầu và đỉn
h
à
v) THE
N

ì
nh Hamilt

thị có 4 đ

ê
n Maple
1
h
cuối củ
a
N

on ngắn

nh và
1
6.

a


đ
ó
t
h
c
h
Trong
ó

có 2 chu
h
ì kết quả
s
h
ọn và dm
i
6.

Hạn
Thuật t
đỉnh cao
hình trên,
t
r
ình có c
ù
s
ẽ là chu tr
ì
i
n 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
Trang

liệu của
đ
d
ài là 10, t
u

t, chính l
à
ì
nh được c
h
đ
ồ thị 4 đỉ
n
lặ
p
quá n

h
9
đ
ồ thị G, c
u
y nhiên,
v
à
cmin. ct
m
h
ọn.
n
h, khi đồ
t
h
iều lần.
ó 6 chu trì
n
v
ới thuật t
o
m
in là chu
t
t
hị có nhi

n
h Hamilt

o
o
án đã nêu
t
rình ngắn

u chu trìn
h

o
n, trong
bên trên
nhất được
h
với số

×