Bài toán người du lịch là một vấn đề kết nối tối ưu trong nghiên cứu khoa học máy tính. Cho một danh sách các thành phố và các cặp khoảng cách giữa 2 thành phố trong đó, nhiệm vụ là phải tìm một chu trình ngắn nhất để thăm mỗi thành phố một lần duy nhất.
Vấn đề này được nêu ra lần đầu tiên như là một vấn đề toán học vào năm 1930 và là vấn đề được tập trung nghiên cứu nhiều nhất trong lĩnh vực tối ưu. Nó được sử dụng thử nghiệm, đánh giá các thuật toán tối ưu. Tuy vấn đề có tính phức tạp cao, nhưng có rất nhiều phương pháp chính xác và gần đúng đã được biết đến, do đó có thể giải được vài trường hợp có đến 10 ngàn thành phố.
10 trang |
Chia sẻ: tuandn | Lượt xem: 3438 | Lượt tải: 1
Bạn đang xem nội dung tài liệu Đồ án Bài toán người du lịch và các thuật giải, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Trng i hc Khoa hc T nhiên TP.HCM Khoa CNTT
Lp CNTN2008
H tên sinh viên: Trn Vinh Kính
MSSV: 0812252
ÁN CUI K
LÝ THUYT TH
tài: Bài toán ngi du lch và các thu t gi
i
Giáo viên lý thuyt: Dng Anh c
Giáo viên hng d n th
c hành: ng Nguyn c Tin, Nguyn Huy Khánh
2
Ni dung án
1/Gii thi
u v lch s ca bài toán ngi du lch ................................................................... 2
2/Mô t chi tit bài toán............................................................................................................ 3
3/Thut gii chính xác .............................................................................................................. 4
4/Các thut gii gn úng (Heuristic) ...................................................................................... 6
4.1/Thut gii tham lam (thut gii láng ging gn nht) .................................................. 6
4.2/Thut toán nhánh cn ................................................................................................... 7
1/Gii thiu v lch s ca bài toán ngi du lch
Bài toán ngi du lch là mt vn kt ni ti u trong nghiên cu khoa hc máy tính.
Cho mt danh sách các thành ph và các cp khong cách gia 2 thành ph trong ó, nhi
m
v là phi tìm mt chu trình ngn nht thm mi thành ph mt ln duy nht.
Hình minh ho cho bài toán ngi du lch
Trong hình trên, tour ngi du lch có th thm ht tt c các thành ph vi chi phí
ngn nht c th hi
n b!ng các cnh màu ".
Vn này c nêu ra ln u tiên nh là mt vn toán hc vào nm 1930 và là
vn c tp trung nghiên cu nhiu nht trong l#nh v
c ti uu. Nó c s dng th
nghi
m, ánh giá các thut toán ti u. Tuy vn có tính phc tp cao, nhng có rt nhiu
phng pháp chính xác và gn úng ã c bit n, do ó có th gii c vài trng h p
có n 10 ngàn thành ph.
Trong nhng nm 1950 và 1960, bài toán tr$ nên ph% bin trong gii khoa hc châu
Âu và $ M&. Các công trình áng k u tiên c th
c hi
n b$i George Dantzig, Delbert
Ray Fulkerson và Selmer M. Johnson ngi ã xut bài toán nh mt chng trình tuyn
tính và phát trin phng pháp nhánh cn cho bài toán. Vi các phng pháp mi h ã gii
mt trng h p vi 49 thành ph mt cách ti u b!ng cách xây d
ng mt chu trình và
3
chng minh r!ng không có chu trình nào ngn hn. Trong nhiu thp k' sau ó, bài toán
c nghiên cu trong rt nhiu ngành nh toán hc, khoa hc máy tính, hoá hc, và vt lý.
2/Mô t chi ti
t bài toán
Bài toán ngi du lch có th biu din thành mt ( th, trong ó các thành ph là các
'nh, các con ng i li gia các thành ph là các cnh, (ng thi khong cách gia các
thành ph là trng s tng ng ca cnh ni chúng. Tt nhiên, ( th sau khi xây d
ng
xong là ( th , gia hai thành ph không có ng i tr
c tip mà phi thông qua mt
thành ph khác thì ta gán trng s ca cnh ó s ln nht có th. Khi ó, bài toán ngi du
lch tr$ thành bài tìm mt chu trình Hamilton ngn nht, và l trình ca ngi du lch chính
là chu trình Hamilton ngn nht.
Bn Thành Nhà hát TP Sân bay TSN m Sen H KHTN
Bn Thành 0 1 6 7 3
Nhà hát TP 1 0 6 8 4
Sân bay TSN 6 6 0 5 7
m Sen 7 8 5 0 6
H KHTN 3 4 7 6 0
Nu nh khoàng cách gia hai thành ph bt k) là nh nhau cho c hai hng thì dùng
( th vô hng, ng c li ta s dng ( th có hng. Trong ví d trên, ta gi nh ng i
t* 2 hng là nh nhau.
Trng h p khong cách gia các thành ph trong ( th là khong cách metric (tc là
tho bt +ng thc tam giác Cij , Cik + Ckj), thì khong cách tr
c tip t* thành ph A n
thành ph B là khong cách ngn nht và không bao gi ln hn khong cách mà có thông
S
KHTN
BT
NH
TSN
5
6
6
7
8
7
6
3
1
4
4
qua thành ph C. Th
c t, khi các thành ph c biu din b$i các im trên mt ph+ng, rt
nhiu các khong cách gn nh là khong cách metric.
Trong nhiu trng h p, các khong cách không tho bt +ng thc tam giác hoc do
tiêu chí ánh giá khong cách không thuc không gian metric ch+ng hn nh khong cách
theo tiêu chí thi gian di chuyn, rõ ràng máy bay di chuyn nhanh hn nhiu so vi ôtô mc
dù khong cách di chuyn có th ln hn.
3/Thut gi i chính xác
Trong các thut gii chính xác cho bài toán ngi du lch, u tiên phi k n thut
toán vét cn. Thut toán này tìm tt c các chu trình Hamilton trong ( th, sau ó chn mt
chu trình nh" nht làm áp án. Vi
c tìm chu trình Hamilton c th
c hi
n theo phng
pháp duy
t chiu sâu và kt h p quay lui. Do quá trình duy
t có th rt sâu nên ta không s
dng
quy mà dùng stack kh
quy. S dng mt bin min lu li t%ng trng s
ca chu trình Hamilton nh" nht. Ban u min=+- hoc min = m* trng s ca cnh ln
nht.
Chu trình Hamilton là chu trình i qua ht tt c các 'nh và sao ó quay v 'nh xut
phát, do ó, ta dùng mt danh sách ChuaXet[] lu li các 'nh cha xét, mt bin Sum
lu li trng s ca chu trình hi
n thi, do chu trình Hamilton không quan trng 'nh xut
phát, ta chn 'nh xut phát là 'nh có ch' s nh" nht là 1.
Quá trình duy
t nh sau:
-Ban u a 'nh 1 và 0 vào stack, Sum = 0.
-Lp li quá trình sau: Ly (Top) 'nh t* stack ra là 'nh i và trng s ts, gán
ChuaDuyet[i] là false và Sum+=ts, np 0 0 vào stack sau ó np các 'nh k j và trng
s tng ng vi 'nh ang xét mà ChuaDuyet[j]=true, nu i không có 'nh k tho
yêu cu, tc là ã duy
t ht tt c các 'nh (do ( th ang xét là ( th ). Ta cng
trng s ca cnh i1 vào Sum và gán min b!ng Min(Sum, min). Sum – = cnh i1.
Lp li quá trình sau: Ly 'nh t* stack ra, nu 'nh này không còn 'nh k tho yêu
cu thì Pop 'nh và trng s này ra, nu có 'nh tho thì thoát vòng lp và duy
t tip t*
'nh này, trng h p ly 'nh t* stack ra là 0 thì Pop 2 ln ly 2 'nh liên tc trong
stack ra sau ó tip tc vòng lp.
5
Stack 'nh Stack trng s 'nh ang xét Sum Min
1 0 0 +-
1,0,4,3,2 0,0,1,6,3 1 0 ..
1,0,4,3,2,0,4,3 0,0,1,6,3,0,7,5 2 3 ..
1,0,4,3,2,0,4,3,0,4 0,0,1,6,3,0,7,5,0,2 3 8 ..
1,0,4,3,2,0,4,3,0,4,0 0,0,1,6,3,0,7,5,0,2,0 4 8+2+1=11 11
1,0,4,3,2,0,4 0,0,1,6,3,0,7 4 11-1-2-5=3 ..
1,0,4,3,2,0,4,0,3 0,0,1,6,3,0,7,0,2 4 10 ..
1,0,4,3,2,0,4,0,3,0 0,0,1,6,3,0,7,0,2,0 3 10+2+6=18 11
1,0,4,3 0,0,1,6 3 18-6-2-7-3=0 ..
1,0,4,3,0,4,2 0,0,1,6,0,2,5 3 6 ..
1,0,4,3,0,4,2,0,4 0,0,1,6,0,2,5,0,7 2 11 ..
1,0,4,3,0,4,2,0,4,0 0,0,1,6,0,2,5,0,7,0 4 11+7+1=19 11
1,0,4,3,0,4 0,0,1,6,0,2 4 19-1-7-5=6 ..
1,0,4,3,0,4,0,2 0,0,1,6,0,2,0,7 4 8 ..
1,0,4,3,0,4,0,2,0 0,0,1,6,0,2,0,7,0 2 8+7+3=18 11
1,0,4 0,0,1 4 18-3-7-2-6=0 ..
1,0,4,0,3,2 0,0,1,0,2,7 4 1 ..
1,0,4,0,3,2,0,3 0,0,1,0,2,7,0,5 2 8 ..
1,0,4,0,3,2,0,3,0 0,0,1,0,2,7,0,5,0 3 8+5+6=19 11
1,0,4,0,3 0,0,1,0,2 3 19-6-5-7=1 ..
1,0,4,0,3,0,2 0,0,1,0,2,5 3 3 ..
1,0,4,0,3,0,2,0 0,0,1,0,2,5,0 2 3+5+3=11 11
Kt thúc thut toán, ta tìm c chu trình Hamilton là 12341 vi dài là 11.
1
4
2
3
3
7 5
6
1
2
1
4
2
3
3
7 5
6
1
2
6
4/Các thut gi i gn
úng (Heuristic)
4.1/Thut gii tham lam (thut gii láng gi ng g
n nht)
Thut gii vét cn $ trên cho ta mt áp án ti u, tuy nhiên phc tp ca nó là quá
cao (n-1)! thuc nhóm O(n!). Do ó, trong th
c tin ngi ta chp nhn các thut gii cho
kt qu tt (nhng không phi lúc nào c.ng tt) b$i s
n gin, nhanh chóng và cài t d
dàng. Mt trong các thut gii ó là thut gii tham lam hay còn gi là thut toán láng ging
gn nht. Trong thut toán này, ti mi bc, ta chn con ng (cnh) ni vi thành ph
('nh) gn nht vi hy vng r!ng n con ng ngn nht s/ cho ra ng i ngn nht.
Ví d sau ây minh ho cho thut gii tham lam vi n=5
áp án ca thut toán tham lam thng là tt (tuy không phi ti u) vì áp án ti u là
134521 vi chi phí là 10 so vi kt qu ca thut toán tham lam là 14.
Hàm minh ho cho thut toán tham lam:
int run(int n,int id)
{
int min;
int b[100]; //Lu li ng i
int count = 0; //S nh ã thm
int temp; //Ch s ca nh g n nh
t
int s=0;
b[0] = k;
while(count < n)
{
min=10000; //Lu li trng s ca cnh nh nh
t
for(int i = 0;i < n; i++) //chn ra cnh ni v
i nh g n nh
t
1
4
2
3
3
7
4
3
1
2
5
4 2
1
3
1
4
2
3
3
7
4
3
1
2
5
4 2
1
3
1
4
2
3
3
7
4
3
1
2
5
4 2
1
3
1
4
2
3
3
7
4
3
1
2
5
4 2
1
3
1
4
2
3
3
7
4
3
1
2
5
4 2
1
3
1
4
2
3
3
7
4
3
1
2
5
4 2
1
3
7
if(a[id][i] 0 && check (i,b,n) == 1)
//check: kim tra ã thm nh i cha
// là 1 nu cha thm, 0 nu thm ri
{
min = a[id][i];//Cp nht li trng s nh nh
t
temp = i; //Cp nht li ch s
}
if(count<n-1)
s=s+min;
b[count + 1] = temp;
id = temp;
count ++;
}
s=s+a[id][k]; //Cng v
i trng s ca cnh t nh cui n nh xu
t
phát
b[n] = k;
cout << "Duong di ngan nhat: ";
for(int i = 0; i < n; i++)
cout ";
cout<<b[n];
cout<<"\n\n";
cout<<"Quang duong ngan nhat nguoi du lich nen di la: "<<s;
cout<<"\n\n";
return 0;
}
Thut gii tham lam có phc tp nh" hn nhiu so vi gii thut vét cn, chi phí cho
gii thut này là n(n-1)/2 thuc nhóm O(n2). Tuy nhiên, nh ã nói $ trên, gii thut này
không phi luôn luôn úng, trong mt s trng h p, li gii ca thut gii tham lam rt t
nh trong ví d sau:
4.2/Thut toán nhánh cn
Thut toán nhánh cn là phng pháp ch yu gii các bài toán ti u t% h p. T
t$ng c bn ca thut toán là trong quá trình tìm kim li gii, ta s/ phân hoch tp các
phng án thành hai hay nhiu nhánh con nh cây tìm kim, sau ó ánh giá t*ng nhánh
1
4
2
3
100
7
5
7
5
7
5
7 7
5
5
1
4
2
3
100
7
5
7
5
7
5
7 7
5
5
8
quyt nh xem nên tip tc $ nhánh nào và loi b" nhánh mà các phng án con ca nó
không th là phng án ti u.
Trong thut gii trình bày di ây, chúng ta s/ tìm li gii d
a trên ma trn trng s
C[ ][ ]. i vi bài toán ngi du lch, khi tin hành tìm kim li gii, chúng ta s/ phân tp
các hành trình thành 2 tp con: Tp g(m nhng hành trình có cha cnh (i,j) và tp còn li
g(m nhng hành trình không cha cnh (i,j).
Trc tiên, cho vi
c phân nhánh c d dàng, ta cn phi rút gn ma trn trng s,
do t%ng chi phí ca hành trình s/ cha úng mt phn t ca mi dòng và mi ct nên khi
cng hay tr* c dòng hay ct cho mt s thì t%ng trng s c tt c các hành trình s/ gim
i . Do ó, ta có th rút gn ma trn trng s sao cho trên mi dòng và ct u có ít nht
mt s 0, (ng thi, t%ng ca các s s/ là cn di ca tt c các hành trình.
i vi tp phân hoch cha cnh i,j. Do i,j thuc hành trình này nên ta phi xoá dòng
i ct j do không th có cnh khác t* i i ra và t* i vào j ngoài cnh i,j, ngoài ra c.ng t
C[j][i] b!ng - do ã chn cnh C[i][j].
i vi tp phân hoch không cha cnh i,j ta ch' vi
c t C[i][j]= -
Ta ln l t tìm cn di ca 2 ma trn này, sao ó chn phân hoch tip trên ma trn
có cn di nh" hn. Do ó, khi chn cnh phân nhánh ta phi chn làm sao cn di
ca nhánh không cha i,j là lón nht, tìm cnh ó ta chn s 0 trong ma trn khi thay
nó b!ng - s/ cho ta t%ng h!ng s rút gn theo cnh và dòng ln nht.
Mt lu ý na là khi ã chn cnh i,j và j,k thì ta phi ngn chn không cho qua cnh
k,i không hình thành các chu trình con.
Ví d: gii bài toán ngi du lch vi ma trn chi phí nh sau
Tp tt c các hành trình
Hành trình cha i,j Hành trình không
cha i,j
9
1 2 3 4 5
1 - 8 5 22 11
2 4 - 9 17 27
3 15 7 - 12 35
4 5 27 17 - 29
5 23 21 19 7 -
u tiên s/ th
c hi
n vi
c rút gn ma trn b!ng cách tr* ln l t mi dòng vi s nh"
nht trên dòng ó hoc tr* mi ct vi s nh" nht trên ct ó sao cho trên mi dòng hoc
mi ct u có ít nht mt s 0.
1 2 3 4 5
1 - 3 0 17 6
2 0 - 5 13 23
3 8 0 - 5 28
4 0 22 12 - 24
5 16 14 12 0 -
Ta có cn di ca ma trn này là 5+4+7+5+7=28. Ta chn cnh phân nhánh là cnh
(5,4), khi ó, ma trn ca tp phân hoch cha cnh (5,4) và tp phân hoch không cha
cnh (5,4) ln l t là:
1 2 3 5
1 - 3 0 6
2 0 - 5 23
3 8 0 - 28
4 0 22 12 -
Cn di là 28+6=34 Cn di là 23+28=51
Ta tip tc rút gn và phân nhánh tp phân hoch cha cnh (5,4)
1 2 3 5
1 - 3 0 0
2 0 - 5 17
3 8 0 - 22
4 0 22 12 -
5
4
7
5
7
1 2 3 4 5
1 - 3 0 17 6
2 0 - 5 13 23
3 8 0 - 5 28
4 0 22 12 - 24
5 16 14 12 - -
1 2 3 5
1 - 3 0 0
2 0 - 5 17
3 8 0 - 22
4 0 22 12 -
10
Cn di ca tp phân hoch không cha (1,5) là 17+34=51
Chn cnh (1,5) thì cn di ca tp phân hoch cha (5,4) và cha (1,5)
là 34. (ng thi phi ngn vi
c hình thành chu trình con b!ng cách cho
C[4][1]= -. Tip tc rút gn, ta li c ma trn sau có cn di là
12+34=46
Phân nhánh cnh (3,2) ta c ma trn 2x2 ca tp phân hoch cha cnh (5,4), (1,5), (3,2)
có cn di là 46
Cui cùng ta thêm vào hành trình 2 cnh cui là (2,1) và (4,3). Nh vy, các cnh ca hành
trình tìm c là (5,4), (1,5), (3,2), (2,1), (4,3) và chu trình cn tìm là 154321
vi chi phí là 7+11+7+4+17=46.
1 2 3
2 0 - 5
3 8 0 -
4 - 22 12 1 2 3
2 0 - 0
3 8 0 -
4 - 15 0
1 2 3
2 0 - 0
3 8 0 -
4 - 15 0
1 3
2 0 -
4 - 0