SlideShare a Scribd company logo
Bài toán người đi du lịch
Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng
Trang 1
LỜI MỞ ĐẦU
Thuật ngữ thuật toán (Algrithm) là từ viết tắt của tên một nhà toán học
nổi tiếng người Ai Cập ở thế kỷ thứ IX: Abu Ja’fa Mohammed ibn Musa al-
Khowarizmi. Ông là người viết hai quyển sách nổi tiếng là “Sơ lược về các
phép tính trên Al jafar và Al Mukabal” và “Hệ đếm Ấn Độ”. Đầu tiên, thuật
toán được hiểu như là các quytắc thực hiện các phép toán sốhọc với các con
số được viết trong hệ thập phân. Cùng với sự phát triển của máy tính, khái
niệm thuật toán cũng được hiểu theo nghĩa rộng hơn. Một định nghĩa hình
thức về thuật toán được nhà toán học người Anh là Alan Mathison Turing là
cha đẻ của ngành khoa học máy tính đưa ra vào năm 1936 thông qua máy
Turing. Có thể nói lý thuyết thuật toán được hình thành từ đó.
Định nghĩa một cách trực quan thì thuật toán là một bản liệt kê các chỉ
dẫn, các quy tắc cần thực hiện theo từng bước xác định nhằm giải quyết một
bài toan đã cho trong khoảng thời gian hữu hạn.
Một thuật toán bao gồm các tính chất sau:
 Tính chính xác: để đảm bảo kết quả tính toán hay các thao tác mà
máy tính thực hiện được là chính xác.
 Tính rõ ràng: Thuật toán phải được thể hiện bằng các câu lệnhminh
bạch; các câu lệnh được sắp xếp theo thứ tự nhất định.
 Tính khách quan: Một thuật toán dù được viết bởi nhiều ngườitrên
nhiều máy tính vẫn phải cho kết quả như nhau.
 Tính phổ dụng: Thuật toán không chỉáp dụng cho một bàitoán nhất
định mà có thể áp dụng cho một lớp các bài toán có đầu vào tương
tự nhau.
 Tính kết thúc: Thuật toán phải gồm một số hữu hạn các bước tính
toán.
Phân tích và thiết kế thuật toán là một lĩnh vực quan trọng của khoa học
máy tính. Phân tích thuật toán giúp cho người thiết kế giải thuật có thể tiên
liệu được các tài nguyên mà thuật toán yêu cầu như: bộ nhớ, băng thông,
thiết bị ngoại vi, … Song yếu tố quan trọng nhất chính là thời gian thực hiện
giải thuật.
Trong bài viết này, chúng em xin trình bày những hiểu biết của mình về
bài toán tối ưu trong việc tìm đường đi ngắn nhất sử dụng những kiến thức
liên quan đến đồ thị và ứng dụng những kiến thức đã học được từ môn Phân
tích và đánh giá thuật toán để giải quyết bài toán “Có n thành phố và giữa các
cặp thành phố xác định một thông số là chi phí đi lại. Một hành trình là một
cách đi xuất phát từ một thành phố, qua tất cả các thành phố còn lại và quay
lại vị trí xuất phát. Tìm hành trình có chi phí nhỏ nhất.” Tìm đường đi ngắn
nhất trong đồ thị được ứng dụng nhiều trong các bài toán tìm đường đi ngắn
tối ưu giữa hai điểm trong mạng giao thông, đường đi ngắn nhất của gói tin
giữa các nút mạng máy tính…
Bài toán người đi du lịch
Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng
Trang 2
Do thời gian và kiến thức còn hạn chế nên trong quá trình trình bày chắc
chắn không tránh khỏi những sai sót, rất mong nhận được sự góp ý của Thầy
Giáo và các bạn học viên trong lớp.
Chúng em xin gửi lời cảm ơn thầy giáo, PGS.TS Đào Thanh Tĩnh và các
bạn trong lớp học đã tạo điều kiện thuận lợi và giúp đỡ em hoàn thành bài
tập này.
Xin chân thành cảm ơn!
Nhóm học viên thực hiện
Lê Đình Hưng
Đỗ Thanh Liên
Lương Thúy Vượng
Bài toán người đi du lịch
Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng
Trang 3
CHƯƠNG I: PHÂN TÍCH BÀI TOÁN
1. Phát biểu bài toán
Có n thành phố và giữa các cặp thành phố xác định một thông số là chi
phí đi lại. Một hành trình là một cách đi xuất phát từ một thành phố, qua tất
cả các thành phố còn lại và quay lại vị trí xuất phát. Tìm hành trình có chi phí
nhỏ nhất. Giải bài toán bằng phương pháp gần đúng. So sánh hiệu quả với
phương pháp vét cạn.
2. Giới thiệu về bài toán người đi du lich
Bài toán người đ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 hai thành phố trong đó, nhiệm vụ là phải tìm một chu kỳ ngắn nhất để
thăm mỗi thành phố một lần duy nhất.
Hình 1. Ví dụ về bài toán người đi du lịch
Trong hình trên, tour đề người đi du lịch có thể thăm hết các thành phố
với chi phí ngắn nhất có thể được thể hiện bằng cạnh màu đỏ.
Vấn đề bài toán người đi du lịch được nêu ra đầu tiên như là vấn đề toán
học đầu tiên vào năm 1930và 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 trong thực 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 sử dụng rất nhiều
phương pháp chinh xác và gần đúng(xấp xỉ) đã được biết đến, do đó có thể
giải được vài trường hợp có đến 10 ngàn thành phố.
Trong những năm 1950 và 1960, bài toán mở rộng trở nên phổbiến trong
giới khoa học Châu Âu và Bắc Mỹ. Các công trình nghiên cứu đáng kể đầu
tiên được thực hiện bởi George Dantzig, Delbert Ray Fulkerson và Selmer
M.Johnson người đã đề xuất bài toán như một chương trình tuyến tính và
phát triển phương pháp cận nhánh cho bài toán. Với các phương pháp mới
họ đã giải quyết một trường hợp với 49 thành phốmột cách tối ưu bằng cách
xây dựng một chu trình và chứng minh rằng không có chu trình nào ngắn
hơn vào năm 1954, cho đến năm 2004 bài toán giải quyết được với số đỉnh
Bài toán người đi du lịch
Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng
Trang 4
nên đến 24.978 đỉnh dự báo sẽ còn tiếp tục tăng nên nữa. Trong nhiều thập
kỷ liên tiếp sau đó, bàitoán được nghiên cứu trong rất nhiều ngành như Toán
rời rạc; khoa học máy tính; hóa học; vật lý…
3. Mô tả chi tiết bài toán người đi du lịch
Bài toán người đi du lịch có thể biểu diễn thành một đồ thị, trong đó các
thành phố được biểu diễn dưới dạng các đỉnh, các con đường đi lại giữa các
thành phố là các cạnh và chi phí đi lại giữa các thành phố được biểu diễn
dưới dạng giá trị các cạnh nối các đỉnh. Tất nhiên, đồ thị sau khi được xây
dựng dựa vào các đỉnh và chi phí đi lại giữa các thành phố là đồ thị hoàn
chỉnh và đủ, giữa hai thành phố không có đường đi trực tiếp được nối với
nhau mà phải thông qua một hoặc nhiều thành phố trung gian khác ta gán
trọng số của cạnh đó với số lớn nhất có thể (thường là ∞). Khi đó, bài toán
người đi du lịch trở thành bài toán tìm chu trình Hamilton ngắn nhất, và lộ
trình của người du lịch chinh là chu trình Hamilton ngắn nhất.
A B C D E D
A 0 3 93 13 33 9
B 4 0 77 42 21 6
C 45 17 0 36 16 28
D 39 90 80 0 56 7
E 28 46 88 33 0 25
F 3 88 18 46 92 0
Nếu như khoảng cách giữa hai thành phố bất kỳ là như nhau cho cả hai
hướng thì dung đồthịvô hướng, ngược lại ta sửdụng đồthịcó hướng. Trong
ví dụ trên, ta giả định đường đi từ 2 hướng là như nhau.
Trường hợp khoảng cách giữa hai thành phố trong đồ thị là khoảng cách
Metric(tức là khoảng cách thỏa mãn bất đẳng thức tam giác sau Cij <= Cik +
Ckj) thì khoảng cách trực tiếp từ thành phố A đến thành phố B là khoảng cách
ngắn nhất và không baogiờ lớn hơn khoảng cách mà có thông qua thành phố
C. Thực tế, khi các thành phố được biểu diễn bởi các điểm trên mặt phẳng,
rất nhiều các khoảng cách gần như là khoảng cách Metric.
Trong nhiều trường hợp, các khoảng cách không thỏa mãn bất đẳng thức
tam giác hoạc do tiêu chí đánh giá khoảng cách không phụ thuộc vào không
gian Metric chẳng hạn như khoảng cách theo tiêu chí thời gian di chuyển, rõ
ràng máy bay di chuyển nhanh hơn nhiều sơ với ô tô mặc dù khoảng cách di
chuyển có thể là lớn hơn.
Bài toán người đi du lịch
Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng
Trang 5
CHƯƠNG II THIẾT KẾ GIẢI THUẬT
1. Giải thuật chính xác
Trong các giải thuật để giái chính xác cho bài toán người đi du lịch, đầu
tiên phải kể đến thuật toán vét cạn. Vét cạn theo nghĩa thông thường là xét
hết các trường hợp. Trong lập trình để giải quyết các bài toán tối ưu, vét cạn
được sử dụng khi không còn phương pháp nào hiệu quả hơn để sử dụng
được.
Phương pháp vét cạn được mô tả để giải quyết bài toán người đi du lịch
như sau duyệt tất cả các thành phốđược nốivới một thành phốđã được đánh
dấu, tìm các tất cả các hành trình và chi phi tương ứng cho các hành trình,
sau đó đánh giá các hành trình và tìm gia hành trình có chi phí thấp nhất làm
kết quả cho bài toàn.
Thuật toán vét cạn để giải quyết bài toán người đi du lịch sau khi xây
dựng được ma trận chi phí sẽ giống như bài toán tìm tất cả các chu trình
Hamilton trong đồ thị, sau đó so sánh các chu trình Hamilton và chọn một
chu trình nhỏ nhất làm đáp án. Việc tìm chu trình Hamilton được thực hiện
theo phương pháp duyệt theo chiều sâu và có kết hợp quay lui. Do quá trình
duyệt có thể là rất sâu nên ta không sử dụng đệ quymà dung stackđể khử đệ
quy. Sử dụng một biến Min để lưu thông tin lại tổng trọng số của chu trình
Hamilton nhỏ nhất. ban đầu min=∞ hoặc min=m*trọng số của cạnh lớn
nhất.(m là tổng số tất cả các đường đi đến các thành phố)
Chu trình Hamiltoon là chu trình đi qua hết tất cả các đỉnh và sau đó
quay về đỉnh xuất phát, dođó, chúng ta dung một danh sách Chuaxet[] để lưu
lại các đỉnh chưa xét, một biến Sum để lưu lại trọng số của chu trình hiện
thời, do chu trình Hamilton không quan trọng định xuất phát, ta chọn đỉnh
xuất phát là đỉnh có chỉ số nhỏ nhất là 1.
Quy trình duyệt như sau:
1. Ban đầu đưa đỉnh 1 và 0 vào stack, Sum=0;
2. Lặp lại quá trình sau: Lấy (Top) đỉnh từ stackra và đỉnh I và trọng
số ts, gán Chuaduyet[i] là false và Sum+=ts, nạp 0 0 vào stack sau
đó nạp các đỉnh kề j và trọng số tương ứng với đỉnh đang xét mà
Chuaduyet[i]=true, nếu i không có đỉnh liền kề thỏa mãn yêu cầu,
tức là duyệt hết tất cả các đỉnh(do đồ thị đang xét là đồ thị đủ). Ta
cộng trọng số của cạnh i ->1 vào Sum và gán min bằng Min(sum,
min). Sum-=canh i->1.
3. Lặp lại quá trình sau: Lấyđỉnh từ stackra, nếu đỉnh này không còn
đỉnh kề thỏa mãn yêu cầu thì Pop đỉnh và trọng số này ra, nếu có
đỉnh thỏa mãn thì thoát vòng lặp và duyệt tiếp từ đỉnh này, trường
hợp lấy đỉnh từ stack ra là 0 thì Pop 2 lần để lấy 2 đỉnh liên tục
trong stack ra sau đó tiếp tục vòng lặp.
Bài toán người đi du lịch
Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng
Trang 6
Ví dụ về việc sử dụng thuật toán vét cạn đề giải quyết bài toán:
Các
bước
Stack chứa đỉnh Stack trọng số Đỉnh
đang xét
Sum min
1 1 0 Ø 0 +∞
2 1;0;4;3;2 0;0;1;6;3 1 0 +∞
3 1;0;4;3;2;0;4;3 0;0;1;6;3;0;7;5 2 3 +∞
4 1;0;4;3;2;0;4;3;0;4 0;0;1;6;3;0;7;5;0;2 3 8 +∞
5 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
6 1;0;4;3;2;0;4 0;0;1;6;3;0;7 4 3 11
7 1;0;4;3;2;0;4;0;3 0;0;1;6;3;0;7;0;2 4 10 11
8 1;0;4;3;2;0;4;0;3;0 0;0;1;6;3;0;7;0;2;0 3 18 11
9 1;0;4;3 0;0;1;6 3 0 11
10 1;0;4;3;0;4;2 0;0;1;6;0;2;5 3 6 11
11 1;0;4;3;0;4;2;0;4 0;0;1;6;0;2;5;0;7 2 11 11
12 1;0;4;3;0;4;2;0;4;0 0;0;1;6;0;2;5;0;7;0 4 19 11
13 1;0;4;3;0;4 0;0;1;6;0;2 4 6 11
14 1;0;4;3;0;4;0;2 0;0;1;6;0;2;0;7 4 8 11
15 1;0;4;3;0;4;0;2;0 0;0;1;6;0;2;0;7;0 2 18 11
16 1;0;4 0;0;1 4 0 11
17 1;0;4;0;3;2 0;0;1;0;2;7 4 1 11
18 1;0;4;0;3;2;0;3 0;0;1;0;2;7;0;5 2 8 11
19 1;0;4;0;3;2;0;3;0 0;0;1;0;2;7;0;5;0 3 19 11
20 1;0;4;0;3 0;0;1;0;2 3 1 11
21 1;0;4;0;3;0;2 0;0;1;0;2;5 3 3 11
22 1;0;4;0;3;2;0 0;0;1;0;2;5;0 2 11 11
Kết thúc thuật toán ta tìm được chu trình Hamiltin là: 1=>2=>3=>4>=1
với chi phí là 11.
Bài toán người đi du lịch
Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng
Trang 7
2. Giải thuật gần đúng(hay gọi là xấp xỉ)
Thuật toán vét cạn ở trên cho ta một đáp án tối ưu, tuy nhiên độ phức
tạp của thuật tán là quá cao (n-1)! Thuộc nhóm O(n!). Do đó, trong thực tế
người ta chấp nhận các giải thuật cho kết quả tốt(những không phải lúc nào
cũng tốt) bởi sự đơn giản, nhanh chóng và cài đặt dễ dàng.
Ở trong phần này chúng tôi giới thiệu hai thuật toán gần đúng để giải
quyết bàitoán: đólà thuật toán láng giềng gần nhất và nhánh cận để giảiquyết
bài toán.
2.1.Giải thuật láng giềng gần nhất
Thuật toán láng giềng gần nhất hay còn gọi là giải thuật tham lam. Trong
giải thuật này, tại mỗi bước, ta chọn con đường (cạnh) nối với thành phố
(đỉnh) gần nhất với hi vọng rằng n con đường ngắn nhất sẽ cho ra đường đi
ngăn nhất.
Ý tưởng của thuật toán láng giềng gần nhất: là tìm kiếm lựa chọn tối
ưu cục bộ tại mỗi bước với hi vọng tìm được tìm được tối ưu toàn cục khi
kết thúc. Tại mỗi bước lựa chọn, thuật toán này chọn “miếng ngon nhất”
được xác định bằng hàm chọn “ngon nhất” (có thể là giá trị max hoặc min,
hoặc theo1 ý nghĩa nào đó tùyvào bài toán cụ thể và nếu cóthể “ăn” trở thành
nghiệm của bài toán) được thì “ăn” luôn; nếu không nó sẽ bỏđi và không xem
xét lại.
Thuật toán láng giềng gần nhất:
Input C=(cij)
Output tour// hành trình tối ưu
Cost; // Chi phí tương ứng của các hành trình
Mô tả:
Tour := Ø ; Cost:=0; v:=u; // Khởi tạo
∀𝑘 ≔ 1 → 𝑛 ;// Thăm tất cả các thành phố;
// Chọn cạnh kề.
Chọn(u, w) là đoạn nối 2 thành phố có chi phí nhỏ nhất từ thành phố V
đến các thành phố chưa đi qua.
Tour := Tour+ (u, w); // cập nhật hành trình.
Cost := Cost +Cv,w // cập nhật chi phí.
// Hoàn thành chuyến đi.
Độ phức tạp của thuật toán tham lam: Thuật toán tham lam có độ
phức tạp nhỏ hơn nhiều sovới giải thuật vét cạn, chiphí chogiải thuật là n(n-
1)/2 thuộc nhóm O(n2
).
Tour := Tour+(v, w);
Cost := Cost + Cvw
Tuy nhiên, đã nói ở trên giải thuật này không phải luôn luôn đúng, trong
một số trường hợp, lời giải của thuật toán tham lam là rất tệ.
Bài toán người đi du lịch
Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng
Trang 8
Ví dụ 1: minh họa giải thuật tham lam với n=5
Đáp án của thuật toán láng giềng gần nhất thường là tốt(tuykhông phải
tối ưu) vì đáp án tối ưu của bài toán trên là: 1=>3=>4=>5=>3=>1 với chi phí là
10 so với kết quả của thuật toán tham lam là 14.
Ví dụ 2: Cho ma trận chi phí:
∞ 48 43 54 31
20 ∞ 30 63 22
C= 29 64 ∞ 4 7
6 19 2 ∞ 8
1 28 7 18 ∞
Bước 1: Từ thành phố1 ta chọn đích là thành phố5(chi phí=31 thấp nhất)
Tour := Ф; Cost := 0; u=1; w =5;
Bước 2: Từ thành phố5 ta chọn đích là thành phố3(chi phí=7 thấp nhất)
Tour := <1,5> ; Cost := 31; u=5; w =3;
Bước 3: Từ thành phố3 ta chọn đích là thành phố4(chi phí=4 thấp nhất)
Tour := {<1,5>, <5,3>} ; Cost := 38; u=4; w =4;
Bước 4: Từthành phố4 ta chọn đích là thành phố 2(thành phốcuối chưa
đi đến chi phí =19)
Tour := {<1,5>, <5,3>,<3,4>} ; Cost := 42; u=2; w =19;
Bài toán người đi du lịch
Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng
Trang 9
Bước 5: Từ thành phố 2 ta quay lại thành phố 1(chi phí=20)
Tour := {<1,5>, <5,3>,<3,4>, <4,2>} ; Cost := 61; u=5; w =20;
Tour := {<1,5>, <5,3>,<3,4>,<4,2>,<2,1>} ; Cost := 81;
Theo thuật toán tham lam ta có hành trình như sau:
1 => 5 => 3 => 4 =>2 >1. Chi phí: 31+7+4=19+20 =81.
Cài đặt và code thuật toán tham lam:
int GTS(mat c, int n, tin TUOR[max], int Ddau)
{
int v; // đỉnh đang xét
int k; // duyệt qua n đỉnh để chọn
int w; // đỉnh được chọn trong mỗi bước
int mini; // chọn min các cạnh trong mỗi bước
int COST; trọng số nhỏ nhất của chu trình
int daxet[max]; // danh sách các đỉnh được sử dụng
for (k=1; k<=n; k++)
Daxet[k] =0; // chưa đỉnh nào được xét
COST = 0; // Lúc đầu, giá trị COST=0;
int i; // biến đếm, đếm tìm đủ n đỉnh thì dừng
v= Ddau; // Chọn đỉnh xuất phát là 1
i=1;
TOUR[i]=v; // đưa v vào chu trình
daxet[v] = 1 ; // đỉnh v đã được xét.
while(i<n)
{
mini=vc;
for(k=1; k<=n; k++)
If(!daxet[k])
If(mini>a[v][k])
{
mini=a[v][k];
w=k;
}
v=w;
i++
TOUR[i] = v;
Daxet[v]=1;
COST +=mini
}
COST +=a[v][Ddau];
resturn COST;
}
Bài toán người đi du lịch
Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng
Trang 10
2.2.Thuật toán nhánh cận
Thuật toán nhánh cận là phương pháp chủ yếu để giải các bài toán tối
ưu tổ hợp.
Ý tưởng của thuật toán nhánh cận: Cơ bản của thuật toán là trong
quá trình tìm kiếm lời giải tối ưu, ta phân hoạch tập các phương án thành hai
hây nhiều nhánh con như cây tìm kiếm và cố gắng bằng phép đánh giá cận
cho các nút, tìm cách loại bỏ những nhánh của cây tìm kiếm(những tập con
các phương án của bài toán) mà ta biết chắc chắn là các phương án đó không
phải là phương án tối ưu.
Độ phức tạp của thuật toán: Trong trường hợp tệ nhất thuật toán đi
theo hướng trở thành thuật toán vét cạn những trong nhiều trường hợp cụ
thể kỹ thuật đó chophép rút ngắn được một cách đáng kể quá trình tìm kiếm.
Trong mục này ta trình bày những tư tưởng chinh của giải thuật cận
nhánh thông qua việc áp dụng nó vào giải quyết bài toán người đi du lịch.
Ma trận chi phí: Trong bài toán người đi du lịch chi phí Cij để đi từ
thành phố i đến thành phố j, theo nội dung đã phân tích người đi du lịch với
mỗi thành phố trong hành trình của mình chỉ xuất phát từ đó một lần và rời
khỏi đó một lần, mặt khác để thuận lợi trong việc tính toán ta biểu diễn them
ký hiệu Cii=∞, kết hợp lại ta có ma trận chi phí sau:
∞ C12 C13 … C1n
C21 ∞ C23 … C2n
C= C31 C32 ∞ … C3n
… … … ∞ …
Cn1 Cn2 Cn3 … ∞
Ma trận C được gọi là ma trận chi phí
Rõ ràng nếu ∏= (∏(1), ∏(2), ∏(3),…., ∏(n)) là một hành trình của người
đi du lịch thì chi phí cho hành trình đó là tổng tương ứng của các phần tử
trong ma trận C, vì từ mỗi thành phố người du lịch chỉ xuất phát một lần nên
trên mỗi hang của ma trận chỉ có duy nhất một phần tử tham gia, cũng như
vậy vì mỗi thành phố chỉ đến một lần, nên mỗi cột của ma trận cũng có duy
nhất một phần tử tham gia. Từ nhận xét này ta có thể xét bài toán người đi
du lịch rộng hơn là: “Hãy chọn trong ma trận vuông cấp nxn mỗihang mỗi cột
một phần tử sao cho tổng của chúng là nhỏ nhất”
Ta rút ra tính chất sau: Nếu các phần tử của mỗi hàng (hoặc mỗi cột) của
ma trận c ta bớt đi cùng một số thì tính chất tối ưu của hành trình không đổi.
Trong hành trình ∏= (∏(1), ∏(2), ∏(3),…., ∏(n)) mỗi đoạn đường ∏(i),
∏(i+1) đi từ thành phố ∏(i) đến thành phố ∏(i+1) ta gọi là một cung, chi phí
tương ứng sẽ là C∏(i), ∏(i+1), như vậy mỗi hành trình tương ứng với tập hợp n
cung thỏa mãn một số điều kiện, việc chọn cung hay chọn một phần tử trong
ma trận C là tương đương nhau.
Bài toán người đi du lịch
Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng
Trang 11
Thuật toán nhánh cận: Trong bài toán ngưới đi du lịch khi tiến hành
tìm kiếm lời giải chúng ta sẽ phân tập các hành trình ra thành hai tập con:
 Một tập gồm những hành trình chứa cung (i,j) nào đó.
 Một tập kia gồm những hành trình không chứa cạnh này.
