Nhận viết luận văn Đại học , thạc sĩ - Zalo: 0917.193.864
Tham khảo bảng giá dịch vụ viết bài tại: vietbaocaothuctap.net
Download luận văn đồ án tốt nghiệp ngành công nghệ thông tin với đề tài: Xây dựng phần mềm quản lý quán cà phê, cho các bạn có thể tham khảo
Nhận viết luận văn Đại học , thạc sĩ - Zalo: 0917.193.864
Tham khảo bảng giá dịch vụ viết bài tại: vietbaocaothuctap.net
Download luận văn đồ án tốt nghiệp ngành công nghệ thông tin với đề tài: Xây dựng phần mềm quản lý quán cà phê, cho các bạn có thể tham khảo
Nhận viết luận văn Đại học , thạc sĩ - Zalo: 0917.193.864
Tham khảo bảng giá dịch vụ viết bài tại: vietbaocaothuctap.net
Download luận văn đồ án tốt nghiệp với đề tài: Nghiên cứu thuật toán K-nearest neighbor và sử dụng iris flowers dataset đánh giá hiệu quả thuật toán, cho các bạn làm luận văn tham khảo
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
Download Source Code + Báo cáo (cập nhật 8/2019)
https://drive.google.com/file/d/1XuLSz_HacHOcV7KoAUUiTp5aWZRG6eS8/view
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 viên
Giáo viên hướng dẫn cô Trần Thị Lan
Nhận viết luận văn Đại học , thạc sĩ - Zalo: 0917.193.864
Tham khảo bảng giá dịch vụ viết bài tại: vietbaocaothuctap.net
Download luận văn đồ án tốt nghiệp với đề tài: Phần mềm quản lý thông tin sinh viên, cho các bạn làm luận án tham khảo, các bạn có thể làm luận văn tham khảo
Chapter 01 Planning Computer Program (re-upload)bluejayjunior
The document discusses planning computer programs. It describes that programs must be planned before writing through algorithms, flowcharts, and pseudocode. Algorithms define the logic steps, flowcharts show the logic visually through standardized symbols and connections, and pseudocode describes the logic in a code-like format without actual syntax. Examples are provided of algorithms, flowcharts, and how to represent different logic structures and program flows. Planning helps ensure the instructions are correct and in the proper sequence.
Nhận viết luận văn Đại học , thạc sĩ - Zalo: 0917.193.864
Tham khảo bảng giá dịch vụ viết bài tại: vietbaocaothuctap.net
Download luận văn đồ án tốt nghiệp với đề tài: Nghiên cứu thuật toán K-nearest neighbor và sử dụng iris flowers dataset đánh giá hiệu quả thuật toán, cho các bạn làm luận văn tham khảo
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
Download Source Code + Báo cáo (cập nhật 8/2019)
https://drive.google.com/file/d/1XuLSz_HacHOcV7KoAUUiTp5aWZRG6eS8/view
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 viên
Giáo viên hướng dẫn cô Trần Thị Lan
Nhận viết luận văn Đại học , thạc sĩ - Zalo: 0917.193.864
Tham khảo bảng giá dịch vụ viết bài tại: vietbaocaothuctap.net
Download luận văn đồ án tốt nghiệp với đề tài: Phần mềm quản lý thông tin sinh viên, cho các bạn làm luận án tham khảo, các bạn có thể làm luận văn tham khảo
Chapter 01 Planning Computer Program (re-upload)bluejayjunior
The document discusses planning computer programs. It describes that programs must be planned before writing through algorithms, flowcharts, and pseudocode. Algorithms define the logic steps, flowcharts show the logic visually through standardized symbols and connections, and pseudocode describes the logic in a code-like format without actual syntax. Examples are provided of algorithms, flowcharts, and how to represent different logic structures and program flows. Planning helps ensure the instructions are correct and in the proper sequence.
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ày
Dự án trồng dược liệu kết hợp rau sạch ngắn ngày
CÔNG TY MÔI TRƯỜNG THẢO NGUYÊN XANH
Trụ sở: 158 Nguyễn Văn Thủ, P. Đakao, Quận 1, Hồ Chí Minh
Hotline: 0839118552 - 0918755356
Fax: 08391185791
VP Hà Nội: P. 502 Số B9/D6 khu đô thị mới Cầu Giấy, Phường Dịch Vọng, Quận Cầu Giấy, Hà Nội
Hotline: ĐT: 0433526997
Home:
http://thaonguyenxanhgroup.com
http://www.lapduan.com.vn/
http://lapduandautu.com.vn/
http://lapduan.net
Nhận viết luận văn đại học, thạc sĩ trọn gói, chất lượng, LH ZALO=>0909232620
Tham khảo dịch vụ, bảng giá tại: https://baocaothuctap.net
Download luận văn tóm tắt ngành khoa học máy tính với đề tài: Ứng dụng hình học tính toán để xác định một miền chứa điểm cho trước, cho các bạn làm luận văn tham khảo
Nhận viết luận văn Đại học , thạc sĩ - Zalo: 0917.193.864
Tham khảo bảng giá dịch vụ viết bài tại: vietbaocaothuctap.net
Download luận văn thạc sĩ ngành toán ứng dụng với đề tài: Mô hình đồ thị luồng, luồng liên kết và chỉ rõ mối quan hệ với đồ thị, cho các bạn làm luận văn tham khảo
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;
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