Ta gọi việc làm đó là phân nhánh và mỗi tập con nói trên sẽ được gọi là
một nhánh hay một nút của cây tìm kiếm. Việc phân nhánh được minh họa
bởi cây tìm kiếm:
Hình Sơ đồ phân nhánh
Việc phân nhánh sẽ được thực hiện dựa trên một quy tắc heuristic
(Heuristic là phương pháp tiếp cận cảm tính mang tính kinh nghiệm để giải
quyết các bài toán khó) nào đó cho phép ta rút ngắn quá 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 giá trị hàm
mục tiêu trên mỗi một trong hai tập con nói trên. Việc tìm kiếm sẽ được tiếp
tục trên tập con cógiá trị cận dưới nhỏ hơn. Thủ tục này sẽ được tiếp tục cho
đến khi thu được một hành trình đầy đủ tức là một phương án của bài toán
người du lịch. Khi đó ta cần xét những tập con các phương án nào có cận
dưới nhỏ hơn giá trị hàm mục tiêu tại phương án tìm được. Quá trình phân
nhánh và tính cận dưới trên tập các phương án của bài toán thông thường
cho phép rút ngắn một cách đáng kể quá trình tìm kiếm do ta loại được khá
nhiều tập con chắc chắn không chứa phương án tối ưu.
Thủ tục rút gọn(chi phí cận dưới): rõ ràng tổng chi phí của một hành
trình của người đi du lịch sẽ chứa đúng một phần tử của mỗi dòng và đúng
một phần tử của mỗi cột trong ma trận chi phí C. Do đó nếu ta trừ với mỗi
phần tử của dòng(haycột) của ma trận C đi cùng một số α thì chi phí của tất
cả các hành trình cũng sẽ giảm đi α, vì thế hành trình tối ưu cũng sẽ không
thay đổi. Vì vậy nếu ta tiến hành trừ bớt các phần tử của mỗi dòng và mỗi cột
của nó đi phần tử “khác 0 nhỏ nhất” thì ma trận thu được ma trận gồm các
phần tử không âm mà trong mỗi dòng và mỗi cột của nó đều có ít nhất một
số 0 thì tổng các hằng số trừ đó sẽ cho ta cận dưới của mọi hành trình. Thủ
tục trừbớt này sẽ được gọi là thủ tục rút gọn, các hằng sốtrừ ở mỗi dòng(cột)
sẽ được gọi là hằng số rút gọn theo dòng(cột) còn ma trận thu được gọi là ma
trận rút gọn.
Bài toán người đi du lịch
Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng
Trang 12
Thủ tục rút gọn:
Input C(n,n)
Duyệt các hàng của ma trận 1<=i<=n
- Chọn các phần tử khác không nhỏ nhất trên mỗi hang αi
- Trừ các phần tử của mỗi hàng đi αi tức là Cij=cij - αi, 1<=j<=n
Duyệt các cột của ma trận 1<=j<=n
- Chọn phần tử khác không nhỏ nhất trên mỗi cột βj
- Trừ các phần tử của mỗi cột đi βj tức là Cij=cij - βi , 1<=j<=n
Tính M= ∑ 𝛼𝑖𝑛
𝑖=1 + ∑ 𝛽𝑖𝑛
𝑖=1 (Gọi là chi phí cận dưới của các hành trình)
Output C*
(n,n),M
Thủ tục chọn cungphân nhánh: Như trên đã thực hiện sau khi rút gọn
trên mỗi hang, mỗi cột của ma trận chứa ít nhất một phần tử 0, đối với mỗi
phần tử o này ta tính chỉ số của nó là tổng các phần tử khác phần tử 0 đang
xét và nhỏ nhất tương ứng với hang và cột đó. Chọn phàn tử o có chỉ số lớn
nhất, tương ứng với cung cần chọn để phân nhánh và đặt phần tử đối xứng
với nó qua đường chéo là ∞.
Thủ tục chọn cung phân nhánh
Input C(n,n)
Duyệt các hàng của ma trận 1<=i<=n
- Chọn phần tử o trên mỗi hàng là(i,j)
- Tìm phần tử khác phần tử 0 đang xét và nhỏ nhất trên hàng i là ri và
phần tử 0 đang xét và nhỏ nhất trên cột j là sj
- B(I,j)= ri+sj
Tính Max{B(I,j): 1<=i<=n; 1<=j<=n;} ta được cung (p,q) và đặt Cqp=∞
Output (p,q)
Chú ý: Trong quá trình tính toán giá trị ∞ được coi là rất lớn, các phép
cộng và trừ không làm suy chuyển giá trị.
Sau khi đã tiến hành tính cận dưới và phân nhánh, chia cách hành trình
làm hai tập con, Tập T1 gồm các hành trình chứa cung(p,q) và tập T2 gồm các
hành trình không chứa cung(p,q).
Đối với T1 ma trận chi phí tương ứng C1 nhận được từ ma trận C bằng
cách loại bỏ hàng p và cột q tức là kích thước của ma trận giảm xuống một
bậc.
Đối với T2 ma trận chi phí tương ứng C2 nhận được từ ma trận C bằng
cách đặt Cpq=∞, tức là trong các bước tiếp theosẽ không được chọn lại cung
(p,q) nữa.
Bài toán người đi du lịch
Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng
Trang 13
Đệquy thuậttoán: Sau khi thực hiện việc rút gọn và phân nhánh, chúng
ta đã tách các hành trình thành hai nhánh, trên mỗi nhánh này ma trận chi
phí được thay đổi, như vậy ở mỗi nhánh, bàitoán được quaytrở lại dạng ban
đầu, kích thước nhỏ hơn với T1 và được giữ nguyên với T2 với số phần tử
khác ∞ bớt đi một. như vậy thuật toán này có tính đệ quy. Các bước tiếp theo
để giải quyết bàitoán được thực hiện lần lượt các thủ tục trên chomỗi nhánh.
Để hạn chế các phương án cần xét ta sẽ chọn nhánh có chi phí cận dưới
thấp hơn.
Ngăn cấm tao chu trình con kín: Theonội dung của bàitoán, một hành
trình hợp lệ là phải điqua tất cả các thành phốtrong danh sách, nói cách khác
hành trình sẽ tạo thành một vòng khép kín. Vấn đề đặt ra là nếu trong danh
sách chưa đủ mặt các thành phố mà hành trình đã tạo thành một vòng con
khép kín, hiện tượng này được gọi là tạo thành chu trình con kín, do đó trong
quá trình thực hiện thủ tục chon cung và phân nhánh cần loại bỏ khả năng
tạo thành chu trình con kín.
Tổng quát hơn khi phân nhánh dựa vào cung(p,q) ta phảithêmcạnh này
vào hành trình, ở mỗi bước lựa chọn cung để kết nạp vào ta cần phải kiểm
tra và xem xét nó có tạo thành chu trình con kín khi kết hợp với các cung đã
có hay không ? nếu có ta cần loại bỏ cung này và chọn cung có độ ưu tiên(đô
ưu tiên được xác định bởi phần tử 0 có chỉ số bằng hoặc nhỏ hơn) tiếp theo.
Thủ tục kiểm tra chu trình con kín:
Input S danh sách các cung đã chọn; cung mới(p,q)
Nếu N(S)<n thì
- Sắp xếp lại các cung trong tập S`=S ∪(p,q) theo dạng danh sách.
- Trên đỉnh đầu trùng đình cuối trong S` thì KT= False ngược lại KT=
True và S= S`.
- Output S,KT
Theo tính chất đệ quycủa thuật toán kích thước của các ma trận chi phí
C sẽ giảm dần theo một nhánh, cuối cùng ma trận C có kích thước 2x2 thì
chấm dứt việc phân nhánh và kết nạp 2 cạnh còn lại để thu được hành trình
của người đi du lịch. Dễ nhận thấy rằng ma trận rút gọn cuối cùng này chỉ có
thể là một trong hai dạng sau:
𝑎 0
0 𝑑
và
0 𝑐
𝑑 0
Trong đó u, v, w, x có thể là 4 đỉnh khác nhau hoặc chỉ có 3 đỉnh khác
nhau, khi đó ta sẽ chọn đưa vào hành trình các cung ứng với phần tử 0.
Thực hiện các thủ tục trên kết thúc ta được hành trình T với chiphí thực
tế là G, nếu giá trị G nhỏ hơn tất cả các chi phí cận dưới M của các nhánh đã
bỏ qua, thì hành trình nhận được là hành trình tối ưu, mặt khác nếu G lớn
hơn giá trị cận dưới P của một nhánh nào đó thì hành trình tìm được chưa
Bài toán người đi du lịch
Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng
Trang 14
phải là hành trình tối ưu, khi đó tiếp tục áp dụng thuật toán cận nhánh cho
nhánh này để tìm hành trình mới.
Cài đặt và code của thuật toán cận nhánh:
int n,c[100][100],x[100],chuaxet[100],kq[100];
int MIN=0;
int a=1;
// Nhap du leu dau vao
void Init()
{
cout<<"n So thanh pho="; cin>>n; //Nhap so thanh pho
cout<<"n Nhap chi phi n"; // nhap chi phi cho tuung cung duong
for(int i=1;i<=n;i++) // tu thanh pho i den t hanh pho j
for(int j=1;j<=n;j++)
{
if(i!=j)
{
cout<<"c["<<i<<"]["<<j<<"]="; cin>>c[i][j];
}
else c[i][j]=0;
}
x[1]=1;
for(int i=2;i<=n;i++) // nhung thanh pho chua xet
{
chuaxet[i]=1;
}
}
// ham hien ket qua cua bai toan
void Result(){
cout<<"n T1->"; // bat dau tu dinh so 1
for(int i=2;i<=n;i++) cout<<"T"<<kq[i]<<"->";// hien thi cac dinh tiep
cout<<"T1";// ket thu o dinh so 1
cout<<"n Tong chi phi la: "<<MIN; // hien thi chi phi cua hanh tirnh
}
void Work(){
int S=0;
for(int i=1;i<=n-1;i++){
S=S+c[x[i]][x[i+1]];
}
S=S+c[x[n]][1];
if(S<MIN||a==1){ a=0;
Bài toán người đi du lịch
Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng
Trang 15
MIN=S;
for(int i=1;i<=n;i++) kq[i]=x[i];
}
}
void Try(int i){
for(int j=2;j<=n;j++){
if(chuaxet[j]){
x[i]=j; chuaxet[j]=0;
if(i==n)
{
Work();
}
else
{
Try(i+1);
chuaxet[j]=1;
}
}
}
}
main(){
Init();
Try(2);
Result();
getch();
}
Bài toán người đi du lịch
Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng
Trang 16
CHƯƠNG III ĐÁNH GIÁ THUẬT TOÁN
1. Thuật toán vét cạn
Thuật toán vét cạn là thuật toán chính xác nhất để giải quyết bài toán
người đi du lịch lần được hành trình tối ưu nhất theo một cấu trúc rõ ràng
nhất, Nhưng do độ phức tạp của thuật toán là O(n!), gây nên gánh nặng cho
các công cụ tính toán không đáp ứng được, có nghĩa là thời gian giải quyết
được bài toán không thực tế(mất nhiều thời gian) nếu số lượng các thành
phố là con số lớn.
Nhưng phương pháp vét cạn có thể được cải tiến và làm cơ sở cho
phương pháp nhánh cận. Phương pháp nhánh cận sử dụng một hàm tính cận
để ước tính trước chi phí tối thiểu(cận chi phí) có thể đạt được đối với các
kết quả có thể xảy ra, nếu cận này không thấp hơn kết quả của các hành trình
đã biết thì toàn bộ các hành trình đó có thể bỏ qua.
Vét cạn+Hàm điều kiện= Quay lui.
Vét cạn+ Hàm tính cận = Nhánh cận.
2. Thuật toán láng giềng gần nhất
Thuật toán Láng giềng gần nhất là thuật toán đầu tiên dùng để tìm lời
giải cho bài toán toán Người đi du lịch, và thường cho kết quả chênh lệch
trong phạm vi 20% so với đường đi tối ưu. Nó chạy nhanh hơn rất nhiều so
với thuật toán vét cạn(việc kiểm tra hết mọi tuyến đường) và thuật toán cận
nhánh.
Thuật toán láng giềng gần nhất dễ cài đặt và chạy nhanh, những đôi khi
nó có thể bỏqua các tuyến đường ngắn hơn mà mắt thường có thể nhìn ra(số
thành phố ít). Kết quả của thuật toán này cần được kiểm tra trước khi sử
dụng đề phòng trường hợp một tuyến đường ngắn hơn(tối ưu hơn) bị bỏ
qua.
Các bước của thuật toán:
1. Chọn một thành phố bất kỳ làm điểm xuất phát và đây là thành phố
hiện hành.
2. Đánh dấu thành phố hiện hành là đã đi qua.
3. Tìm các thành phố chưa đi qua có chi phí đến thành phố hiện hành là
ngắn nhất, đánh dấu thành phố đó là thành phố hiện hành.
4. Nếu chưa đi qua tất cả cách thành phố thì quay lại bước 2.
Thứ tự các thành phố đi qua chính là kết quả của thuật toán và tổng chi
phí đi qua các thành phố là chi phi của hành trình đó.
Trong trường hợp xấu nhất, thuật toán này có thể tính toán ra các tuyến
đường dài gấp n lần tuyến đường tối ưu. Trong đó n là tỷ lệ tùy ý, nghĩa là
Bài toán người đi du lịch
Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng
Trang 17
với mỗi hằng số n, tồn tại một bài toán người đi du lịch sao cho độ dài các
tuyến đường là kết quả của thuật toán láng giềng gần nhất hơn hoặc bằng n
lần độ dài của tuyến đường tối ưu.
3. Thuật toán nhánh cận
Phương pháp nhánh cận là phương pháp cảitiến của phương pháp quay
lui để đảm bảo thời gian cũng như kỹ thuật khi mà phương pháp quay lui và
phương pháp vét cạn không đáp ứng được với những bài toán có không gian
lời giải quá lớn.
Phương pháp nhánh cận được thực hiện như sau: Trong qua trình duyệt
các thành phố ta luôn giữ lại một phương án mẫu(có thể xem là lời giải tối
ưu cục bộ- nó là giá trị tối ưu tại thời điểm đó – là cận). Đánh giá các nhánh
cận xem có phảilà phương án có thể tốt hơn phương án mẫu hay không. Nếu
không ta lựa chọn theo hướng khác.
Rõ ràng việc áp dụng thuật toán nàytrong rất nhiều trường hợp ta có thể
tìm được hành trình tối ưu nhanh hơn so với phương pháp vét cạn và có
được kết quả tin cậy hơn phương pháp láng giềng gần nhất, vấn đề đặt ra là
việc liệt kê tất cả các hành trình tối ưu cũng có thể thực hiện được bằng thuật
toán trên với những cải tiến và kỹ thuật lập trình hợp lý.
4. Giới thiệu một số thuật toán khác
4.1 Các giải thuật để tìm lời giải chính xác
Lời giải trực tiếp nhất có thể là thử tất cả các hoán vị và xem hoán vị nào
là tốt nhất ( dùng brute-force) . Thờigian chạy chocách tiếp cận này là O(n!),
vì vậy cách tiếp cận này thậm chí không thể thực hiện với chỉ 20 thành phố
.Một trong sốnhững ứng dụng mới đây nhất của quyhoạch động là giải thuật
có độ phức tạp O(n2
2n
) và yêu cầu không gian bộ nhớ là hàm mũ.
Cải thiện tốc độ cho cách giải thuật trên là hầu như không thể. Ví dụ,
thậm chí là rất khó tìm một giải thuật chính xác cho bài toán Người đi du lịch
(Travelling Salesman problem (TSP)) chạy trong độ phức tạp O(1.9999n
).
Những cách tiếp cận khác bao gồm
 Rất nhiều giải thuật branch-and-bound, có thể sử dụng để giải các bài
toán TSP với khoảng 40-60 thành phố.
 Các giải thuật cải thiện dần dần sử dụng kỹ thuật ghi nhớ lại của linear
programming. Có thể làm việc tốt cho khoảng 200 thành phố.
 Thực hiện branch-and-bound và cut cho các bài toán cụ thể , đây là
phương thức sử dụng để giải quyết các bàitoán với số lượng lớn thành
phố. Cách tiếp cận này đang giữ kỷ lục hiện tại giải quyết được bài toán
TSP với 85,900 thành phố.
Lời giải chính xác cho bài toán với 15,112 thành phố ở đức từ TSPLIB đã
được tìm ra năm 2001 sử dụng phương thức lát cắt đề xuất bởi George
Dantzig, Ray Fulkerson, và Selmer Johnson vào năm 1954, dựa trên linear
programming. Quá trình tính toán đã được thực hiện trong mạng máy tính
Bài toán người đi du lịch
Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng
Trang 18
gồm 110 bộ vi xử lý tại đại học Rice University và Princeton University. Tổng
thời gian tính toán tương đương với 22.6 năm trong một máy đơn vi xử lý
tốc độ 500 MHz. Vào tháng 5-2004, bài toán người du lịch thăm tất cả 24,978
thành phốở thụyđiển đã được giải quyết : đoạn đường ngắn nhất vào khoảng
72,500 kilomet đã được tìm thấy và đã được chứng minh rằng không có
đường đi nào ngắn hơn.
Vào tháng 3- 2005, bài toán người du lịch với 33,810 điểm trong 1 mạch
in đã được giải quyết sử dung công cụ Concorde TSP Solver: đoạn đường tối
ưu dài 66,048,945 đơn vị đã được tìm thấy và đã được chứng minh không có
đường đi nào ngắn hơn tổng khối lượng tính toán mất khoảng 15.7 năm CPU
(Cook et al. 2006). Vào tháng 4 năm 2006 một bài toán với 85,900 điểm cũng
đã được giải quyết bởi Concorde TSP Solver, và mất khoảng 136 năm CPU .
4.2 Heuristic và các giải thuật xấp xỉ
Rất nhiều heuristics và giải thuật xấp xỉ, có thể đưa ra nhanh chóng lời
giải tốt đã được đề xuất. Các phương thức hiện đại có thể tìm lời giải cho bài
toán cực lớn (hàng triệu thành phố) trong khoảng thời gian chấp nhận được
với lời giải xấp xỉ chỉ khác 2-3% so với lời giải tối ưu.
Một vài kiểu heuristic đã được tìm ra.
Heuristics xây dựng
Giải thuật láng giềng gần nhất nearest neighbour (NN) (hay còn gọi là
giải thuật tham lam greedy algorithm) để cho người du lịch chọn thành phố
gần nhất chưa thămtrong lần dichuyển tiếp theo. Giải thuật nàynhanh chóng
đưa ra một đường đi ngắn và hiệu quả . Cho khoảng N thành phố phân bố
ngẫu nhiêu trên mặt phẳng trung bình giải thuật này đưa ra lời giải có chiều
dài xấp xỉ 1.25 * lần chiều dài của đường đi tối ưu.
Tuy nhiên, có nhiều cách sắp xếp đặc biệt các thành phố làm cho giải
thuật NN đưa ra đường đi tồi tệ nhất (Gutin, Yeo, and Zverovich, 2002). Điều
này đúng chocả bài toán TSP đối xứng và bất đối xứng (Gutin and Yeo, 2007).
Gần đây một heuristic mới được đưa ra ,Match Twice and Stitch (MTS)
(Kahng, Reda 2004. MTS đã cho thấy tính hiệu quả hơn hẳn so với những
heuristic xây dựng hiện tại . MTS thực hiện hai lần khớp tuần tự , mà lần
khớp thứ 2 được thực hiện sau khi xóa tất cả các cạnh của lần khớp thứ nhất,
để đưa ra tập tất cả các chu trình. Sau đó chu trình được đóng lại để đưa ra
đường đi cuối cùng..
Bài toán người đi du lịch
Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng
Trang 19
Cải tiến từng bước
 Chuyển cặp, hay heuristic Lin-Kernighan.
Kỹ thuật chuyển cặp hay '2-opt' bao gồm việc lặp lại việc xóa 2 cạnh và
thay chúng bằng hai cạnh khác nối đoạn tạo bởi cạnh bị xóa tạothành đường
di ngắn hơn. Đây là trường hợp đặc biệt của phương thức k-opt.
k-opt heuristic
Lấy một đường đi và xóa k cạnh đôi một không cóđiểm chung. Xâyđựng
lại đường đi từ những mảnh còn lại để không có hai mảnh đường đi nào lối
với nhau (không nối hai điểm đầu cuối của 2 mảnh với nhau sẽ tạo thành
đường đi khép kín). Điều này làm đơn giản hóabài toán TSP thành bài toán
đơn giản hơn rất nhiều. Mỗi điểm đầu cuối có thể được nối tới 2k − 2 điểm
khác có thể: trong số 2k tổng sốđiểm đầu cuốicó thể, trừ ra hai điểm đầu cuối
của mảnh đang xem xét . Bài toán đơn giản hóa 2k thành phố TSP có thể giải
sử dụng brute force để tìm tổ hợp tốt nhất của các mảnh ban đầu. Kỹ thuật
k-opt là trường hợp riêng của kỹ thuât V-opt hay variable-opt . Kỹ thuật phổ
biến của k-opt là 3-opt, được giới thiệu bởi Shen Lin của Bell Labs vào năm
1965. Có một trường hợp đặc biệt của 3-opt khimà cách cạnh là cóthể không
nhất thiết không có điểm chung (hai trong số các cạnh kề với nhau). Trong
thực tế, có thể đạt được những phát triển đáng kể của kỹ thuật 2-opt không
nhất thiết phải sử dụng 3-opt bằgn cách giới hạn 3-changes thành trườn hợp
riêng với hai cạnh xóa đi nối với nhau. Kỹ thuật này được gọi là 2.5-opt nằm
giữa 2-opt và 3-opt, hiểu theo cả 2 nghĩa của chất lượng lời giải đạt được và
thời gian để tìm được lời giải.
V'-opt heuristic
Kỹ thuật variable-opt method giống như , nhưng là sự tông quát hóa của
k-opt kỹ thuật. Trong khi kỹ thuật k-opt xóa đi một số lựong cố định (k) cạnh
từ đường đi ban đầu kỹ thuật variable-opt không xóa đi một số lượng cạnh
cố định. Thay vì vậy nó phát triển tập này khi quá trình tìm kiếm tiếp tục.
Phương thức nổi tiếng trong gia đình này là phương thức Lin-Kernighan .
Shen Lin và Brian Kernighan lần đầu tiên đưa ra phương thức của họ năm
1972 và nó là heuris tic đáng tin cậy nhát cho việc giải bài toán người du lịch
trong suốt hai thập kỷ . Những kỹ thuật tiên tiến hơn được phát triển tại Bell
Labs cuối những năm 1980 bởi David Johnson và đội nghiên cứu của ông.
Những phương thức này , đôi khi được gọi là Lin-Kernighan-Johnson xây
dựng trên phương thức Lin-Kernighan , thêm ý tưởng từ tabu search và
evolutionary computing. Kỹ thuật cơ sở Lin-Kernighan technique mang lại
kết quả được đảm bảo ít nhất là bằn so với 3-opt. Phương thức Lin-
Kernighan-Johnson tính một đường đi Lin-Kernighan , và sau đó xáo trộn
đường đi bằng cách đột biến (xóa ít nhất 4 cạnh và nối lại đường đi bằng cách
khác , sau đó thực v-opt trên đường đi mới ). Quá trình đột biến thường đủ
Bài toán người đi du lịch
Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng
Trang 20
để di chuyển đường đi ra khỏi cục bộ địa phương ( local minimum ). Kỹ thuật
V-opt được xem như một trong số những heuristic mạnh cho bài toán và có
thể giải quyết các trường hợp đặc biệt, như bài toán chu trình Hamilton và
những bài toán TSP không phải metric mà những heuristic khác không giải
quyết được.
KẾT LUẬN
Có rất nhiều ý tưởng cũng như thuật toán được nghiên cứu và đề xuất
để giải quyết bài toán Người đi du lịch, kết quả đưa ra của các thuật toán là
hành trình ngắn nhất (có thể tính toán được) để đi qua các thành phố.
Đô phức tạp của thuật toán phụ thuộc vào việc lựa chọn cấu trúc dữ liệu
cài đặt. Nếu ta chọn cấu trúc dữ liệu để cài đặt là danh sách thì làm tăng độ
khó khi cài đặt những giảm thời gian thực hiện. Nếu ta chuyển từ danh sách
các cung đường đi đã cho về dạng ma trận chi phí thì quá trình cài đặt sẽ dễ
dàng hơn những lại làm tốn thời gian thực hiện và dung lượng bộ nhớ, nếu
như số lượng thành phốlà lớn thì lựa chọn phương pháp này cố vẻ không tối
ưu.
Qua kết quả thực nghiệmvới số thành phốbé hơn 100 thì thuật toán cho
kết quả tốt với thời gian có thể chấp nhận được.
Tuy nhiên do trình độ hạn chế của bản thân nên trong quá trình giải
quyết bài toán, chung em chưa phân tích và giải quyết được tình huống đặc
biệt có thể xảy ra(Như trường hợp nào phương pháp nhánh cận trở thành
vét cạn, …).
Chúng em mong được Thầyvà các bạn đông góp để chúng em giải quyết
bài toán được tốt hơn.
TÀI LIỆU THAM KHẢO
[1]. PGS. Ts. Đào Thanh Tĩnh, Tập bài giảng môn phần tích và đánh giá thuật toán, 2015
[2]. PGS. Ts. Đỗ Xuân Lôi, Cấu trúc dữ liệu và giải thuật, NXB Thống Kê, 2001
[3]. PGS.TSKH Vũ Đình Hòa, Thuật toán và đánh giá độ phức tạp thuật toán
[4]. Lê Minh Hoàng, Giải thuật và lập trình, DDH Sư Phạm Hà Nội, 2002
[5]. Trần Tuấn Minh, Thiết kế và đánh giá thuật toán.
Bài toán người đi du lịch
Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng
Trang 21
Code Demo thuật toán láng giềng gần nhất
int n; // So thanh pho
int c[100][100]; // ma tran chi phi
int x[100];// khai bao mang cac thanh pho da di qua
int chuaxet[100];// khai bao mang luu cac thanh pho da di qua
int kq[100]; // Khai bao mang luu tru duong di cho chi phi nho nhat
int MIN=0; // khai bao bien luu tru chi phi nho nhat cua doan duong tim duoc.
int a=1;// a=1 chua co duong di nao duoc tim; a=0 da co duong di duoc tim
// ham nhap du lieu dau vao
void Init(){
cout<<"n Nhap so luong thanh pho: "; cin>>n; // nhap so luong thanh pho
cout<<"Nhap chi phi cho cac cung duong n";
// nhap chi phi cho tung cung duong
for(int i=1; i<=n; i++)
for(int j=1;j<=n;j++){
if(i!=j){
cout<<"c["<<i<<"]["<<j<<"]="; cin>>c[i][j];// nhap chi phi cho tung cung
}
else{
c[i][j]=0;// i trung j chi phi =0(la 1 thanh pho).
}
}
// danh dau cac thanh pho chua xet.
x[1]=1; // dinh xuat phat la dinh 1
for(int i=2;i<=n;i++){ // danh dau tat ca cac thanh pho deu chua xet
chuaxet[i]=1;
}
}
// Ham hien thi ket qua cua thuat toan
void Result(){
// dinh dau tien
cout<<"n T1=>";
// cac dinh tiep theo
for(int i=2;i<=n;i++){
cout<<"T"<<kq[i]<<"=>";// lay danh sach cac dinh trong mang kq[i]
}
// quay ve dinh dau
cout<<"T1";
// chi phi cua hanh trinh
cout<<"n Chi phi cua hanh trinh la: "<<MIN;
}
// Ham tinh toan chi phi cho mot cung duong
void Work(){
int S=0; // khai bao bien de luu gia tri nhanh can
for(int i=1;i<=n-1;i++){
S=S+c[x[i]][x[i+1]];// tinh chi phi:= chi phi buoc truoc+ chi phi duon di truc tiep
}
S=S+c[x[n]][1];// cap nhat chi phi can nhanh tu dinh cuoi den dinh xuat phat
if(S<MIN||a==1){
a=0;
MIN=S;// Gan chi phi can nhanh bang chi phi hanh trinh
for(int i=1;i<=n;i++){
kq[i]=x[i];// ghi nho va gan cac dinh da xet vao ket qua
}
}
}
Bài toán người đi du lịch
Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng
Trang 22
// Ham thuc hien thu cac cach chon x[i]
void Try(){
for(int i=2;i<=n;i++){ // thu cho thanh pho thu 2 den n
int jmin=-1; // Bien luu thanh pho tim duoc
for(int j=2;j<=n;j++){
if(chuaxet[j]&&(jmin==-1)||c[x[i-1]][j]<c[x[i-1]][jmin]){
jmin=j;
}
}
x[i]=jmin;
chuaxet[jmin]=0;
}
Work();
}
// Chuong trinh chinh
main(){
Init();// ham nhap du lieu
Try();// thu chon bat dau tu x[2]
Result();// hien thi ket qua
getch();
}
Bài toán người đi du lịch
Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng
Trang 23
Code demo nhánh cận
int n; // So thanh pho
int c[100][100]; // ma tran chi phi
int x[100];// khai bao mang cac thanh pho da di qua
int chuaxet[100];// khai bao mang luu cac thanh pho da di qua
int kq[100]; // Khai bao mang luu tru duong di cho chi phi nho nhat
int MIN=0; // khai bao bien luu tru chi phi nho nhat cua doan duong tim duoc.
int a=1;// a=1 chua co duong di nao duoc tim; a=0 da co duong di duoc tim
// ham nhap du lieu dau vao
void Init(){
cout<<"n Nhap so luong thanh pho: "; cin>>n; // nhap so luong thanh pho
cout<<"Nhap chi phi cho cac cung duong n";
// nhap chi phi cho tung cung duong
for(int i=1; i<=n; i++)
for(int j=1;j<=n;j++){
if(i!=j){
cout<<"c["<<i<<"]["<<j<<"]="; cin>>c[i][j];// nhap chi phi cho cung duong
tu thanh pho i den thanh pho j
}
else{
c[i][j]=0;// i trung j chi phi =0(la 1 thanh pho).
}
}
// danh dau cac thanh pho chua xet.
x[1]=1; // dinh xuat phat la dinh 1
for(int i=2;i<=n;i++){ // danh dau tat ca cac thanh pho deu chua xet
chuaxet[i]=1;
}
}
// Ham hien thi ket qua cua thuat toan
void Result(){
// dinh dau tien
cout<<"n T1=>";
// cac dinh tiep theo
for(int i=2;i<=n;i++){
cout<<"T"<<kq[i]<<"=>";// lay danh sach cac dinh trong mang kq[i]
}
// quay ve dinh dau
cout<<"T1";
// chi phi cua hanh trinh
cout<<"n Chi phi cua hanh trinh la: "<<MIN;
}
// Ham tinh toan chi phi can nhanh
void Work(){
int S=0; // khai bao bien de luu gia tri nhanh can
for(int i=1;i<=n-1;i++){
S=S+c[x[i]][x[i+1]];// tinh chi phi:= chi phi buoc truoc+ chi phi duon di truc tiep
}
S=S+c[x[n]][1];// cap nhat chi phi can nhanh tu dinh cuoi den dinh xuat phat
if(S<MIN||a==1){
a=0;
MIN=S;// Gan chi phi can nhanh bang chi phi hanh trinh
for(int i=1;i<=n;i++){
kq[i]=x[i];// ghi nho va gan cac dinh da xet vao ket qua
}
}
Bài toán người đi du lịch
Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng
Trang 24
}
// Ham thuc hien thu cac cach chon x[i]
void Try(int i){
for(int j=2;j<=n;j++){ // thu cho thanh pho thu 2 den n
if(chuaxet[j]){ // neu gap thanh pho chua di qua
x[i]=j; // thu di qua thanh pho
chuaxet[j]=0; // danh dau thanh pho
if(i==n) Work(); // goi ham tinh toan và cap nhat can
else Try(i+1); // goi de quy chonj tiep i+1
chuaxet[j]=1; // bo danh dau
}
}
}
// Chuong trinh chinh
main(){
Init();// ham nhap du lieu
Try(2);// thu chon bat dau tu x[2]
Result();// hien thi ket qua
getch();
}
Bài toán người đi du lịch
Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng
Trang 25
MỤC LỤC
LỜI MỞ ĐẦU.................................................................................................................................1
CHƯƠNG I: PHÂN TÍCH BÀI TOÁN ........................................................................................ 3
1. Phát biểu bài toán .................................................................................................................... 3
2. Giới thiệu về bài toán người đi du lich ................................................................................. 3
3. Mô tả chi tiết bài toán người đi du lịch.................................................................................4
CHƯƠNG II THIẾT KẾ GIẢI THUẬT........................................................................................5
1. Giải thuật chính xác.................................................................................................................5
2. Giải thuật gần đúng(hay gọi là xấp xỉ)...................................................................................6
2.1. Giải thuật láng giềng gần nhất .........................................................................................7
2.2. Thuật toán nhánh cận ......................................................................................................10
CHƯƠNG III ĐÁNH GIÁ THUẬT TOÁN................................................................................16
1. Thuật toán vét cạn...................................................................................................................16
2. Thuật toán láng giềng gần nhất.............................................................................................16
3. Thuật toán nhánh cận.............................................................................................................17
4. Giới thiệu một số thuật toán khác........................................................................................17
Các giải thuật để tìm lời giải chính xác............................................................................17
Heuristic và các giải thuật xấp xỉ......................................................................................18
Heuristics xây dựng............................................................................................................18
Cải tiến từng bước .............................................................................................................19
k-opt heuristic.....................................................................................................................19
V'-opt heuristic....................................................................................................................19
KẾT LUẬN....................................................................................................................................20
TÀI LIỆU THAM KHẢO.............................................................................................................20

More Related Content

What's hot

Hướng dẫn sử dụng phần mềm packet tracer
Hướng dẫn sử dụng phần mềm packet tracerHướng dẫn sử dụng phần mềm packet tracer
Hướng dẫn sử dụng phần mềm packet tracer
Bình Tân Phú
 
Thuật toán mã hóa rsa
Thuật toán mã hóa rsaThuật toán mã hóa rsa
Thuật toán mã hóa rsa
Bảo Điệp
 
Đề tài: Nghiên cứu thuật toán K-nearest neighbor, HAY, 9đ
Đề tài: Nghiên cứu thuật toán K-nearest neighbor, HAY, 9đĐề tài: Nghiên cứu thuật toán K-nearest neighbor, HAY, 9đ
Đề tài: Nghiên cứu thuật toán K-nearest neighbor, HAY, 9đ
Dịch vụ viết bài trọn gói ZALO 0917193864
 
Bài giảng Assembly
Bài giảng AssemblyBài giảng Assembly
Bài giảng Assembly
Bùi Công Thành
 
Phương pháp runge kutta giải gần đúng hệ phương trình vi phân đại số
Phương pháp runge kutta giải gần đúng hệ phương trình vi phân đại sốPhương pháp runge kutta giải gần đúng hệ phương trình vi phân đại số
Phương pháp runge kutta giải gần đúng hệ phương trình vi phân đại số
Khu Tiến
 
Báo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thông
Báo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thôngBáo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thông
Báo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thông
Huyen Pham
 
Chương trình Quản lý Nhà Sách
Chương trình Quản lý Nhà SáchChương trình Quản lý Nhà Sách
Chương trình Quản lý Nhà Sách
BIC
 
Phương pháp nhánh cận
Phương pháp nhánh cậnPhương pháp nhánh cận
Phương pháp nhánh cận
Diên Vĩ
 
Báo cáo đồ án tôt nghiệp: Xây dựng Website bán hàng thông minh
Báo cáo đồ án tôt nghiệp: Xây dựng Website bán hàng thông minhBáo cáo đồ án tôt nghiệp: Xây dựng Website bán hàng thông minh
Báo cáo đồ án tôt nghiệp: Xây dựng Website bán hàng thông minh
nataliej4
 
Phân tích thiết kế hệ thống thông tin PTIT
Phân tích thiết kế hệ thống thông tin PTIT Phân tích thiết kế hệ thống thông tin PTIT
Phân tích thiết kế hệ thống thông tin PTIT
NguynMinh294
 
Giáo trình Phân tích và thiết kế giải thuật - CHAP 1
Giáo trình Phân tích và thiết kế giải thuật - CHAP 1Giáo trình Phân tích và thiết kế giải thuật - CHAP 1
Giáo trình Phân tích và thiết kế giải thuật - CHAP 1
Nguyễn Công Hoàng
 
Đề thi mẫu trắc nghiệm cấu trúc dữ liệu cà giải thuật
Đề thi mẫu trắc nghiệm cấu trúc dữ liệu cà giải thuậtĐề thi mẫu trắc nghiệm cấu trúc dữ liệu cà giải thuật
Đề thi mẫu trắc nghiệm cấu trúc dữ liệu cà giải thuật
Hưởng Nguyễn
 
Thuật toán Nhân Bình Phương - demo
Thuật toán Nhân Bình Phương - demoThuật toán Nhân Bình Phương - demo
Thuật toán Nhân Bình Phương - demoCông Thắng Trương
 
7. tìm hiểu hàm băm md5 và ứng dụng
7. tìm hiểu hàm băm md5 và ứng dụng7. tìm hiểu hàm băm md5 và ứng dụng
7. tìm hiểu hàm băm md5 và ứng dụng
Sai Lemovom
 
C# Báo cáo môn lập trình hướng đối tượng - Xây dựng chương trinh quản lí sinh...
C# Báo cáo môn lập trình hướng đối tượng - Xây dựng chương trinh quản lí sinh...C# Báo cáo môn lập trình hướng đối tượng - Xây dựng chương trinh quản lí sinh...
C# Báo cáo môn lập trình hướng đối tượng - Xây dựng chương trinh quản lí sinh...
Long Kingnam
 
BÁO CÁO CÔNG NGHỆ PHẦN MỀM 8 điểm-QUẢN LÝ CỬA HÀNG BÁN MÁY ẢNH
BÁO CÁO CÔNG NGHỆ PHẦN MỀM 8 điểm-QUẢN LÝ CỬA HÀNG BÁN MÁY ẢNHBÁO CÁO CÔNG NGHỆ PHẦN MỀM 8 điểm-QUẢN LÝ CỬA HÀNG BÁN MÁY ẢNH
BÁO CÁO CÔNG NGHỆ PHẦN MỀM 8 điểm-QUẢN LÝ CỬA HÀNG BÁN MÁY ẢNH
Hoà Đoàn
 
Đề tài: Phần mềm quản lý thông tin sinh viên, HOT, 9đ
Đề tài: Phần mềm quản lý thông tin sinh viên, HOT, 9đĐề tài: Phần mềm quản lý thông tin sinh viên, HOT, 9đ
Đề tài: Phần mềm quản lý thông tin sinh viên, HOT, 9đ
Dịch vụ viết bài trọn gói ZALO 0917193864
 
Hướng dẫn giải bài tập chuỗi - Toán cao cấp
Hướng dẫn giải bài tập chuỗi - Toán cao cấpHướng dẫn giải bài tập chuỗi - Toán cao cấp
Hướng dẫn giải bài tập chuỗi - Toán cao cấp
Van-Duyet Le
 
Bai tap va loi giai sql
Bai tap va loi giai sqlBai tap va loi giai sql
Bai tap va loi giai sql. .
 
báo cáo hệ quản trị cơ sỡ dữ liệu hệ thống bán cà phê
báo cáo hệ quản trị cơ sỡ dữ liệu hệ thống bán cà phêbáo cáo hệ quản trị cơ sỡ dữ liệu hệ thống bán cà phê
báo cáo hệ quản trị cơ sỡ dữ liệu hệ thống bán cà phê
thuhuynhphonegap
 

What's hot (20)

Hướng dẫn sử dụng phần mềm packet tracer
Hướng dẫn sử dụng phần mềm packet tracerHướng dẫn sử dụng phần mềm packet tracer
Hướng dẫn sử dụng phần mềm packet tracer
 
Thuật toán mã hóa rsa
Thuật toán mã hóa rsaThuật toán mã hóa rsa
Thuật toán mã hóa rsa
 
Đề tài: Nghiên cứu thuật toán K-nearest neighbor, HAY, 9đ
Đề tài: Nghiên cứu thuật toán K-nearest neighbor, HAY, 9đĐề tài: Nghiên cứu thuật toán K-nearest neighbor, HAY, 9đ
Đề tài: Nghiên cứu thuật toán K-nearest neighbor, HAY, 9đ
 
Bài giảng Assembly
Bài giảng AssemblyBài giảng Assembly
Bài giảng Assembly
 
Phương pháp runge kutta giải gần đúng hệ phương trình vi phân đại số
Phương pháp runge kutta giải gần đúng hệ phương trình vi phân đại sốPhương pháp runge kutta giải gần đúng hệ phương trình vi phân đại số
Phương pháp runge kutta giải gần đúng hệ phương trình vi phân đại số
 
Báo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thông
Báo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thôngBáo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thông
Báo cáo bài tập lớn môn Cơ sở dữ liệu - Học viện công nghệ bưu chính viễn thông
 
Chương trình Quản lý Nhà Sách
Chương trình Quản lý Nhà SáchChương trình Quản lý Nhà Sách
Chương trình Quản lý Nhà Sách
 
Phương pháp nhánh cận
Phương pháp nhánh cậnPhương pháp nhánh cận
Phương pháp nhánh cận
 
Báo cáo đồ án tôt nghiệp: Xây dựng Website bán hàng thông minh
Báo cáo đồ án tôt nghiệp: Xây dựng Website bán hàng thông minhBáo cáo đồ án tôt nghiệp: Xây dựng Website bán hàng thông minh
Báo cáo đồ án tôt nghiệp: Xây dựng Website bán hàng thông minh
 
Phân tích thiết kế hệ thống thông tin PTIT
Phân tích thiết kế hệ thống thông tin PTIT Phân tích thiết kế hệ thống thông tin PTIT
Phân tích thiết kế hệ thống thông tin PTIT
 
Giáo trình Phân tích và thiết kế giải thuật - CHAP 1
Giáo trình Phân tích và thiết kế giải thuật - CHAP 1Giáo trình Phân tích và thiết kế giải thuật - CHAP 1
Giáo trình Phân tích và thiết kế giải thuật - CHAP 1
 
Đề thi mẫu trắc nghiệm cấu trúc dữ liệu cà giải thuật
Đề thi mẫu trắc nghiệm cấu trúc dữ liệu cà giải thuậtĐề thi mẫu trắc nghiệm cấu trúc dữ liệu cà giải thuật
Đề thi mẫu trắc nghiệm cấu trúc dữ liệu cà giải thuật
 
Thuật toán Nhân Bình Phương - demo
Thuật toán Nhân Bình Phương - demoThuật toán Nhân Bình Phương - demo
Thuật toán Nhân Bình Phương - demo
 
7. tìm hiểu hàm băm md5 và ứng dụng
7. tìm hiểu hàm băm md5 và ứng dụng7. tìm hiểu hàm băm md5 và ứng dụng
7. tìm hiểu hàm băm md5 và ứng dụng
 
C# Báo cáo môn lập trình hướng đối tượng - Xây dựng chương trinh quản lí sinh...
C# Báo cáo môn lập trình hướng đối tượng - Xây dựng chương trinh quản lí sinh...C# Báo cáo môn lập trình hướng đối tượng - Xây dựng chương trinh quản lí sinh...
C# Báo cáo môn lập trình hướng đối tượng - Xây dựng chương trinh quản lí sinh...
 
BÁO CÁO CÔNG NGHỆ PHẦN MỀM 8 điểm-QUẢN LÝ CỬA HÀNG BÁN MÁY ẢNH
BÁO CÁO CÔNG NGHỆ PHẦN MỀM 8 điểm-QUẢN LÝ CỬA HÀNG BÁN MÁY ẢNHBÁO CÁO CÔNG NGHỆ PHẦN MỀM 8 điểm-QUẢN LÝ CỬA HÀNG BÁN MÁY ẢNH
BÁO CÁO CÔNG NGHỆ PHẦN MỀM 8 điểm-QUẢN LÝ CỬA HÀNG BÁN MÁY ẢNH
 
Đề tài: Phần mềm quản lý thông tin sinh viên, HOT, 9đ
Đề tài: Phần mềm quản lý thông tin sinh viên, HOT, 9đĐề tài: Phần mềm quản lý thông tin sinh viên, HOT, 9đ
Đề tài: Phần mềm quản lý thông tin sinh viên, HOT, 9đ
 
Hướng dẫn giải bài tập chuỗi - Toán cao cấp
Hướng dẫn giải bài tập chuỗi - Toán cao cấpHướng dẫn giải bài tập chuỗi - Toán cao cấp
Hướng dẫn giải bài tập chuỗi - Toán cao cấp
 
Bai tap va loi giai sql
Bai tap va loi giai sqlBai tap va loi giai sql
Bai tap va loi giai sql
 
báo cáo hệ quản trị cơ sỡ dữ liệu hệ thống bán cà phê
báo cáo hệ quản trị cơ sỡ dữ liệu hệ thống bán cà phêbáo cáo hệ quản trị cơ sỡ dữ liệu hệ thống bán cà phê
báo cáo hệ quản trị cơ sỡ dữ liệu hệ thống bán cà phê
 

Viewers also liked

He co so tri thuc bc2
He co so tri thuc bc2He co so tri thuc bc2
He co so tri thuc bc2
Alex Bui
 
Chapter 01 Planning Computer Program (re-upload)
Chapter 01 Planning Computer Program (re-upload)Chapter 01 Planning Computer Program (re-upload)
Chapter 01 Planning Computer Program (re-upload)
bluejayjunior
 
Hinh hoa bkhn
Hinh hoa bkhnHinh hoa bkhn
Hinh hoa bkhn
thanhtamyb
 
[Quản trị Marketing B2B] Phân tích Marketing B2B
[Quản trị Marketing B2B] Phân tích Marketing B2B [Quản trị Marketing B2B] Phân tích Marketing B2B
[Quản trị Marketing B2B] Phân tích Marketing B2B
Vu Huy
 
Dự án trồng dược liệu kết hợp rau sạch ngắn ngày
Dự án trồng dược liệu kết hợp rau sạch ngắn ngàyDự án trồng dược liệu kết hợp rau sạch ngắn ngày
Dự án trồng dược liệu kết hợp rau sạch ngắn ngày
Lập Dự Án Đầu Tư Thảo Nguyên Xanh
 
Hướng dẫn xây dựng ma trận trong QUẢN TRỊ Chiến lược
Hướng dẫn xây dựng ma trận trong QUẢN TRỊ Chiến lượcHướng dẫn xây dựng ma trận trong QUẢN TRỊ Chiến lược
Hướng dẫn xây dựng ma trận trong QUẢN TRỊ Chiến lược
guest3c41775
 
Algorithms and Flowcharts
Algorithms and FlowchartsAlgorithms and Flowcharts
Algorithms and Flowcharts
Deva Singh
 

Viewers also liked (7)

He co so tri thuc bc2
He co so tri thuc bc2He co so tri thuc bc2
He co so tri thuc bc2
 
Chapter 01 Planning Computer Program (re-upload)
Chapter 01 Planning Computer Program (re-upload)Chapter 01 Planning Computer Program (re-upload)
Chapter 01 Planning Computer Program (re-upload)
 
Hinh hoa bkhn
Hinh hoa bkhnHinh hoa bkhn
Hinh hoa bkhn
 
[Quản trị Marketing B2B] Phân tích Marketing B2B
[Quản trị Marketing B2B] Phân tích Marketing B2B [Quản trị Marketing B2B] Phân tích Marketing B2B
[Quản trị Marketing B2B] Phân tích Marketing B2B
 
Dự án trồng dược liệu kết hợp rau sạch ngắn ngày
Dự án trồng dược liệu kết hợp rau sạch ngắn ngàyDự án trồng dược liệu kết hợp rau sạch ngắn ngày
Dự án trồng dược liệu kết hợp rau sạch ngắn ngày
 
Hướng dẫn xây dựng ma trận trong QUẢN TRỊ Chiến lược
Hướng dẫn xây dựng ma trận trong QUẢN TRỊ Chiến lượcHướng dẫn xây dựng ma trận trong QUẢN TRỊ Chiến lược
Hướng dẫn xây dựng ma trận trong QUẢN TRỊ Chiến lược
 
Algorithms and Flowcharts
Algorithms and FlowchartsAlgorithms and Flowcharts
Algorithms and Flowcharts
 

Similar to Báo cáo bài tập lớn

Huong dan 8 o so
Huong dan 8 o soHuong dan 8 o so
Huong dan 8 o so
shjdunglv
 
Ctdlgt
CtdlgtCtdlgt
Ctdlgt
Lạnh BK
 
BTL VL1 NHÓM 10 L18.pdf
BTL VL1 NHÓM 10 L18.pdfBTL VL1 NHÓM 10 L18.pdf
BTL VL1 NHÓM 10 L18.pdf
nhanlamtrong173
 
Tom tat bai giang ly thuyet do thi - nguyen ngoc trung
Tom tat bai giang   ly thuyet do thi - nguyen ngoc trungTom tat bai giang   ly thuyet do thi - nguyen ngoc trung
Tom tat bai giang ly thuyet do thi - nguyen ngoc trung
kikihoho
 
Tom tat bai giang ly thuyet do thi - nguyen ngoc trung
Tom tat bai giang   ly thuyet do thi - nguyen ngoc trungTom tat bai giang   ly thuyet do thi - nguyen ngoc trung
Tom tat bai giang ly thuyet do thi - nguyen ngoc trung
Phi Phi
 
Mot so bai toan ung dung thuc te
Mot so bai toan ung dung thuc teMot so bai toan ung dung thuc te
Mot so bai toan ung dung thuc te
Thai Duong Vu
 
Ứng dụng hình học để xác định một miền chứa điểm cho trước
Ứng dụng hình học để xác định một miền chứa điểm cho trướcỨng dụng hình học để xác định một miền chứa điểm cho trước
Ứng dụng hình học để xác định một miền chứa điểm cho trước
Dịch vụ viết bài trọn gói ZALO: 0909232620
 
Ly thuyet-do-thi-va-ung-dung - [cuuduongthancong.com]
Ly thuyet-do-thi-va-ung-dung - [cuuduongthancong.com]Ly thuyet-do-thi-va-ung-dung - [cuuduongthancong.com]
Ly thuyet-do-thi-va-ung-dung - [cuuduongthancong.com]
sieubebu
 
Colony bee mô phỏng
Colony bee mô phỏngColony bee mô phỏng
Colony bee mô phỏngthanhnga_hera
 
GIÁO ÁN CHUYÊN ĐỀ TOÁN 11 CẢ NĂM (CÁNH DIỀU) SOẠN THEO CÔNG VĂN 5512 (2 CỘT) ...
GIÁO ÁN CHUYÊN ĐỀ TOÁN 11 CẢ NĂM (CÁNH DIỀU) SOẠN THEO CÔNG VĂN 5512 (2 CỘT) ...GIÁO ÁN CHUYÊN ĐỀ TOÁN 11 CẢ NĂM (CÁNH DIỀU) SOẠN THEO CÔNG VĂN 5512 (2 CỘT) ...
GIÁO ÁN CHUYÊN ĐỀ TOÁN 11 CẢ NĂM (CÁNH DIỀU) SOẠN THEO CÔNG VĂN 5512 (2 CỘT) ...
Nguyen Thanh Tu Collection
 
bài tập cấu trúc dữ liệu 6
bài tập cấu trúc dữ liệu 6bài tập cấu trúc dữ liệu 6
bài tập cấu trúc dữ liệu 6
NguynMinh294
 
Luận văn: Mô hình đồ thị luồng và mối quan hệ với đồ thị, HAY
Luận văn: Mô hình đồ thị luồng và mối quan hệ với đồ thị, HAYLuận văn: Mô hình đồ thị luồng và mối quan hệ với đồ thị, HAY
Luận văn: Mô hình đồ thị luồng và mối quan hệ với đồ thị, HAY
Dịch vụ viết bài trọn gói ZALO 0917193864
 
Mpp04 521-r1201 v
Mpp04 521-r1201 vMpp04 521-r1201 v
Mpp04 521-r1201 vTrí Công
 
Chuyen de luong giac 1 www.mathvn.com
Chuyen de luong giac 1   www.mathvn.comChuyen de luong giac 1   www.mathvn.com
Chuyen de luong giac 1 www.mathvn.comhoabanglanglk
 
Chuong1 phan tichvathietkegiaithuat
Chuong1 phan tichvathietkegiaithuatChuong1 phan tichvathietkegiaithuat
Chuong1 phan tichvathietkegiaithuat
Quoc Nguyen
 
Chương 3.7. Bài toán luồng cực đại trong mạng v2.pdf
Chương 3.7. Bài toán luồng cực đại trong mạng v2.pdfChương 3.7. Bài toán luồng cực đại trong mạng v2.pdf
Chương 3.7. Bài toán luồng cực đại trong mạng v2.pdf
duybui207
 
Đề tài: Tìm nghiệm của một bài toán bằng cách xem xét tất cả các phương án có...
Đề tài: Tìm nghiệm của một bài toán bằng cách xem xét tất cả các phương án có...Đề tài: Tìm nghiệm của một bài toán bằng cách xem xét tất cả các phương án có...
Đề tài: Tìm nghiệm của một bài toán bằng cách xem xét tất cả các phương án có...
Viết thuê trọn gói ZALO 0934573149
 
Cq lt hdt-th2011-01-tuan09
Cq lt hdt-th2011-01-tuan09Cq lt hdt-th2011-01-tuan09
Cq lt hdt-th2011-01-tuan09. .
 

Similar to Báo cáo bài tập lớn (20)

Huong dan 8 o so
Huong dan 8 o soHuong dan 8 o so
Huong dan 8 o so
 
Ctdlgt
CtdlgtCtdlgt
Ctdlgt
 
Ctdlgt
CtdlgtCtdlgt
Ctdlgt
 
BTL VL1 NHÓM 10 L18.pdf
BTL VL1 NHÓM 10 L18.pdfBTL VL1 NHÓM 10 L18.pdf
BTL VL1 NHÓM 10 L18.pdf
 
Tom tat bai giang ly thuyet do thi - nguyen ngoc trung
Tom tat bai giang   ly thuyet do thi - nguyen ngoc trungTom tat bai giang   ly thuyet do thi - nguyen ngoc trung
Tom tat bai giang ly thuyet do thi - nguyen ngoc trung
 
Tom tat bai giang ly thuyet do thi - nguyen ngoc trung
Tom tat bai giang   ly thuyet do thi - nguyen ngoc trungTom tat bai giang   ly thuyet do thi - nguyen ngoc trung
Tom tat bai giang ly thuyet do thi - nguyen ngoc trung
 
Mot so bai toan ung dung thuc te
Mot so bai toan ung dung thuc teMot so bai toan ung dung thuc te
Mot so bai toan ung dung thuc te
 
Ứng dụng hình học để xác định một miền chứa điểm cho trước
Ứng dụng hình học để xác định một miền chứa điểm cho trướcỨng dụng hình học để xác định một miền chứa điểm cho trước
Ứng dụng hình học để xác định một miền chứa điểm cho trước
 
Chuong 3
Chuong 3Chuong 3
Chuong 3
 
Ly thuyet-do-thi-va-ung-dung - [cuuduongthancong.com]
Ly thuyet-do-thi-va-ung-dung - [cuuduongthancong.com]Ly thuyet-do-thi-va-ung-dung - [cuuduongthancong.com]
Ly thuyet-do-thi-va-ung-dung - [cuuduongthancong.com]
 
Colony bee mô phỏng
Colony bee mô phỏngColony bee mô phỏng
Colony bee mô phỏng
 
GIÁO ÁN CHUYÊN ĐỀ TOÁN 11 CẢ NĂM (CÁNH DIỀU) SOẠN THEO CÔNG VĂN 5512 (2 CỘT) ...
GIÁO ÁN CHUYÊN ĐỀ TOÁN 11 CẢ NĂM (CÁNH DIỀU) SOẠN THEO CÔNG VĂN 5512 (2 CỘT) ...GIÁO ÁN CHUYÊN ĐỀ TOÁN 11 CẢ NĂM (CÁNH DIỀU) SOẠN THEO CÔNG VĂN 5512 (2 CỘT) ...
GIÁO ÁN CHUYÊN ĐỀ TOÁN 11 CẢ NĂM (CÁNH DIỀU) SOẠN THEO CÔNG VĂN 5512 (2 CỘT) ...
 
bài tập cấu trúc dữ liệu 6
bài tập cấu trúc dữ liệu 6bài tập cấu trúc dữ liệu 6
bài tập cấu trúc dữ liệu 6
 
Luận văn: Mô hình đồ thị luồng và mối quan hệ với đồ thị, HAY
Luận văn: Mô hình đồ thị luồng và mối quan hệ với đồ thị, HAYLuận văn: Mô hình đồ thị luồng và mối quan hệ với đồ thị, HAY
Luận văn: Mô hình đồ thị luồng và mối quan hệ với đồ thị, HAY
 
Mpp04 521-r1201 v
Mpp04 521-r1201 vMpp04 521-r1201 v
Mpp04 521-r1201 v
 
Chuyen de luong giac 1 www.mathvn.com
Chuyen de luong giac 1   www.mathvn.comChuyen de luong giac 1   www.mathvn.com
Chuyen de luong giac 1 www.mathvn.com
 
Chuong1 phan tichvathietkegiaithuat
Chuong1 phan tichvathietkegiaithuatChuong1 phan tichvathietkegiaithuat
Chuong1 phan tichvathietkegiaithuat
 
Chương 3.7. Bài toán luồng cực đại trong mạng v2.pdf
Chương 3.7. Bài toán luồng cực đại trong mạng v2.pdfChương 3.7. Bài toán luồng cực đại trong mạng v2.pdf
Chương 3.7. Bài toán luồng cực đại trong mạng v2.pdf
 
Đề tài: Tìm nghiệm của một bài toán bằng cách xem xét tất cả các phương án có...
Đề tài: Tìm nghiệm của một bài toán bằng cách xem xét tất cả các phương án có...Đề tài: Tìm nghiệm của một bài toán bằng cách xem xét tất cả các phương án có...
Đề tài: Tìm nghiệm của một bài toán bằng cách xem xét tất cả các phương án có...
 
Cq lt hdt-th2011-01-tuan09
Cq lt hdt-th2011-01-tuan09Cq lt hdt-th2011-01-tuan09
Cq lt hdt-th2011-01-tuan09
 

Báo cáo bài tập lớn

  • 1. Bài toán người đi du lịch Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng Trang 1 LỜI MỞ ĐẦU Thuật ngữ thuật toán (Algrithm) là từ viết tắt của tên một nhà toán học nổi tiếng người Ai Cập ở thế kỷ thứ IX: Abu Ja’fa Mohammed ibn Musa al- Khowarizmi. Ông là người viết hai quyển sách nổi tiếng là “Sơ lược về các phép tính trên Al jafar và Al Mukabal” và “Hệ đếm Ấn Độ”. Đầu tiên, thuật toán được hiểu như là các quytắc thực hiện các phép toán sốhọc với các con số được viết trong hệ thập phân. Cùng với sự phát triển của máy tính, khái niệm thuật toán cũng được hiểu theo nghĩa rộng hơn. Một định nghĩa hình thức về thuật toán được nhà toán học người Anh là Alan Mathison Turing là cha đẻ của ngành khoa học máy tính đưa ra vào năm 1936 thông qua máy Turing. Có thể nói lý thuyết thuật toán được hình thành từ đó. Định nghĩa một cách trực quan thì thuật toán là một bản liệt kê các chỉ dẫn, các quy tắc cần thực hiện theo từng bước xác định nhằm giải quyết một bài toan đã cho trong khoảng thời gian hữu hạn. Một thuật toán bao gồm các tính chất sau:  Tính chính xác: để đảm bảo kết quả tính toán hay các thao tác mà máy tính thực hiện được là chính xác.  Tính rõ ràng: Thuật toán phải được thể hiện bằng các câu lệnhminh bạch; các câu lệnh được sắp xếp theo thứ tự nhất định.  Tính khách quan: Một thuật toán dù được viết bởi nhiều ngườitrên nhiều máy tính vẫn phải cho kết quả như nhau.  Tính phổ dụng: Thuật toán không chỉáp dụng cho một bàitoán nhất định mà có thể áp dụng cho một lớp các bài toán có đầu vào tương tự nhau.  Tính kết thúc: Thuật toán phải gồm một số hữu hạn các bước tính toán. Phân tích và thiết kế thuật toán là một lĩnh vực quan trọng của khoa học máy tính. Phân tích thuật toán giúp cho người thiết kế giải thuật có thể tiên liệu được các tài nguyên mà thuật toán yêu cầu như: bộ nhớ, băng thông, thiết bị ngoại vi, … Song yếu tố quan trọng nhất chính là thời gian thực hiện giải thuật. Trong bài viết này, chúng em xin trình bày những hiểu biết của mình về bài toán tối ưu trong việc tìm đường đi ngắn nhất sử dụng những kiến thức liên quan đến đồ thị và ứng dụng những kiến thức đã học được từ môn Phân tích và đánh giá thuật toán để giải quyết bài toán “Có n thành phố và giữa các cặp thành phố xác định một thông số là chi phí đi lại. Một hành trình là một cách đi xuất phát từ một thành phố, qua tất cả các thành phố còn lại và quay lại vị trí xuất phát. Tìm hành trình có chi phí nhỏ nhất.” Tìm đường đi ngắn nhất trong đồ thị được ứng dụng nhiều trong các bài toán tìm đường đi ngắn tối ưu giữa hai điểm trong mạng giao thông, đường đi ngắn nhất của gói tin giữa các nút mạng máy tính…
  • 2. Bài toán người đi du lịch Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng Trang 2 Do thời gian và kiến thức còn hạn chế nên trong quá trình trình bày chắc chắn không tránh khỏi những sai sót, rất mong nhận được sự góp ý của Thầy Giáo và các bạn học viên trong lớp. Chúng em xin gửi lời cảm ơn thầy giáo, PGS.TS Đào Thanh Tĩnh và các bạn trong lớp học đã tạo điều kiện thuận lợi và giúp đỡ em hoàn thành bài tập này. Xin chân thành cảm ơn! Nhóm học viên thực hiện Lê Đình Hưng Đỗ Thanh Liên Lương Thúy Vượng
  • 3. Bài toán người đi du lịch Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng Trang 3 CHƯƠNG I: PHÂN TÍCH BÀI TOÁN 1. Phát biểu bài toán Có n thành phố và giữa các cặp thành phố xác định một thông số là chi phí đi lại. Một hành trình là một cách đi xuất phát từ một thành phố, qua tất cả các thành phố còn lại và quay lại vị trí xuất phát. Tìm hành trình có chi phí nhỏ nhất. Giải bài toán bằng phương pháp gần đúng. So sánh hiệu quả với phương pháp vét cạn. 2. Giới thiệu về bài toán người đi du lich Bài toán người đ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 hai thành phố trong đó, nhiệm vụ là phải tìm một chu kỳ ngắn nhất để thăm mỗi thành phố một lần duy nhất. Hình 1. Ví dụ về bài toán người đi du lịch Trong hình trên, tour đề người đi du lịch có thể thăm hết các thành phố với chi phí ngắn nhất có thể được thể hiện bằng cạnh màu đỏ. Vấn đề bài toán người đi du lịch được nêu ra đầu tiên như là vấn đề toán học đầu tiên vào năm 1930và 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 trong thực 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 sử dụng rất nhiều phương pháp chinh xác và gần đúng(xấp xỉ) đã được biết đến, do đó có thể giải được vài trường hợp có đến 10 ngàn thành phố. Trong những năm 1950 và 1960, bài toán mở rộng trở nên phổbiến trong giới khoa học Châu Âu và Bắc Mỹ. Các công trình nghiên cứu đáng kể đầu tiên được thực hiện bởi George Dantzig, Delbert Ray Fulkerson và Selmer M.Johnson người đã đề xuất bài toán như một chương trình tuyến tính và phát triển phương pháp cận nhánh cho bài toán. Với các phương pháp mới họ đã giải quyết một trường hợp với 49 thành phốmột cách tối ưu bằng cách xây dựng một chu trình và chứng minh rằng không có chu trình nào ngắn hơn vào năm 1954, cho đến năm 2004 bài toán giải quyết được với số đỉnh
  • 4. Bài toán người đi du lịch Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng Trang 4 nên đến 24.978 đỉnh dự báo sẽ còn tiếp tục tăng nên nữa. Trong nhiều thập kỷ liên tiếp sau đó, bàitoán được nghiên cứu trong rất nhiều ngành như Toán rời rạc; khoa học máy tính; hóa học; vật lý… 3. Mô tả chi tiết bài toán người đi du lịch Bài toán người đi du lịch có thể biểu diễn thành một đồ thị, trong đó các thành phố được biểu diễn dưới dạng các đỉnh, các con đường đi lại giữa các thành phố là các cạnh và chi phí đi lại giữa các thành phố được biểu diễn dưới dạng giá trị các cạnh nối các đỉnh. Tất nhiên, đồ thị sau khi được xây dựng dựa vào các đỉnh và chi phí đi lại giữa các thành phố là đồ thị hoàn chỉnh và đủ, giữa hai thành phố không có đường đi trực tiếp được nối với nhau mà phải thông qua một hoặc nhiều thành phố trung gian khác ta gán trọng số của cạnh đó với số lớn nhất có thể (thường là ∞). Khi đó, bài toán người đi du lịch trở thành bài toán tìm chu trình Hamilton ngắn nhất, và lộ trình của người du lịch chinh là chu trình Hamilton ngắn nhất. A B C D E D A 0 3 93 13 33 9 B 4 0 77 42 21 6 C 45 17 0 36 16 28 D 39 90 80 0 56 7 E 28 46 88 33 0 25 F 3 88 18 46 92 0 Nếu như khoảng cách giữa hai thành phố bất kỳ là như nhau cho cả hai hướng thì dung đồthịvô hướng, ngược lại ta sửdụng đồthịcó hướng. Trong ví dụ trên, ta giả định đường đi từ 2 hướng là như nhau. Trường hợp khoảng cách giữa hai thành phố trong đồ thị là khoảng cách Metric(tức là khoảng cách thỏa mãn bất đẳng thức tam giác sau Cij <= Cik + Ckj) thì khoảng cách trực tiếp từ thành phố A đến thành phố B là khoảng cách ngắn nhất và không baogiờ lớn hơn khoảng cách mà có thông qua thành phố C. Thực tế, khi các thành phố được biểu diễn bởi các điểm trên mặt phẳng, rất nhiều các khoảng cách gần như là khoảng cách Metric. Trong nhiều trường hợp, các khoảng cách không thỏa mãn bất đẳng thức tam giác hoạc do tiêu chí đánh giá khoảng cách không phụ thuộc vào không gian Metric chẳng hạn như khoảng cách theo tiêu chí thời gian di chuyển, rõ ràng máy bay di chuyển nhanh hơn nhiều sơ với ô tô mặc dù khoảng cách di chuyển có thể là lớn hơn.
  • 5. Bài toán người đi du lịch Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng Trang 5 CHƯƠNG II THIẾT KẾ GIẢI THUẬT 1. Giải thuật chính xác Trong các giải thuật để giái chính xác cho bài toán người đi du lịch, đầu tiên phải kể đến thuật toán vét cạn. Vét cạn theo nghĩa thông thường là xét hết các trường hợp. Trong lập trình để giải quyết các bài toán tối ưu, vét cạn được sử dụng khi không còn phương pháp nào hiệu quả hơn để sử dụng được. Phương pháp vét cạn được mô tả để giải quyết bài toán người đi du lịch như sau duyệt tất cả các thành phốđược nốivới một thành phốđã được đánh dấu, tìm các tất cả các hành trình và chi phi tương ứng cho các hành trình, sau đó đánh giá các hành trình và tìm gia hành trình có chi phí thấp nhất làm kết quả cho bài toàn. Thuật toán vét cạn để giải quyết bài toán người đi du lịch sau khi xây dựng được ma trận chi phí sẽ giống như bài toán tìm tất cả các chu trình Hamilton trong đồ thị, sau đó so sánh các chu trình Hamilton và chọn một chu trình nhỏ nhất làm đáp án. Việc tìm chu trình Hamilton được thực hiện theo phương pháp duyệt theo chiều sâu và có kết hợp quay lui. Do quá trình duyệt có thể là rất sâu nên ta không sử dụng đệ quymà dung stackđể khử đệ quy. Sử dụng một biến Min để lưu thông tin lại tổng trọng số của chu trình Hamilton nhỏ nhất. ban đầu min=∞ hoặc min=m*trọng số của cạnh lớn nhất.(m là tổng số tất cả các đường đi đến các thành phố) Chu trình Hamiltoon là chu trình đi qua hết tất cả các đỉnh và sau đó quay về đỉnh xuất phát, dođó, chúng ta dung một danh sách Chuaxet[] để lưu lại các đỉnh chưa xét, một biến Sum để lưu lại trọng số của chu trình hiện thời, do chu trình Hamilton không quan trọng định xuất phát, ta chọn đỉnh xuất phát là đỉnh có chỉ số nhỏ nhất là 1. Quy trình duyệt như sau: 1. Ban đầu đưa đỉnh 1 và 0 vào stack, Sum=0; 2. Lặp lại quá trình sau: Lấy (Top) đỉnh từ stackra và đỉnh I và trọng số ts, gán Chuaduyet[i] là false và Sum+=ts, nạp 0 0 vào stack sau đó nạp các đỉnh kề j và trọng số tương ứng với đỉnh đang xét mà Chuaduyet[i]=true, nếu i không có đỉnh liền kề thỏa mãn yêu cầu, tức là duyệt hết tất cả các đỉnh(do đồ thị đang xét là đồ thị đủ). Ta cộng trọng số của cạnh i ->1 vào Sum và gán min bằng Min(sum, min). Sum-=canh i->1. 3. Lặp lại quá trình sau: Lấyđỉnh từ stackra, nếu đỉnh này không còn đỉnh kề thỏa mãn yêu cầu thì Pop đỉnh và trọng số này ra, nếu có đỉnh thỏa mãn thì thoát vòng lặp và duyệt tiếp từ đỉnh này, trường hợp lấy đỉnh từ stack ra là 0 thì Pop 2 lần để lấy 2 đỉnh liên tục trong stack ra sau đó tiếp tục vòng lặp.
  • 6. Bài toán người đi du lịch Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng Trang 6 Ví dụ về việc sử dụng thuật toán vét cạn đề giải quyết bài toán: Các bước Stack chứa đỉnh Stack trọng số Đỉnh đang xét Sum min 1 1 0 Ø 0 +∞ 2 1;0;4;3;2 0;0;1;6;3 1 0 +∞ 3 1;0;4;3;2;0;4;3 0;0;1;6;3;0;7;5 2 3 +∞ 4 1;0;4;3;2;0;4;3;0;4 0;0;1;6;3;0;7;5;0;2 3 8 +∞ 5 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 6 1;0;4;3;2;0;4 0;0;1;6;3;0;7 4 3 11 7 1;0;4;3;2;0;4;0;3 0;0;1;6;3;0;7;0;2 4 10 11 8 1;0;4;3;2;0;4;0;3;0 0;0;1;6;3;0;7;0;2;0 3 18 11 9 1;0;4;3 0;0;1;6 3 0 11 10 1;0;4;3;0;4;2 0;0;1;6;0;2;5 3 6 11 11 1;0;4;3;0;4;2;0;4 0;0;1;6;0;2;5;0;7 2 11 11 12 1;0;4;3;0;4;2;0;4;0 0;0;1;6;0;2;5;0;7;0 4 19 11 13 1;0;4;3;0;4 0;0;1;6;0;2 4 6 11 14 1;0;4;3;0;4;0;2 0;0;1;6;0;2;0;7 4 8 11 15 1;0;4;3;0;4;0;2;0 0;0;1;6;0;2;0;7;0 2 18 11 16 1;0;4 0;0;1 4 0 11 17 1;0;4;0;3;2 0;0;1;0;2;7 4 1 11 18 1;0;4;0;3;2;0;3 0;0;1;0;2;7;0;5 2 8 11 19 1;0;4;0;3;2;0;3;0 0;0;1;0;2;7;0;5;0 3 19 11 20 1;0;4;0;3 0;0;1;0;2 3 1 11 21 1;0;4;0;3;0;2 0;0;1;0;2;5 3 3 11 22 1;0;4;0;3;2;0 0;0;1;0;2;5;0 2 11 11 Kết thúc thuật toán ta tìm được chu trình Hamiltin là: 1=>2=>3=>4>=1 với chi phí là 11.
  • 7. Bài toán người đi du lịch Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng Trang 7 2. Giải thuật gần đúng(hay gọi là xấp xỉ) Thuật toán vét cạn ở trên cho ta một đáp án tối ưu, tuy nhiên độ phức tạp của thuật tán là quá cao (n-1)! Thuộc nhóm O(n!). Do đó, trong thực tế người ta chấp nhận các giải thuật cho kết quả tốt(những không phải lúc nào cũng tốt) bởi sự đơn giản, nhanh chóng và cài đặt dễ dàng. Ở trong phần này chúng tôi giới thiệu hai thuật toán gần đúng để giải quyết bàitoán: đólà thuật toán láng giềng gần nhất và nhánh cận để giảiquyết bài toán. 2.1.Giải thuật láng giềng gần nhất Thuật toán láng giềng gần nhất hay còn gọi là giải thuật tham lam. Trong giải thuật này, tại mỗi bước, ta chọn con đường (cạnh) nối với thành phố (đỉnh) gần nhất với hi vọng rằng n con đường ngắn nhất sẽ cho ra đường đi ngăn nhất. Ý tưởng của thuật toán láng giềng gần nhất: là tìm kiếm lựa chọn tối ưu cục bộ tại mỗi bước với hi vọng tìm được tìm được tối ưu toàn cục khi kết thúc. Tại mỗi bước lựa chọn, thuật toán này chọn “miếng ngon nhất” được xác định bằng hàm chọn “ngon nhất” (có thể là giá trị max hoặc min, hoặc theo1 ý nghĩa nào đó tùyvào bài toán cụ thể và nếu cóthể “ăn” trở thành nghiệm của bài toán) được thì “ăn” luôn; nếu không nó sẽ bỏđi và không xem xét lại. Thuật toán láng giềng gần nhất: Input C=(cij) Output tour// hành trình tối ưu Cost; // Chi phí tương ứng của các hành trình Mô tả: Tour := Ø ; Cost:=0; v:=u; // Khởi tạo ∀𝑘 ≔ 1 → 𝑛 ;// Thăm tất cả các thành phố; // Chọn cạnh kề. Chọn(u, w) là đoạn nối 2 thành phố có chi phí nhỏ nhất từ thành phố V đến các thành phố chưa đi qua. Tour := Tour+ (u, w); // cập nhật hành trình. Cost := Cost +Cv,w // cập nhật chi phí. // Hoàn thành chuyến đi. Độ phức tạp của thuật toán tham lam: Thuật toán tham lam có độ phức tạp nhỏ hơn nhiều sovới giải thuật vét cạn, chiphí chogiải thuật là n(n- 1)/2 thuộc nhóm O(n2 ). Tour := Tour+(v, w); Cost := Cost + Cvw Tuy nhiên, đã nói ở trên giải thuật này không phải luôn luôn đúng, trong một số trường hợp, lời giải của thuật toán tham lam là rất tệ.
  • 8. Bài toán người đi du lịch Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng Trang 8 Ví dụ 1: minh họa giải thuật tham lam với n=5 Đáp án của thuật toán láng giềng gần nhất thường là tốt(tuykhông phải tối ưu) vì đáp án tối ưu của bài toán trên là: 1=>3=>4=>5=>3=>1 với chi phí là 10 so với kết quả của thuật toán tham lam là 14. Ví dụ 2: Cho ma trận chi phí: ∞ 48 43 54 31 20 ∞ 30 63 22 C= 29 64 ∞ 4 7 6 19 2 ∞ 8 1 28 7 18 ∞ Bước 1: Từ thành phố1 ta chọn đích là thành phố5(chi phí=31 thấp nhất) Tour := Ф; Cost := 0; u=1; w =5; Bước 2: Từ thành phố5 ta chọn đích là thành phố3(chi phí=7 thấp nhất) Tour := <1,5> ; Cost := 31; u=5; w =3; Bước 3: Từ thành phố3 ta chọn đích là thành phố4(chi phí=4 thấp nhất) Tour := {<1,5>, <5,3>} ; Cost := 38; u=4; w =4; Bước 4: Từthành phố4 ta chọn đích là thành phố 2(thành phốcuối chưa đi đến chi phí =19) Tour := {<1,5>, <5,3>,<3,4>} ; Cost := 42; u=2; w =19;
  • 9. Bài toán người đi du lịch Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng Trang 9 Bước 5: Từ thành phố 2 ta quay lại thành phố 1(chi phí=20) Tour := {<1,5>, <5,3>,<3,4>, <4,2>} ; Cost := 61; u=5; w =20; Tour := {<1,5>, <5,3>,<3,4>,<4,2>,<2,1>} ; Cost := 81; Theo thuật toán tham lam ta có hành trình như sau: 1 => 5 => 3 => 4 =>2 >1. Chi phí: 31+7+4=19+20 =81. Cài đặt và code thuật toán tham lam: int GTS(mat c, int n, tin TUOR[max], int Ddau) { int v; // đỉnh đang xét int k; // duyệt qua n đỉnh để chọn int w; // đỉnh được chọn trong mỗi bước int mini; // chọn min các cạnh trong mỗi bước int COST; trọng số nhỏ nhất của chu trình int daxet[max]; // danh sách các đỉnh được sử dụng for (k=1; k<=n; k++) Daxet[k] =0; // chưa đỉnh nào được xét COST = 0; // Lúc đầu, giá trị COST=0; int i; // biến đếm, đếm tìm đủ n đỉnh thì dừng v= Ddau; // Chọn đỉnh xuất phát là 1 i=1; TOUR[i]=v; // đưa v vào chu trình daxet[v] = 1 ; // đỉnh v đã được xét. while(i<n) { mini=vc; for(k=1; k<=n; k++) If(!daxet[k]) If(mini>a[v][k]) { mini=a[v][k]; w=k; } v=w; i++ TOUR[i] = v; Daxet[v]=1; COST +=mini } COST +=a[v][Ddau]; resturn COST; }
  • 10. Bài toán người đi du lịch Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng Trang 10 2.2.Thuật toán nhánh cận Thuật toán nhánh cận là phương pháp chủ yếu để giải các bài toán tối ưu tổ hợp. Ý tưởng của thuật toán nhánh cận: Cơ bản của thuật toán là trong quá trình tìm kiếm lời giải tối ưu, ta phân hoạch tập các phương án thành hai hây nhiều nhánh con như cây tìm kiếm và cố gắng bằng phép đánh giá cận cho các nút, tìm cách loại bỏ những nhánh của cây tìm kiếm(những tập con các phương án của bài toán) mà ta biết chắc chắn là các phương án đó không phải là phương án tối ưu. Độ phức tạp của thuật toán: Trong trường hợp tệ nhất thuật toán đi theo hướng trở thành thuật toán vét cạn những trong nhiều trường hợp cụ thể kỹ thuật đó chophép rút ngắn được một cách đáng kể quá trình tìm kiếm. Trong mục này ta trình bày những tư tưởng chinh của giải thuật cận nhánh thông qua việc áp dụng nó vào giải quyết bài toán người đi du lịch. Ma trận chi phí: Trong bài toán người đi du lịch chi phí Cij để đi từ thành phố i đến thành phố j, theo nội dung đã phân tích người đi du lịch với mỗi thành phố trong hành trình của mình chỉ xuất phát từ đó một lần và rời khỏi đó một lần, mặt khác để thuận lợi trong việc tính toán ta biểu diễn them ký hiệu Cii=∞, kết hợp lại ta có ma trận chi phí sau: ∞ C12 C13 … C1n C21 ∞ C23 … C2n C= C31 C32 ∞ … C3n … … … ∞ … Cn1 Cn2 Cn3 … ∞ Ma trận C được gọi là ma trận chi phí Rõ ràng nếu ∏= (∏(1), ∏(2), ∏(3),…., ∏(n)) là một hành trình của người đi du lịch thì chi phí cho hành trình đó là tổng tương ứng của các phần tử trong ma trận C, vì từ mỗi thành phố người du lịch chỉ xuất phát một lần nên trên mỗi hang của ma trận chỉ có duy nhất một phần tử tham gia, cũng như vậy vì mỗi thành phố chỉ đến một lần, nên mỗi cột của ma trận cũng có duy nhất một phần tử tham gia. Từ nhận xét này ta có thể xét bài toán người đi du lịch rộng hơn là: “Hãy chọn trong ma trận vuông cấp nxn mỗihang mỗi cột một phần tử sao cho tổng của chúng là nhỏ nhất” Ta rút ra tính chất sau: Nếu các phần tử của mỗi hàng (hoặc mỗi cột) của ma trận c ta bớt đi cùng một số thì tính chất tối ưu của hành trình không đổi. Trong hành trình ∏= (∏(1), ∏(2), ∏(3),…., ∏(n)) mỗi đoạn đường ∏(i), ∏(i+1) đi từ thành phố ∏(i) đến thành phố ∏(i+1) ta gọi là một cung, chi phí tương ứng sẽ là C∏(i), ∏(i+1), như vậy mỗi hành trình tương ứng với tập hợp n cung thỏa mãn một số điều kiện, việc chọn cung hay chọn một phần tử trong ma trận C là tương đương nhau.
  • 11. Bài toán người đi du lịch Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng Trang 11 Thuật toán nhánh cận: Trong bài toán ngưới đi du lịch khi tiến hành tìm kiếm lời giải chúng ta sẽ phân tập các hành trình ra thành hai tập con:  Một tập gồm những hành trình chứa cung (i,j) nào đó.  Một tập kia gồm những hành trình không chứa cạnh này. Ta gọi việc làm đó là phân nhánh và mỗi tập con nói trên sẽ được gọi là một nhánh hay một nút của cây tìm kiếm. Việc phân nhánh được minh họa bởi cây tìm kiếm: Hình Sơ đồ phân nhánh Việc phân nhánh sẽ được thực hiện dựa trên một quy tắc heuristic (Heuristic là phương pháp tiếp cận cảm tính mang tính kinh nghiệm để giải quyết các bài toán khó) nào đó cho phép ta rút ngắn quá 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 giá trị hàm mục tiêu trên mỗi một trong hai tập con nói trên. Việc tìm kiếm sẽ được tiếp tục trên tập con cógiá trị cận dưới nhỏ hơn. Thủ tục này sẽ được tiếp tục cho đến khi thu được một hành trình đầy đủ tức là một phương án của bài toán người du lịch. Khi đó ta cần xét những tập con các phương án nào có cận dưới nhỏ hơn giá trị hàm mục tiêu tại phương án tìm được. Quá trình phân nhánh và tính cận dưới trên tập các phương án của bài toán thông thường cho phép rút ngắn một cách đáng kể quá trình tìm kiếm do ta loại được khá nhiều tập con chắc chắn không chứa phương án tối ưu. Thủ tục rút gọn(chi phí cận dưới): rõ ràng tổng chi phí của một hành trình của người đi du lịch sẽ chứa đúng một phần tử của mỗi dòng và đúng một phần tử của mỗi cột trong ma trận chi phí C. Do đó nếu ta trừ với mỗi phần tử của dòng(haycột) của ma trận C đi cùng một số α thì chi phí của tất cả các hành trình cũng sẽ giảm đi α, vì thế hành trình tối ưu cũng sẽ không thay đổi. Vì vậy nếu ta tiến hành trừ bớt các phần tử của mỗi dòng và mỗi cột của nó đi phần tử “khác 0 nhỏ nhất” thì ma trận thu được ma trận gồm các phần tử không âm mà trong mỗi dòng và mỗi cột của nó đều có ít nhất một số 0 thì tổng các hằng số trừ đó sẽ cho ta cận dưới của mọi hành trình. Thủ tục trừbớt này sẽ được gọi là thủ tục rút gọn, các hằng sốtrừ ở mỗi dòng(cột) sẽ được gọi là hằng số rút gọn theo dòng(cột) còn ma trận thu được gọi là ma trận rút gọn.
  • 12. Bài toán người đi du lịch Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng Trang 12 Thủ tục rút gọn: Input C(n,n) Duyệt các hàng của ma trận 1<=i<=n - Chọn các phần tử khác không nhỏ nhất trên mỗi hang αi - Trừ các phần tử của mỗi hàng đi αi tức là Cij=cij - αi, 1<=j<=n Duyệt các cột của ma trận 1<=j<=n - Chọn phần tử khác không nhỏ nhất trên mỗi cột βj - Trừ các phần tử của mỗi cột đi βj tức là Cij=cij - βi , 1<=j<=n Tính M= ∑ 𝛼𝑖𝑛 𝑖=1 + ∑ 𝛽𝑖𝑛 𝑖=1 (Gọi là chi phí cận dưới của các hành trình) Output C* (n,n),M Thủ tục chọn cungphân nhánh: Như trên đã thực hiện sau khi rút gọn trên mỗi hang, mỗi cột của ma trận chứa ít nhất một phần tử 0, đối với mỗi phần tử o này ta tính chỉ số của nó là tổng các phần tử khác phần tử 0 đang xét và nhỏ nhất tương ứng với hang và cột đó. Chọn phàn tử o có chỉ số lớn nhất, tương ứng với cung cần chọn để phân nhánh và đặt phần tử đối xứng với nó qua đường chéo là ∞. Thủ tục chọn cung phân nhánh Input C(n,n) Duyệt các hàng của ma trận 1<=i<=n - Chọn phần tử o trên mỗi hàng là(i,j) - Tìm phần tử khác phần tử 0 đang xét và nhỏ nhất trên hàng i là ri và phần tử 0 đang xét và nhỏ nhất trên cột j là sj - B(I,j)= ri+sj Tính Max{B(I,j): 1<=i<=n; 1<=j<=n;} ta được cung (p,q) và đặt Cqp=∞ Output (p,q) Chú ý: Trong quá trình tính toán giá trị ∞ được coi là rất lớn, các phép cộng và trừ không làm suy chuyển giá trị. Sau khi đã tiến hành tính cận dưới và phân nhánh, chia cách hành trình làm hai tập con, Tập T1 gồm các hành trình chứa cung(p,q) và tập T2 gồm các hành trình không chứa cung(p,q). Đối với T1 ma trận chi phí tương ứng C1 nhận được từ ma trận C bằng cách loại bỏ hàng p và cột q tức là kích thước của ma trận giảm xuống một bậc. Đối với T2 ma trận chi phí tương ứng C2 nhận được từ ma trận C bằng cách đặt Cpq=∞, tức là trong các bước tiếp theosẽ không được chọn lại cung (p,q) nữa.
  • 13. Bài toán người đi du lịch Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng Trang 13 Đệquy thuậttoán: Sau khi thực hiện việc rút gọn và phân nhánh, chúng ta đã tách các hành trình thành hai nhánh, trên mỗi nhánh này ma trận chi phí được thay đổi, như vậy ở mỗi nhánh, bàitoán được quaytrở lại dạng ban đầu, kích thước nhỏ hơn với T1 và được giữ nguyên với T2 với số phần tử khác ∞ bớt đi một. như vậy thuật toán này có tính đệ quy. Các bước tiếp theo để giải quyết bàitoán được thực hiện lần lượt các thủ tục trên chomỗi nhánh. Để hạn chế các phương án cần xét ta sẽ chọn nhánh có chi phí cận dưới thấp hơn. Ngăn cấm tao chu trình con kín: Theonội dung của bàitoán, một hành trình hợp lệ là phải điqua tất cả các thành phốtrong danh sách, nói cách khác hành trình sẽ tạo thành một vòng khép kín. Vấn đề đặt ra là nếu trong danh sách chưa đủ mặt các thành phố mà hành trình đã tạo thành một vòng con khép kín, hiện tượng này được gọi là tạo thành chu trình con kín, do đó trong quá trình thực hiện thủ tục chon cung và phân nhánh cần loại bỏ khả năng tạo thành chu trình con kín. Tổng quát hơn khi phân nhánh dựa vào cung(p,q) ta phảithêmcạnh này vào hành trình, ở mỗi bước lựa chọn cung để kết nạp vào ta cần phải kiểm tra và xem xét nó có tạo thành chu trình con kín khi kết hợp với các cung đã có hay không ? nếu có ta cần loại bỏ cung này và chọn cung có độ ưu tiên(đô ưu tiên được xác định bởi phần tử 0 có chỉ số bằng hoặc nhỏ hơn) tiếp theo. Thủ tục kiểm tra chu trình con kín: Input S danh sách các cung đã chọn; cung mới(p,q) Nếu N(S)<n thì - Sắp xếp lại các cung trong tập S`=S ∪(p,q) theo dạng danh sách. - Trên đỉnh đầu trùng đình cuối trong S` thì KT= False ngược lại KT= True và S= S`. - Output S,KT Theo tính chất đệ quycủa thuật toán kích thước của các ma trận chi phí C sẽ giảm dần theo một nhánh, cuối cùng ma trận C có kích thước 2x2 thì chấm dứt việc phân nhánh và kết nạp 2 cạnh còn lại để thu được hành trình của người đi du lịch. Dễ nhận thấy rằng ma trận rút gọn cuối cùng này chỉ có thể là một trong hai dạng sau: 𝑎 0 0 𝑑 và 0 𝑐 𝑑 0 Trong đó u, v, w, x có thể là 4 đỉnh khác nhau hoặc chỉ có 3 đỉnh khác nhau, khi đó ta sẽ chọn đưa vào hành trình các cung ứng với phần tử 0. Thực hiện các thủ tục trên kết thúc ta được hành trình T với chiphí thực tế là G, nếu giá trị G nhỏ hơn tất cả các chi phí cận dưới M của các nhánh đã bỏ qua, thì hành trình nhận được là hành trình tối ưu, mặt khác nếu G lớn hơn giá trị cận dưới P của một nhánh nào đó thì hành trình tìm được chưa
  • 14. Bài toán người đi du lịch Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng Trang 14 phải là hành trình tối ưu, khi đó tiếp tục áp dụng thuật toán cận nhánh cho nhánh này để tìm hành trình mới. Cài đặt và code của thuật toán cận nhánh: int n,c[100][100],x[100],chuaxet[100],kq[100]; int MIN=0; int a=1; // Nhap du leu dau vao void Init() { cout<<"n So thanh pho="; cin>>n; //Nhap so thanh pho cout<<"n Nhap chi phi n"; // nhap chi phi cho tuung cung duong for(int i=1;i<=n;i++) // tu thanh pho i den t hanh pho j for(int j=1;j<=n;j++) { if(i!=j) { cout<<"c["<<i<<"]["<<j<<"]="; cin>>c[i][j]; } else c[i][j]=0; } x[1]=1; for(int i=2;i<=n;i++) // nhung thanh pho chua xet { chuaxet[i]=1; } } // ham hien ket qua cua bai toan void Result(){ cout<<"n T1->"; // bat dau tu dinh so 1 for(int i=2;i<=n;i++) cout<<"T"<<kq[i]<<"->";// hien thi cac dinh tiep cout<<"T1";// ket thu o dinh so 1 cout<<"n Tong chi phi la: "<<MIN; // hien thi chi phi cua hanh tirnh } void Work(){ int S=0; for(int i=1;i<=n-1;i++){ S=S+c[x[i]][x[i+1]]; } S=S+c[x[n]][1]; if(S<MIN||a==1){ a=0;
  • 15. Bài toán người đi du lịch Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng Trang 15 MIN=S; for(int i=1;i<=n;i++) kq[i]=x[i]; } } void Try(int i){ for(int j=2;j<=n;j++){ if(chuaxet[j]){ x[i]=j; chuaxet[j]=0; if(i==n) { Work(); } else { Try(i+1); chuaxet[j]=1; } } } } main(){ Init(); Try(2); Result(); getch(); }
  • 16. Bài toán người đi du lịch Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng Trang 16 CHƯƠNG III ĐÁNH GIÁ THUẬT TOÁN 1. Thuật toán vét cạn Thuật toán vét cạn là thuật toán chính xác nhất để giải quyết bài toán người đi du lịch lần được hành trình tối ưu nhất theo một cấu trúc rõ ràng nhất, Nhưng do độ phức tạp của thuật toán là O(n!), gây nên gánh nặng cho các công cụ tính toán không đáp ứng được, có nghĩa là thời gian giải quyết được bài toán không thực tế(mất nhiều thời gian) nếu số lượng các thành phố là con số lớn. Nhưng phương pháp vét cạn có thể được cải tiến và làm cơ sở cho phương pháp nhánh cận. Phương pháp nhánh cận sử dụng một hàm tính cận để ước tính trước chi phí tối thiểu(cận chi phí) có thể đạt được đối với các kết quả có thể xảy ra, nếu cận này không thấp hơn kết quả của các hành trình đã biết thì toàn bộ các hành trình đó có thể bỏ qua. Vét cạn+Hàm điều kiện= Quay lui. Vét cạn+ Hàm tính cận = Nhánh cận. 2. Thuật toán láng giềng gần nhất Thuật toán Láng giềng gần nhất là thuật toán đầu tiên dùng để tìm lời giải cho bài toán toán Người đi du lịch, và thường cho kết quả chênh lệch trong phạm vi 20% so với đường đi tối ưu. Nó chạy nhanh hơn rất nhiều so với thuật toán vét cạn(việc kiểm tra hết mọi tuyến đường) và thuật toán cận nhánh. Thuật toán láng giềng gần nhất dễ cài đặt và chạy nhanh, những đôi khi nó có thể bỏqua các tuyến đường ngắn hơn mà mắt thường có thể nhìn ra(số thành phố ít). Kết quả của thuật toán này cần được kiểm tra trước khi sử dụng đề phòng trường hợp một tuyến đường ngắn hơn(tối ưu hơn) bị bỏ qua. Các bước của thuật toán: 1. Chọn một thành phố bất kỳ làm điểm xuất phát và đây là thành phố hiện hành. 2. Đánh dấu thành phố hiện hành là đã đi qua. 3. Tìm các thành phố chưa đi qua có chi phí đến thành phố hiện hành là ngắn nhất, đánh dấu thành phố đó là thành phố hiện hành. 4. Nếu chưa đi qua tất cả cách thành phố thì quay lại bước 2. Thứ tự các thành phố đi qua chính là kết quả của thuật toán và tổng chi phí đi qua các thành phố là chi phi của hành trình đó. Trong trường hợp xấu nhất, thuật toán này có thể tính toán ra các tuyến đường dài gấp n lần tuyến đường tối ưu. Trong đó n là tỷ lệ tùy ý, nghĩa là
  • 17. Bài toán người đi du lịch Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng Trang 17 với mỗi hằng số n, tồn tại một bài toán người đi du lịch sao cho độ dài các tuyến đường là kết quả của thuật toán láng giềng gần nhất hơn hoặc bằng n lần độ dài của tuyến đường tối ưu. 3. Thuật toán nhánh cận Phương pháp nhánh cận là phương pháp cảitiến của phương pháp quay lui để đảm bảo thời gian cũng như kỹ thuật khi mà phương pháp quay lui và phương pháp vét cạn không đáp ứng được với những bài toán có không gian lời giải quá lớn. Phương pháp nhánh cận được thực hiện như sau: Trong qua trình duyệt các thành phố ta luôn giữ lại một phương án mẫu(có thể xem là lời giải tối ưu cục bộ- nó là giá trị tối ưu tại thời điểm đó – là cận). Đánh giá các nhánh cận xem có phảilà phương án có thể tốt hơn phương án mẫu hay không. Nếu không ta lựa chọn theo hướng khác. Rõ ràng việc áp dụng thuật toán nàytrong rất nhiều trường hợp ta có thể tìm được hành trình tối ưu nhanh hơn so với phương pháp vét cạn và có được kết quả tin cậy hơn phương pháp láng giềng gần nhất, vấn đề đặt ra là việc liệt kê tất cả các hành trình tối ưu cũng có thể thực hiện được bằng thuật toán trên với những cải tiến và kỹ thuật lập trình hợp lý. 4. Giới thiệu một số thuật toán khác 4.1 Các giải thuật để tìm lời giải chính xác Lời giải trực tiếp nhất có thể là thử tất cả các hoán vị và xem hoán vị nào là tốt nhất ( dùng brute-force) . Thờigian chạy chocách tiếp cận này là O(n!), vì vậy cách tiếp cận này thậm chí không thể thực hiện với chỉ 20 thành phố .Một trong sốnhững ứng dụng mới đây nhất của quyhoạch động là giải thuật có độ phức tạp O(n2 2n ) và yêu cầu không gian bộ nhớ là hàm mũ. Cải thiện tốc độ cho cách giải thuật trên là hầu như không thể. Ví dụ, thậm chí là rất khó tìm một giải thuật chính xác cho bài toán Người đi du lịch (Travelling Salesman problem (TSP)) chạy trong độ phức tạp O(1.9999n ). Những cách tiếp cận khác bao gồm  Rất nhiều giải thuật branch-and-bound, có thể sử dụng để giải các bài toán TSP với khoảng 40-60 thành phố.  Các giải thuật cải thiện dần dần sử dụng kỹ thuật ghi nhớ lại của linear programming. Có thể làm việc tốt cho khoảng 200 thành phố.  Thực hiện branch-and-bound và cut cho các bài toán cụ thể , đây là phương thức sử dụng để giải quyết các bàitoán với số lượng lớn thành phố. Cách tiếp cận này đang giữ kỷ lục hiện tại giải quyết được bài toán TSP với 85,900 thành phố. Lời giải chính xác cho bài toán với 15,112 thành phố ở đức từ TSPLIB đã được tìm ra năm 2001 sử dụng phương thức lát cắt đề xuất bởi George Dantzig, Ray Fulkerson, và Selmer Johnson vào năm 1954, dựa trên linear programming. Quá trình tính toán đã được thực hiện trong mạng máy tính
  • 18. Bài toán người đi du lịch Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng Trang 18 gồm 110 bộ vi xử lý tại đại học Rice University và Princeton University. Tổng thời gian tính toán tương đương với 22.6 năm trong một máy đơn vi xử lý tốc độ 500 MHz. Vào tháng 5-2004, bài toán người du lịch thăm tất cả 24,978 thành phốở thụyđiển đã được giải quyết : đoạn đường ngắn nhất vào khoảng 72,500 kilomet đã được tìm thấy và đã được chứng minh rằng không có đường đi nào ngắn hơn. Vào tháng 3- 2005, bài toán người du lịch với 33,810 điểm trong 1 mạch in đã được giải quyết sử dung công cụ Concorde TSP Solver: đoạn đường tối ưu dài 66,048,945 đơn vị đã được tìm thấy và đã được chứng minh không có đường đi nào ngắn hơn tổng khối lượng tính toán mất khoảng 15.7 năm CPU (Cook et al. 2006). Vào tháng 4 năm 2006 một bài toán với 85,900 điểm cũng đã được giải quyết bởi Concorde TSP Solver, và mất khoảng 136 năm CPU . 4.2 Heuristic và các giải thuật xấp xỉ Rất nhiều heuristics và giải thuật xấp xỉ, có thể đưa ra nhanh chóng lời giải tốt đã được đề xuất. Các phương thức hiện đại có thể tìm lời giải cho bài toán cực lớn (hàng triệu thành phố) trong khoảng thời gian chấp nhận được với lời giải xấp xỉ chỉ khác 2-3% so với lời giải tối ưu. Một vài kiểu heuristic đã được tìm ra. Heuristics xây dựng Giải thuật láng giềng gần nhất nearest neighbour (NN) (hay còn gọi là giải thuật tham lam greedy algorithm) để cho người du lịch chọn thành phố gần nhất chưa thămtrong lần dichuyển tiếp theo. Giải thuật nàynhanh chóng đưa ra một đường đi ngắn và hiệu quả . Cho khoảng N thành phố phân bố ngẫu nhiêu trên mặt phẳng trung bình giải thuật này đưa ra lời giải có chiều dài xấp xỉ 1.25 * lần chiều dài của đường đi tối ưu. Tuy nhiên, có nhiều cách sắp xếp đặc biệt các thành phố làm cho giải thuật NN đưa ra đường đi tồi tệ nhất (Gutin, Yeo, and Zverovich, 2002). Điều này đúng chocả bài toán TSP đối xứng và bất đối xứng (Gutin and Yeo, 2007). Gần đây một heuristic mới được đưa ra ,Match Twice and Stitch (MTS) (Kahng, Reda 2004. MTS đã cho thấy tính hiệu quả hơn hẳn so với những heuristic xây dựng hiện tại . MTS thực hiện hai lần khớp tuần tự , mà lần khớp thứ 2 được thực hiện sau khi xóa tất cả các cạnh của lần khớp thứ nhất, để đưa ra tập tất cả các chu trình. Sau đó chu trình được đóng lại để đưa ra đường đi cuối cùng..
  • 19. Bài toán người đi du lịch Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng Trang 19 Cải tiến từng bước  Chuyển cặp, hay heuristic Lin-Kernighan. Kỹ thuật chuyển cặp hay '2-opt' bao gồm việc lặp lại việc xóa 2 cạnh và thay chúng bằng hai cạnh khác nối đoạn tạo bởi cạnh bị xóa tạothành đường di ngắn hơn. Đây là trường hợp đặc biệt của phương thức k-opt. k-opt heuristic Lấy một đường đi và xóa k cạnh đôi một không cóđiểm chung. Xâyđựng lại đường đi từ những mảnh còn lại để không có hai mảnh đường đi nào lối với nhau (không nối hai điểm đầu cuối của 2 mảnh với nhau sẽ tạo thành đường đi khép kín). Điều này làm đơn giản hóabài toán TSP thành bài toán đơn giản hơn rất nhiều. Mỗi điểm đầu cuối có thể được nối tới 2k − 2 điểm khác có thể: trong số 2k tổng sốđiểm đầu cuốicó thể, trừ ra hai điểm đầu cuối của mảnh đang xem xét . Bài toán đơn giản hóa 2k thành phố TSP có thể giải sử dụng brute force để tìm tổ hợp tốt nhất của các mảnh ban đầu. Kỹ thuật k-opt là trường hợp riêng của kỹ thuât V-opt hay variable-opt . Kỹ thuật phổ biến của k-opt là 3-opt, được giới thiệu bởi Shen Lin của Bell Labs vào năm 1965. Có một trường hợp đặc biệt của 3-opt khimà cách cạnh là cóthể không nhất thiết không có điểm chung (hai trong số các cạnh kề với nhau). Trong thực tế, có thể đạt được những phát triển đáng kể của kỹ thuật 2-opt không nhất thiết phải sử dụng 3-opt bằgn cách giới hạn 3-changes thành trườn hợp riêng với hai cạnh xóa đi nối với nhau. Kỹ thuật này được gọi là 2.5-opt nằm giữa 2-opt và 3-opt, hiểu theo cả 2 nghĩa của chất lượng lời giải đạt được và thời gian để tìm được lời giải. V'-opt heuristic Kỹ thuật variable-opt method giống như , nhưng là sự tông quát hóa của k-opt kỹ thuật. Trong khi kỹ thuật k-opt xóa đi một số lựong cố định (k) cạnh từ đường đi ban đầu kỹ thuật variable-opt không xóa đi một số lượng cạnh cố định. Thay vì vậy nó phát triển tập này khi quá trình tìm kiếm tiếp tục. Phương thức nổi tiếng trong gia đình này là phương thức Lin-Kernighan . Shen Lin và Brian Kernighan lần đầu tiên đưa ra phương thức của họ năm 1972 và nó là heuris tic đáng tin cậy nhát cho việc giải bài toán người du lịch trong suốt hai thập kỷ . Những kỹ thuật tiên tiến hơn được phát triển tại Bell Labs cuối những năm 1980 bởi David Johnson và đội nghiên cứu của ông. Những phương thức này , đôi khi được gọi là Lin-Kernighan-Johnson xây dựng trên phương thức Lin-Kernighan , thêm ý tưởng từ tabu search và evolutionary computing. Kỹ thuật cơ sở Lin-Kernighan technique mang lại kết quả được đảm bảo ít nhất là bằn so với 3-opt. Phương thức Lin- Kernighan-Johnson tính một đường đi Lin-Kernighan , và sau đó xáo trộn đường đi bằng cách đột biến (xóa ít nhất 4 cạnh và nối lại đường đi bằng cách khác , sau đó thực v-opt trên đường đi mới ). Quá trình đột biến thường đủ
  • 20. Bài toán người đi du lịch Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng Trang 20 để di chuyển đường đi ra khỏi cục bộ địa phương ( local minimum ). Kỹ thuật V-opt được xem như một trong số những heuristic mạnh cho bài toán và có thể giải quyết các trường hợp đặc biệt, như bài toán chu trình Hamilton và những bài toán TSP không phải metric mà những heuristic khác không giải quyết được. KẾT LUẬN Có rất nhiều ý tưởng cũng như thuật toán được nghiên cứu và đề xuất để giải quyết bài toán Người đi du lịch, kết quả đưa ra của các thuật toán là hành trình ngắn nhất (có thể tính toán được) để đi qua các thành phố. Đô phức tạp của thuật toán phụ thuộc vào việc lựa chọn cấu trúc dữ liệu cài đặt. Nếu ta chọn cấu trúc dữ liệu để cài đặt là danh sách thì làm tăng độ khó khi cài đặt những giảm thời gian thực hiện. Nếu ta chuyển từ danh sách các cung đường đi đã cho về dạng ma trận chi phí thì quá trình cài đặt sẽ dễ dàng hơn những lại làm tốn thời gian thực hiện và dung lượng bộ nhớ, nếu như số lượng thành phốlà lớn thì lựa chọn phương pháp này cố vẻ không tối ưu. Qua kết quả thực nghiệmvới số thành phốbé hơn 100 thì thuật toán cho kết quả tốt với thời gian có thể chấp nhận được. Tuy nhiên do trình độ hạn chế của bản thân nên trong quá trình giải quyết bài toán, chung em chưa phân tích và giải quyết được tình huống đặc biệt có thể xảy ra(Như trường hợp nào phương pháp nhánh cận trở thành vét cạn, …). Chúng em mong được Thầyvà các bạn đông góp để chúng em giải quyết bài toán được tốt hơn. TÀI LIỆU THAM KHẢO [1]. PGS. Ts. Đào Thanh Tĩnh, Tập bài giảng môn phần tích và đánh giá thuật toán, 2015 [2]. PGS. Ts. Đỗ Xuân Lôi, Cấu trúc dữ liệu và giải thuật, NXB Thống Kê, 2001 [3]. PGS.TSKH Vũ Đình Hòa, Thuật toán và đánh giá độ phức tạp thuật toán [4]. Lê Minh Hoàng, Giải thuật và lập trình, DDH Sư Phạm Hà Nội, 2002 [5]. Trần Tuấn Minh, Thiết kế và đánh giá thuật toán.
  • 21. Bài toán người đi du lịch Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng Trang 21 Code Demo thuật toán láng giềng gần nhất int n; // So thanh pho int c[100][100]; // ma tran chi phi int x[100];// khai bao mang cac thanh pho da di qua int chuaxet[100];// khai bao mang luu cac thanh pho da di qua int kq[100]; // Khai bao mang luu tru duong di cho chi phi nho nhat int MIN=0; // khai bao bien luu tru chi phi nho nhat cua doan duong tim duoc. int a=1;// a=1 chua co duong di nao duoc tim; a=0 da co duong di duoc tim // ham nhap du lieu dau vao void Init(){ cout<<"n Nhap so luong thanh pho: "; cin>>n; // nhap so luong thanh pho cout<<"Nhap chi phi cho cac cung duong n"; // nhap chi phi cho tung cung duong for(int i=1; i<=n; i++) for(int j=1;j<=n;j++){ if(i!=j){ cout<<"c["<<i<<"]["<<j<<"]="; cin>>c[i][j];// nhap chi phi cho tung cung } else{ c[i][j]=0;// i trung j chi phi =0(la 1 thanh pho). } } // danh dau cac thanh pho chua xet. x[1]=1; // dinh xuat phat la dinh 1 for(int i=2;i<=n;i++){ // danh dau tat ca cac thanh pho deu chua xet chuaxet[i]=1; } } // Ham hien thi ket qua cua thuat toan void Result(){ // dinh dau tien cout<<"n T1=>"; // cac dinh tiep theo for(int i=2;i<=n;i++){ cout<<"T"<<kq[i]<<"=>";// lay danh sach cac dinh trong mang kq[i] } // quay ve dinh dau cout<<"T1"; // chi phi cua hanh trinh cout<<"n Chi phi cua hanh trinh la: "<<MIN; } // Ham tinh toan chi phi cho mot cung duong void Work(){ int S=0; // khai bao bien de luu gia tri nhanh can for(int i=1;i<=n-1;i++){ S=S+c[x[i]][x[i+1]];// tinh chi phi:= chi phi buoc truoc+ chi phi duon di truc tiep } S=S+c[x[n]][1];// cap nhat chi phi can nhanh tu dinh cuoi den dinh xuat phat if(S<MIN||a==1){ a=0; MIN=S;// Gan chi phi can nhanh bang chi phi hanh trinh for(int i=1;i<=n;i++){ kq[i]=x[i];// ghi nho va gan cac dinh da xet vao ket qua } } }
  • 22. Bài toán người đi du lịch Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng Trang 22 // Ham thuc hien thu cac cach chon x[i] void Try(){ for(int i=2;i<=n;i++){ // thu cho thanh pho thu 2 den n int jmin=-1; // Bien luu thanh pho tim duoc for(int j=2;j<=n;j++){ if(chuaxet[j]&&(jmin==-1)||c[x[i-1]][j]<c[x[i-1]][jmin]){ jmin=j; } } x[i]=jmin; chuaxet[jmin]=0; } Work(); } // Chuong trinh chinh main(){ Init();// ham nhap du lieu Try();// thu chon bat dau tu x[2] Result();// hien thi ket qua getch(); }
  • 23. Bài toán người đi du lịch Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng Trang 23 Code demo nhánh cận int n; // So thanh pho int c[100][100]; // ma tran chi phi int x[100];// khai bao mang cac thanh pho da di qua int chuaxet[100];// khai bao mang luu cac thanh pho da di qua int kq[100]; // Khai bao mang luu tru duong di cho chi phi nho nhat int MIN=0; // khai bao bien luu tru chi phi nho nhat cua doan duong tim duoc. int a=1;// a=1 chua co duong di nao duoc tim; a=0 da co duong di duoc tim // ham nhap du lieu dau vao void Init(){ cout<<"n Nhap so luong thanh pho: "; cin>>n; // nhap so luong thanh pho cout<<"Nhap chi phi cho cac cung duong n"; // nhap chi phi cho tung cung duong for(int i=1; i<=n; i++) for(int j=1;j<=n;j++){ if(i!=j){ cout<<"c["<<i<<"]["<<j<<"]="; cin>>c[i][j];// nhap chi phi cho cung duong tu thanh pho i den thanh pho j } else{ c[i][j]=0;// i trung j chi phi =0(la 1 thanh pho). } } // danh dau cac thanh pho chua xet. x[1]=1; // dinh xuat phat la dinh 1 for(int i=2;i<=n;i++){ // danh dau tat ca cac thanh pho deu chua xet chuaxet[i]=1; } } // Ham hien thi ket qua cua thuat toan void Result(){ // dinh dau tien cout<<"n T1=>"; // cac dinh tiep theo for(int i=2;i<=n;i++){ cout<<"T"<<kq[i]<<"=>";// lay danh sach cac dinh trong mang kq[i] } // quay ve dinh dau cout<<"T1"; // chi phi cua hanh trinh cout<<"n Chi phi cua hanh trinh la: "<<MIN; } // Ham tinh toan chi phi can nhanh void Work(){ int S=0; // khai bao bien de luu gia tri nhanh can for(int i=1;i<=n-1;i++){ S=S+c[x[i]][x[i+1]];// tinh chi phi:= chi phi buoc truoc+ chi phi duon di truc tiep } S=S+c[x[n]][1];// cap nhat chi phi can nhanh tu dinh cuoi den dinh xuat phat if(S<MIN||a==1){ a=0; MIN=S;// Gan chi phi can nhanh bang chi phi hanh trinh for(int i=1;i<=n;i++){ kq[i]=x[i];// ghi nho va gan cac dinh da xet vao ket qua } }
  • 24. Bài toán người đi du lịch Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng Trang 24 } // Ham thuc hien thu cac cach chon x[i] void Try(int i){ for(int j=2;j<=n;j++){ // thu cho thanh pho thu 2 den n if(chuaxet[j]){ // neu gap thanh pho chua di qua x[i]=j; // thu di qua thanh pho chuaxet[j]=0; // danh dau thanh pho if(i==n) Work(); // goi ham tinh toan và cap nhat can else Try(i+1); // goi de quy chonj tiep i+1 chuaxet[j]=1; // bo danh dau } } } // Chuong trinh chinh main(){ Init();// ham nhap du lieu Try(2);// thu chon bat dau tu x[2] Result();// hien thi ket qua getch(); }
  • 25. Bài toán người đi du lịch Hoc viên: Lê Đình Hưng; Đỗ Thanh Liên; Lương Thúy Vượng Trang 25 MỤC LỤC LỜI MỞ ĐẦU.................................................................................................................................1 CHƯƠNG I: PHÂN TÍCH BÀI TOÁN ........................................................................................ 3 1. Phát biểu bài toán .................................................................................................................... 3 2. Giới thiệu về bài toán người đi du lich ................................................................................. 3 3. Mô tả chi tiết bài toán người đi du lịch.................................................................................4 CHƯƠNG II THIẾT KẾ GIẢI THUẬT........................................................................................5 1. Giải thuật chính xác.................................................................................................................5 2. Giải thuật gần đúng(hay gọi là xấp xỉ)...................................................................................6 2.1. Giải thuật láng giềng gần nhất .........................................................................................7 2.2. Thuật toán nhánh cận ......................................................................................................10 CHƯƠNG III ĐÁNH GIÁ THUẬT TOÁN................................................................................16 1. Thuật toán vét cạn...................................................................................................................16 2. Thuật toán láng giềng gần nhất.............................................................................................16 3. Thuật toán nhánh cận.............................................................................................................17 4. Giới thiệu một số thuật toán khác........................................................................................17 Các giải thuật để tìm lời giải chính xác............................................................................17 Heuristic và các giải thuật xấp xỉ......................................................................................18 Heuristics xây dựng............................................................................................................18 Cải tiến từng bước .............................................................................................................19 k-opt heuristic.....................................................................................................................19 V'-opt heuristic....................................................................................................................19 KẾT LUẬN....................................................................................................................................20 TÀI LIỆU THAM KHẢO.............................................................................................................20