You are on page 1of 132

LỜI CAM ĐOAN

Tôi xin cam đoan luận án này là kết quả nghiên cứu của tôi. Các kết quả viết chung với các
tác giả khác đều đã được sự nhất trí của các đồng tác giả khi đưa vào luận án. Những kiến
thức tham khảo để hoàn thành luận án đều được trích dẫn đầy đủ từ danh mục tài liệu tham
khảo.

Hà Nội, 04-2014

Người hướng dẫn khoa học Tác giả luận án

PGS.TS. Nguyễn Đức Nghĩa Ban Hà Bằng

i
LỜI CẢM ƠN

Luận án này được hoàn thành tại Bộ môn Khoa học Máy tính, Viện Công nghệ Thông tin và
Truyền thông, Trường Đại học Bách Khoa Hà Nội dưới sự hướng dẫn của PGS. TS. Nguyễn
Đức Nghĩa. Tôi xin chân thành cảm ơn Thầy hướng dẫn, người đã trực tiếp hướng dẫn khoa
học và tận tình giúp đỡ tôi trong quá trình nghiên cứu.

Tôi xin bày tỏ lòng biết ơn tới Bố Mẹ và Gia đình đã giúp đỡ, tạo điều kiện cho tôi
trong quá trình học tập và hoàn thành luận án này.

Tôi cũng xin gửi lời cảm ơn tới các thầy cô trong Viện Công Nghệ Thông Tin, cũng
như các thầy cô trong trường Đại học Bách khoa Hà Nội đã truyền thụ những kiến thức bổ
ích trong quá trình tôi học tập và nghiên cứu tại Trường.

Mặc dù đã rất cố gắng nhưng do thời thời gian và kiến thức còn hạn chế nên luận án
chắc còn có nhiều thiếu sót. Tôi rất mong nhận được những ý kiến đóng góp quý báu từ các
Thầy Cô và các bạn.

ii
Mục Lục
LỜI CAM ĐOAN ....................................................................................................i
LỜI CẢM ƠN ........................................................................................................ii
TÓM TẮT .........................................................................................................v
DANH MỤC THUẬT NGỮ ..................................................................................vii
DANH MỤC BẢNG ............................................................................................viii
DANH MỤC HÌNH VẼ ...........................................................................................x
CHƢƠNG 1 TỔNG QUAN VỀ BÀI TOÁN ...........................................................1
1.1 Mô hình toán học của bài toán cực tiểu hóa độ trễ ........................ 2
1.2 Một số hướng tiếp cận giải bài toán tối ưu hóa tổ hợp .................. 5
1.2.1 Thuật toán nhánh cận .................................................................. 5
1.2.2 Thuật toán di truyền ...................................................................... 8
1.2.3 Thuật toán đàn kiến .................................................................... 10
1.2.4 Thuật toán Tabu .......................................................................... 10
1.2.5 Thuật toán lân cận biến đổi ....................................................... 11
1.3 Các nghiên cứu liên quan giải bài toán MLP ................................. 11
1.3.1 Thuật toán đúng .......................................................................... 12
1.3.2 Thuật toán gần đúng cận tỷ lệ .................................................. 12
1.3.3 Thuật toán meta-heuristic .......................................................... 13
1.4 Mục đích, phạm vi nghiên cứu ......................................................... 14
1.5 Dữ liệu thực nghiệm........................................................................... 15
1.6 Kết quả của luận án ........................................................................... 18
1.7 Cấu trúc của luận án .......................................................................... 20
CHƢƠNG 2 THUẬT TOÁN NHÁNH CẬN .........................................................21
2.1 Thuật toán của Wu et al. ................................................................... 22
2.2 Lược đồ thuật toán đề xuất ................................................................ 23
2.3 Kết quả thực nghiệm .......................................................................... 28
2.3.1 Thực nghiệm bộ dữ liệu ngẫu nhiên........................................ 30
2.3.2 Thực nghiệm bộ dữ liệu thực ................................................... 31
2.4 Kết luận chương 2 ............................................................................... 37
iii
CHƢƠNG 3 CÁC THUẬT TOÁN GẦN ĐÚNG CẬN TỶ LỆ ...............................38
3.1 Đánh giá thực nghiệm hiệu quả của các thuật toán gần đúng cận
tỷ lệ ....................................................................................................... 39
3.1.1 Các thuật toán gần đúng cận tỷ lệ ........................................... 39
3.1.2 Kết quả thực nghiệm .................................................................. 47
3.2 Thuật toán dựa trên phương pháp Subgradient ........................... 55
3.2.1 Lược đồ thuật toán ..................................................................... 55
3.2.2 Kết quả thực nghiệm .................................................................. 60
3.3 Kết luận chương 3.......................................................................... 67
CHƢƠNG 4 CÁC THUẬT TOÁN META-HEURISTIC........................................68
4.1. Thuật toán di truyền ........................................................................... 69
4.1.1 Lược đồ của thuật toán .............................................................. 69
4.1.2 Kết quả thực nghiệm ................................................................. 74
4.2 Thuật toán di truyền lai ghép đàn kiến ............................................. 85
4.2.1 Lược đồ của thuật toán .............................................................. 86
4.2.2 Kết quả thực nghiệm .................................................................. 91
4.3 Thuật toán lai thuật toán Tabu và thuật toán lân cận biến đổi ..... 98
4.3.1 Lược đồ của thuật toán .............................................................. 98
4.3.2 Kết quả thực nghiệm ................................................................ 106
4.4 Kết luận chương 4 ............................................................................ 114
KẾT LUẬN .....................................................................................................115
DANH MỤC CÁC CÔNG TRÌNH ......................................................................118
CÔNG BỐ ĐƢỢC SỬ DỤNG TRONG LUẬN ÁN ............................................118
TÀI LIỆU THAM KHẢO ....................................................................................119

iv
TÓM TẮT

Bài toán cực tiểu hóa độ trễ (Minimum latency problem - MLP) dưới dạng tổng quát có thể
phát biểu trong ngôn ngữ của lý thuyết đồ thị như sau: Cho G = (V, E) là đồ thị vô hướng có
trọng số không âm trên mỗi cạnh e  E. Giả sử, T là một hành trình xuất phát từ đỉnh s,
chúng ta định nghĩa độ trễ của một đỉnh v bất kỳ thuộc T là độ dài của đường đi từ đỉnh xuất
phát s đến v trên T. Độ trễ của hành trình T được định nghĩa như là tổng độ trễ của tất cả các đỉnh
thuộc hành trình T. Bài toán cực tiểu hóa độ trễ MLP yêu cầu tìm một hành trình T bắt đầu từ
đỉnh xuất phát s đi qua tất cả các đỉnh còn lại của đồ thị với tổng độ trễ là nhỏ nhất.

Bài toán MLP có nhiều ứng dụng trong thực tiễn. Cụ thể, trong lý thuyết lập lịch khi
một máy chủ hay một người thợ phải lên kế hoạch phục vụ một tập các yêu cầu sao cho tổng
(trung bình) thời gian chờ đợi của các yêu cầu là cực tiểu. Trong tìm đường đi trên mạng, bài
toán cũng được ứng dụng để tìm hành trình với tổng độ trễ là nhỏ nhất. Trong bài toán tìm
kiếm thông tin, bài toán MLP được ứng dụng để cực tiểu hóa độ trễ của việc tìm kiếm thông
tin trên mạng.

Mục đích nghiên cứu của chúng tôi trong luận án này là đề xuất các thuật toán giải bài
toán MLP với chất lượng lời giải tốt hơn chất lượng lời giải của các thuật toán giải bài toán
MLP đã được công bố. Đối với một bài toán NP-khó như bài toán MLP, hiện tại có ba hướng
tiếp cận chính để phát triển thuật toán giải: 1) hướng tiếp cận đúng, 2) hướng tiếp cận gần
đúng cận tỷ lệ, 3) hướng tiếp cận meta-heuristic. Đóng góp của chúng tôi trong luận án là đề
xuất các thuật toán giải theo cả ba hướng tiếp cận:

 Phát triển thuật toán đúng đưa ra lời giải tối ưu cho bài toán MLP với kích thước
bài toán lên đến 40 đỉnh.
 Khảo sát thực nghiệm về hiệu quả của các thuật toán gần đúng cận tỷ lệ hiện biết,
là cơ sở để đề xuất thuật toán gần đúng mới có cận tỷ lệ tốt hơn.
 Phát triển ba thuật toán theo hướng tiếp cận meta-heuristic. Chúng tôi đề xuất thuật
toán dựa trên lược đồ của thuật toán di truyền để giải bài toán MLP và một số kỹ
thuật mới được tích hợp vào từng bước của thuật toán. Nhằm nâng cao chất lượng
lời giải và thời gian chạy thuật toán, chúng tôi đề xuất hai thuật toán meta-heuristic
lai là: Thuật toán (ACO-GA) lai ghép giữa thuật toán di truyền (GA) và thuật toán
đàn kiến (ACO); và thuật toán TS-VNS lai ghép giữa thuật toán Tabu (TS) và thuật
toán lân cận biến đổi (VNS).

v
Để đánh giá hiệu quả của các thuật toán đề xuất, chúng tôi tiến hành thực nghiệm trên các bộ
dữ liệu chuẩn và so sánh kết quả thu được với kết quả của các công trình nghiên cứu liên
quan. Kết quả thực nghiệm chỉ ra các thuật toán đề xuất đưa ra lời giải tốt hơn các thuật toán
tốt nhất hiện biết trên nhiều bộ dữ liệu.

vi
DANH MỤC THUẬT NGỮ

STT Từ viết tắt Giải nghĩa tiếng Anh Giải nghĩa tiếng Việt
1 ACO Ant conoly optimization Tối ưu hoá đàn kiến
Thuật toán di truyền lai ghép thuật
2 ACO-GA -
toán đàn kiến
3 GA Genetic algorithm Thuật toán di truyền
4 TS Tabu search Tìm kiếm Tabu
5 VNS Variable neighborhood search Tìm kiếm lân cận biến đổi
Thuật toán tabu lai ghép thuật toán
6 TS-VNS -
đa lân cận
7 MLP Minimum latency problem Bài toán cực tiểu hóa độ trễ
8 TSP Traveling salesman problem Bài toán người du lịch
9 TRP Traveling repairman problem Bài toán thợ sửa chữa lưu động
10 DMP Delivery man problem Bài toán người giao hàng
Time dependent traveling Bài toán người du lịch với thời gian
11 TDTSP
Salesman pproblem bị chặn
12 DP Dynamic programming Quy hoạch động
13 B&B Branch and bound Phương pháp nhánh cận
14 CP Constraint programming Quy hoạch ràng buộc
15 - Approximation algoirthm Thuật toán gần đúng
16 - Simulated annealing algorithm Thuật toán phỏng tôi luyện
17 - Local search Tìm kiếm địa phương
Greedy randomized adaptive Thủ tục tìm kiếm tham lam ngẫu
18 GRASP
search procedure nhiên tự thích nghi
19 ILS Iterated local search Tìm kiếm địa phương leo đồi
Random variable neighborhood
20 RVND Tụt lân cận biến đổi ngẫu nhiên
descend
Bài toán cây khung nhỏ nhất đi qua
21 k-MST k-minimum spanning tree
k đỉnh
Bài toán hành trình ngắn nhất đi qua
22 k-troll Minimum k-troll problem
k đỉnh
23 PCST Prize collecting steiner tree Bài toán cây Steiner
Polynomial time algorithm
24 - Thuật toán thời gian tính đa thức
(Polynomial algorithm)
25 Benchmark test Bộ dữ liệu chuẩn
26 OPT Best known solution Lời giải tốt nhất hiện biết
27 SDT Social disaster technique Kỹ thuật hủy diệt

vii
DANH MỤC BẢNG

Bảng 1. 1 Mô tả các bộ dữ liệu ................................................................................................ 15


Bảng 2. 1 Thời gian chạy của thuật toán trong bộ dữ liệu ngẫu nhiên 1 (tính theo phút) ....... 32
Bảng 2. 2 Thời gian chạy của thuật toán trong bộ dữ liệu ngẫu nhiên 2 (tính theo phút) ....... 33
Bảng 2. 3 Thời gian chạy của thuật toán trong bộ dữ liệu thực 2 (tính theo phút) .................. 34
Bảng 2. 4 Thời gian chạy của thuật toán trong bộ dữ liệu ngẫu nhiên 3 (TPR-10-Rx) (tính
theo giây) ................................................................................................................. 35
Bảng 2. 5 Thời gian chạy của thuật toán trong bộ dữ liệu ngẫu nhiên 3 (TPR-20-Rx) (tính
theo giây) ................................................................................................................. 36
Bảng 2. 6 Thời gian chạy của thuật toán cho các file dữ liệu nhỏ trong ................................. 36
Bảng 3. 1 Kết quả thực nghiệm các thuật toán trong các bộ dữ liệu nhỏ ................................ 51
Bảng 3. 2 Kết quả thực nghiệm các thuật toán trên bộ dữ liệu ngẫu nhiên 3 (TPR-50-Rx) .... 52
Bảng 3. 3 Kết quả thực nghiệm các thuật toán trên bộ dữ liệu ngẫu nhiên 3 (TPR-100-Rx) .. 53
Bảng 3. 4 Kết quả thực nghiệm các thuật toán trên bộ dữ liệu thực 1 ..................................... 54
Bảng 3. 5 Kết quả thực nghiệm cho các bộ dữ liệu nhỏ .......................................................... 63
Bảng 3. 6 Kết quả thực nghiệm với bộ dữ liệu ngẫu nhiên 3 (TPR-50-Rx) ............................ 64
Bảng 3. 7 Mô tả gap1 , gap 2 đối với các bộ dữ liệu nhỏ .......................................................... 64
Bảng 3. 8 Mô tả T đối với các bộ dữ liệu nhỏ .......................................................................... 64
Bảng 3. 9 Kết quả thực nghiệm với bộ dữ liệu ngẫu nhiên 3 (TPR-100-Rx) .......................... 65
Bảng 3. 10 Kết quả thực nghiệm với bộ dữ liệu thực 1 ........................................................... 66
Bảng 3.11 Mô tả gap1 , gap 2 đối với các bộ dữ liệu lớn .......................................................... 66
Bảng 3. 12 Mô tả T đối với các bộ dữ liệu lớn ........................................................................ 66
Bảng 4. 1 Thực nghiệm lựa chọn kích thước quần thể ............................................................ 76
Bảng 4. 2 Thực nghiệm lựa chọn tham số xác xuất lai ghép và đột biến ................................ 76
Bảng 4. 3 Thực nghiệm lựa chọn kích thước nhóm ................................................................. 76
Bảng 4. 4 Thực nghiệm lựa chọn tỷ lệ  1 ............................................................................... 77
Bảng 4. 5 Thực nghiệm xác định giá trị NGD ......................................................................... 77
Bảng 4. 6 Thực nghiệm xác định giá trị NGT .......................................................................... 77
Bảng 4. 7 Kết quả thực nghiệm các thuật toán cho các bộ dữ liệu nhỏ ................................... 81
Bảng 4. 8 Kết quả thực nghiệm các thuật toán cho bộ dữ liệu ngẫu nhiên 3 (TPR-50-Rx) .... 82
Bảng 4. 9 Kết quả thực nghiệm các thuật toán cho bộ dữ liệu ngẫu nhiên 3 (TPR-100-Rx) .. 82
Bảng 4. 10 Kết quả thực nghiệm các thuật toán cho bộ dữ liệu ngẫu nhiên 3 (TPR-200-Rx) 83
Bảng 4. 11 Kết quả thực nghiệm các thuật toán cho bộ dữ liệu thực 1 ................................... 84
Bảng 4. 12 Mô tả T theo phút đối với các bộ dữ liệu lớn ........................................................ 84
Bảng 4. 13 Kết quả thực nghiệm của các thuật toán ................................................................ 92
Bảng 4. 14 Kết quả so sánh các thuật toán cho cho các bộ dữ liệu nhỏ .................................. 94

viii
Bảng 4. 15 Kết quả so sánh các thuật toán cho bộ dữ liệu ngẫu nhiên 3 (TPR-50-Rx) .......... 95
Bảng 4. 16 Kết quả so sánh các thuật toán cho bộ dữ liệu ngẫu nhiên 3 (TPR-100-Rx) ........ 95
Bảng 4. 17 Kết quả so sánh các thuật toán cho bộ dữ liệu ngẫu nhiên 3 (TPR-200-Rx) ........ 96
Bảng 4. 18 Kết quả so sánh các thuật toán cho bộ dữ liệu thực 2 ........................................... 97
Bảng 4. 19 Mô tả T đối với các bộ dữ liệu lớn ......................................................................... 97
Bảng 4. 20 Kết quả thực nghiệm các thuật toán cho các bộ dữ liệu nhỏ ............................... 109
Bảng 4. 21 Kết quả thực nghiệm các thuật toán cho các bộ dữ liệu ngẫu nhiên 3 (TPR-50-Rx)
............................................................................................................................. 110
Bảng 4. 22 Kết quả thực nghiệm các thuật toán cho bộ dữ liệu ngẫu nhiên 3 (TPR-100-Rx)
............................................................................................................................. 110
Bảng 4. 23 Kết quả thực nghiệm các thuật toán cho các bộ dữ liệu ngẫu nhiên 3 (TPR-200-
Rx)....................................................................................................................... 111
Bảng 4. 24 Kết quả thực nghiệm các thuật toán cho các bộ dữ liệu ngẫu nhiên 3 (TPR-500-
Rx)....................................................................................................................... 111
Bảng 4. 25 Kết quả thực nghiệm các thuật toán cho bộ dữ liệu thực 1 ................................. 112
Bảng 4. 26 So sánh độ lệch chuẩn độ trễ lời giải của các thuật toán ..................................... 113
Bảng 4. 27 Mô tả T đối với các bộ dữ liệu lớn ...................................................................... 113
Bảng 5. 1 Tổng hợp các thuật toán đề xuất ............................................................................ 117

ix
DANH MỤC HÌNH VẼ

Hình 1. 1 Minh họa bài toán MLP trên cây có trọng số............................................................. 3
Hình 1. 2 Minh họa bài toán MLP trên đường thẳng ................................................................. 3
Hình 1. 3 Quá trình phân nhánh ................................................................................................. 6
Hình 1. 4 Phân hoạch tập con .................................................................................................... 7
Hình 2. 1 Thời gian chạy trung bình các file dữ liệu (n = 30) trong các bộ dữ liệu ................ 29
Hình 2. 2 Thời gian chạy trung bình các file dữ liệu (n = 35) trong các bộ dữ liệu ................ 29
Hình 2. 3 Thời gian chạy trung bình các file dữ liệu (n = 40) trong các bộ dữ liệu ................ 29
Hình 2. 4 Thời gian chạy trung bình các file dữ liệu (n = 10, 20) của bộ dữ liệu ngẫu nhiên 3
................................................................................................................................. 29
Hình 2. 5 Thời gian chạy trung bình các file dữ liệu trong mỗi nhóm của bộ dữ liệu thực 2 . 30
Hình 2. 6 Thời gian chạy trung bình các file dữ liệu nhỏ trong bộ dữ liệu thực 2 .................. 30
Hình 3. 1 Hình vuông (bounding box) bao phủ các đỉnh......................................................... 45
Hình 3. 2 Phân chia ô vuông và quadtree tương ứng ............................................................... 45
Hình 3. 3 Tập các portal ........................................................................................................... 46
Hình 3. 4 Minh họa crossing đi qua các portal ........................................................................ 46
Hình 3. 5 Cận tỷ lệ thực nghiệm trung bình của các thuật toán đối với các bộ dữ liệu nhỏ .... 49
Hình 3. 6 Cận dưới trung bình của các thuật toán đối với các bộ dữ liệu nhỏ......................... 49
Hình 3. 7 Thời gian chạy trung bình của các thuật toán đối với các bộ dữ liệu nhỏ ............... 49
Hình 3. 8 Cận tỷ lệ trung bình của các thuật toán đối với các bộ dữ liệu lớn .......................... 49
Hình 3. 9 Thời gian chạy trung bình của các thuật toán đối với các bộ dữ liệu lớn ................ 50
Hình 4. 1 Minh họa sự hội tụ của thuật toán GA−SDT và GA−no−SDT tại file test 1 trong bộ
dữ liệu ngẫu nhiên 1 qua các thế hệ ........................................................................ 78
Hình 4. 2 Minh họa sự hội tụ của thuật toán GA−SDT và GA−no−SDT tại file test 1 trong bộ
dữ liệu ngẫu nhiên 2 qua các thế hệ ........................................................................ 78
Hình 4. 3 Minh họa sự hội tụ của thuật toán GA−SDT và GA−no−SDT tại file KroA100
trong bộ dữ liệu thực 2 qua các thế hệ..................................................................... 78
Hình 4.4 Minh họa hành trình MLP tốt nhất hiện biết trên một số file dữ liệu ..................... 108

x
CHƢƠNG 1
TỔNG QUAN VỀ BÀI TOÁN

Chương này giới thiệu bài toán cực tiểu hoá độ trễ (Minimum latency problem - MLP), trình
bày một số hướng tiếp cận để giải bài toán, các nghiên cứu liên quan, phạm vi nghiên cứu, bộ
dữ liệu thực nghiệm, đóng góp và cấu trúc của luận án.

Bài toán thiết kế mạng là một vấn đề được rất nhiều nhà nghiên cứu quan tâm. Việc
lựa chọn một cấu hình tối ưu hoặc thiết kế một mạng tối ưu có rất nhiều ứng dụng trong thực
tiễn như trong giao thông, mạng máy tính, … . Trong bài toán thiết kế mạng, nếu độ trễ của
một nút được hiểu là độ dài đường đi từ nút nguồn đến nút đó, thì mục đích đặt ra là tìm một
hành trình bắt đầu từ nút nguồn đến các nút còn lại trên mạng sao cho tổng độ trễ là cực tiểu.
Xét ví dụ minh họa, xét mạng gồm 6 nút, trong đó khoảng cách giữa các nút được cho bởi ma
trận trọng số C = (cij) sau đây:

0 12 40 10 9 16 
12 0 19 12 70 15 
 
 40 19 0 21 60 17 
C 
10 12 21 0 10 16 
9 70 60 10 0 10 
 
10 15 17 16 10 0

Xét hành trình T bắt đầu từ nút nguồn 1 đi qua tất cả các nút còn lại trên mạng: (1, 5, 4, 2, 3,
6). Khi đó, độ trễ của một nút trên T được hiểu là độ dài của đoạn đường trên T đi từ nút
nguồn 1 đến nó và độ trễ của hành trình T là tổng độ trễ của tất cả các nút trong T: 9 + (9 +
10) + (9 + 10 + 12) + (9 + 10 + 12 + 19) + (9 + 10 + 12 + 19 + 17) = 192. Hành trình T* = (1,
5, 4, 2, 6, 3) với độ trễ 168, đây cũng là hành trình có tổng độ trễ nhỏ nhất. Mục đích đặt ra là
tìm hành trình xuất phát từ nút nguồn 1 đi qua các nút còn lại trên mạng với độ trễ là nhỏ
nhất. Bài toán vừa phát biểu là một ví dụ về bài toán cực tiểu hóa độ trễ.

Bài toán cực tiểu hóa độ trễ (MLP) là một dạng khác của bài toán thợ sửa chữa lưu
động (Traveling repairman problem – TRP) [4, 14, 40], bài toán người giao hàng (Delivery
man problem – DMP) [12, 30, 31]. Bài toán cực tiểu hóa độ trễ cũng là một trường hợp đặc
biệt của bài toán người du lịch với thời gian bị chặn (Time dependent traveling salesman
problem – TDTSP) [28, 36], trong đó để tính tổng chi phí của một hành trình của bài toán

1
TDTSP, khoảng cách giữa hai đỉnh thứ i và đỉnh thứ (i + 1) trong hành trình cần được nhân
với trọng số w(i) trước khi chúng được cộng lại. Rõ ràng là bài toán người du lịch (Traveling
salesman problem – TSP) thu được từ bài toán TDTSP khi đặt w(i) = 1; còn nếu đặt w(i) = n
– i, ta thu được bài toán MLP. Chúng ta có thể thấy điểm giống nhau của hai bài toán TSP và
MLP đều là tìm một hành trình tối ưu. Tuy nhiên, Blum et al. [6] chỉ ra rằng bài toán MLP
được xem là khó hơn so với bài toán TSP. Với một sự thay đổi nhỏ trong hàm mục tiêu và đồ
thị đầu vào thì bài toán MLP không có đặc tính cục bộ giống như bài toán TSP. Trong bài
toán TSP, nếu hoán đổi vị trí của một vài đỉnh trong hành trình thì sự thay đổi trong hàm mục
tiêu chỉ mang tính cục bộ. Trong khi đó, việc hoán đổi như vậy lại có thể dẫn đến sự thay đổi
lớn trong hàm mục tiêu của bài toán MLP [6]. Một đặc điểm khác nữa của bài toán MLP đó
là chỉ cần một thay đổi nhỏ trong đồ thị đầu vào, đã có thể dẫn đến sự thay đổi lớn trong hành
trình tối ưu của bài toán [43]. Điều này cho thấy, chúng ta khó có thể thiết kế một thuật toán
theo hướng chia để trị để giải bài toán MLP. Bởi vì các bài toán bộ phận có mối liên hệ với
các bài toán bộ phận khác, nên ta khó có thể tìm được cách chia bài toán cần giải ra thành các
bài toán bộ phận; sau đó, tìm lời giải tối ưu của từng bài toán bộ phận bằng cách trị đệ qui
chúng, và cuối cùng, cần xây dựng được phương pháp hiệu quả để tổng hợp lời giải tối ưu
của các bài toán bộ phận này để thu được lời giải tối ưu cho bài toán đặt ra.

Bài toán MLP có nhiều ứng dụng trong thực tiễn. Cụ thể, trong lý thuyết lập lịch khi
một máy chủ hay một người thợ phải lên kế hoạch phục vụ một tập các yêu cầu sao cho tổng
(trung bình) thời gian chờ đợi của các yêu cầu là cực tiểu [6, 41]. Trong tìm đường đi trên
mạng, bài toán cũng được ứng dụng để tìm hành trình với tổng độ trễ là nhỏ nhất [42]. Trong
bài toán tìm kiếm thông tin, bài toán MLP được ứng dụng để cực tiểu hóa độ trễ của việc tìm
kiếm thông tin trên mạng [42].

Bài toán MLP được chứng minh thuộc lớp bài toán NP-khó trong trường hợp tổng
quát [41] và thậm chí vẫn là NP-khó ngay cả với đồ thị là cây có trọng số [44]. Hơn thế nữa,
ngoại trừ P = NP, một lược đồ xấp xỉ với thời gian đa thức trong trường hợp tổng quát là
không tồn tại [41]. Bên cạnh đó, trong một số trường hợp đặc biệt, bài toán giải được bởi
thuật toán có độ phức tạp thời gian đa thức, được đề cập trong các công trình [6, 14, 31, 49].

1.1 Mô hình toán học của bài toán cực tiểu hóa độ trễ

Bài toán cực tiểu hóa độ trễ (MLP) dưới dạng tổng quát có thể phát biểu trong ngôn ngữ của
lý thuyết đồ thị như sau: Cho G = (V, E) là đồ thị vô hướng có trọng số không âm trên mỗi

2
1

1 1
2 7

1 2 2 4
4
3
3 5 8 9

5 6

Hình 1. 1 Minh họa bài toán MLP trên cây có trọng số

5 4 3 2 1 7 8 9
Hình 1. 2 Minh họa bài toán MLP trên đường thẳng

cạnh e  E. Giả sử, T là một hành trình xuất phát từ s, chúng ta định nghĩa độ trễ của một
đỉnh v bất kỳ thuộc T là độ dài của đường đi từ đỉnh xuất phát s đến v trên T. Độ trễ của hành
trình T được định nghĩa như là tổng độ trễ của tất cả các đỉnh thuộc nó. Bài toán cực tiểu hóa độ
trễ MLP yêu cầu tìm một hành trình T bắt đầu từ đỉnh xuất phát từ s đi qua tất cả các đỉnh còn
lại của đồ thị với tổng độ trễ là nhỏ nhất.

Sau đây, chúng ta đưa ra một số ví dụ minh họa về bài toán MLP trên một số dạng đồ
thị đặc biệt:
Ví dụ 1: Xét bài toán MLP trên cây như hình 1.1, giả sử, T là một hành trình xuất phát từ đỉnh
s (s = 1) đi qua các đỉnh còn lại trên cây. Chúng ta định nghĩa lat(v) là độ dài đường đi từ
đỉnh 1 đến đỉnh v trên T và được tính bằng tổng trọng số của các cạnh nằm trên đường đi từ
đỉnh 1 đến đỉnh v trên T. Chúng ta cũng giả sử rằng độ trễ của việc quay ngược trở lại từ đỉnh
hiện tại đến đỉnh trước đó là bằng 0, thì khi đó tổng độ trễ của một hành trình MLP trên cây
được tính như sau:
T = (1, 2, 3, 4, 7, 8, 5, 9, 6) và L(T) = lat(1) + lat(2) + lat(3) + lat(4) + lat(7) + lat(8) + lat(5)
+ lat(9) + lat(6) = 0 + 1 + 2 + 4 + 5 + 7 + 13 + 18 + 25 = 75.

3
Ví dụ 2: Xét bài toán MLP khi mà các đỉnh của đồ thị nằm trên một đường thẳng như Hình
1.2. Chúng ta thấy rằng hành trình MLP có thể duyệt qua duyệt lại các đỉnh của đồ thị với số
lần không xác định. Điều đó cho thấy đặc tính không phẳng của hành trình MLP và đây cũng
là một điểm thể hiện sự khác biệt với hành trình của bài toán TSP.

Bây giờ, chúng ta sẽ mô tả phép biến đổi được đề xuất bởi Wu et al. [50], để quy bài
toán MLP tổng quát về bài toán MLP trên đồ thị metric. Đồ thị metric là đồ thị mà trọng số
trên các cạnh thỏa mãn tính chất bất đẳng thức tam giác. Đầu tiên, chúng ta xây dựng đồ thị
vô hướng đầy đủ G  (V ,V V ), với trọng số trên mỗi cạnh (u, v) là đường đi ngắn nhất giữa

hai đỉnh đó trên đồ thị G. Đối với một hành trình T trên G , chúng ta có thể xây dựng một

hành trình T tương ứng trên G bằng việc thay thế mỗi cạnh (u, v) trong T bởi đường đi ngắn
nhất giữa hai đỉnh u và v trên G. Wu et al. [50] đã chỉ ra rằng hành trình MLP tối ưu của hai
đồ thị là như nhau và nếu chúng ta có một thuật toán giải bài toán MLP trong đồ thị metric
với độ phức tạp thời gian là O(T(n)), thì cùng chất lượng lời giải tương tự, thuật toán đó giải
bài toán MLP tổng quát với độ phức tạp thời gian là O(T(n) + f(n)), trong đó, f(n) là độ phức
tạp thời gian cho việc tính đường đi ngắn nhất giữa các cặp đỉnh trong đồ thị G (chẳng hạn,
nếu sử dụng thuật toán Floyd-Warshall, ta có f(n) = O(n3)).

Do có thể quy bài toán MLP tổng quát về bài toán MLP trong trường hợp đồ thị
metric, nên trong luận án này, chúng tôi sẽ chỉ xét bài toán MLP trong trường hợp đồ thị
metric. Bài toán MLP có thể phát biểu như sau: Cho đồ thị đầy đủ Kn với tập đỉnh V = {1, 2,
…, n} và ma trận chi phí không âm C = {cij | i, j=1, 2, …, n}, với cij là khoảng cách giữa hai
đỉnh i và j. Giả sử, T = (v1, v2, …, vn) là một hành trình xuất phát từ v1 (đường đi xuất phát từ
v1 đi qua mỗi đỉnh của đồ thị đúng một lần) trên Kn. Ký hiệu P(v1, vk) là đoạn đường đi từ v1
đến vk trên hành trình T. Ta gọi độ trễ của đỉnh vk trên hành trình T, ký hiệu bởi lat(vk), là độ
dài của đường đi P(v1, vk):
k 1
lat (vk )   c(vi , vi 1 ), k  2, 3, ..., n.
i 1

Độ trễ của hành trình T, ký hiệu là L(T), được định nghĩa như là tổng độ trễ của tất cả các đỉnh
thuộc nó:
n
L(T )   lat (vk ).
k 2

Giả sử, v1 là đỉnh cho trước, bài toán MLP yêu cầu tìm hành trình xuất phát từ v1 với độ trễ là nhỏ
nhất.

4
1.2 Một số hƣớng tiếp cận giải bài toán tối ƣu hóa tổ hợp

Đối với bài toán thuộc lớp NP – khó như bài toán MLP, hiện tại có một số hướng tiếp cận
thường được áp dụng để phát triển thuật toán sau đây:
 Phát triển thuật toán đúng tìm lời giải tối ưu. Các thuật toán theo hướng này có độ
phức tạp bùng nổ tổ hợp trong trường hợp tồi nhất, mặc dù trong thực tế chúng
thường chạy nhanh hơn đánh giá lý thuyết này. Thuật toán quy hoạch động
(Dynamic programming – DP) [7], thuật toán nhánh cận (Branch and bound –
B&B), quy hoạch có ràng buộc (Constraint programming – CP), quy hoạch tuyến
tính dựa trên nhánh cận (Linear programming based branch and bound – LP),
Branchcut, Branchprice, và Branchcutprice [29, 38] thuộc lớp thuật toán này.
 Phát triển thuật toán gần đúng cận tỷ lệ α (α – approximation algoirthm). Ưu điểm
của lớp thuật toán là nó đảm bảo đưa ra lời giải với chi phí không lớn hơn α lần chi
phí của lời giải tối ưu [19, 47, 48].
 Phát triển thuật toán meta-heuristic có độ phức tạp thời gian không quá lớn và tiến
hành thực nghiệm đánh giá hiệu quả của thuật toán trên các bộ dữ liệu chuẩn.
Thuật toán di truyền (Genetic algorithm) [13, 32], thuật toán phỏng tôi luyện
(Simulated annealing algorithm) [19], thuật toán Tabu (Tabu search) [20, 46] thuật
toán lân cận biến đổi (Variable neighborhood search-VNS) [21, 22, 23, 33] và
thuật toán tìm kiếm địa phương (Local search) [37] thuộc lớp thuật toán này.

Tiếp theo, là phần trình bày tổng quan về sơ đồ của một số thuật toán cơ bản để giải
bài toán tối ưu tổ hợp: Thuật toán nhánh cận [29, 38], thuật toán di truyền [13, 32], thuật toán
đàn kiến [10], thuật toán tabu và thuật toán lân cận biến đổi [21, 22, 23, 33].

1.2.1 Thuật toán nhánh cận

Ý tưởng của thuật toán trên mô hình bài toán tối ưu tổ hợp tổng quát được mô tả như sau:
min {f(x): x  D},
trong đó D là tập hữu hạn phần tử.
Giả thiết rằng tập D được mô tả như sau:
D = {x = (x1, x2, ..., xn)  A1 × A2 × ... × An: x thoả mãn tính chất P},
trong đó A1, A2, ..., An là các tập hữu hạn và P là tính chất cho trên tích Đề–các A1 × A2 × ... ×
An. Mỗi phần tử x  D được gọi là một phương án (hay còn gọi là lời giải chấp nhận được),
còn tập D được gọi là tập các phương án của bài toán.

5
Thuật toán nhánh cận bao gồm hai thủ tục: Phân nhánh (Branching procedure) và tính cận
(Bounding procedure).

Phân nhánh: Thủ tục này thực hiện việc phân hoạch tập các phương án ra thành các
tập con với kích thước càng ngày càng nhỏ cho đến khi thu được phân hoạch tập các phương
án ra thành các tập con một phần tử. Quá trình phân nhánh được thực hiện nhờ thuật toán
quay lui. Thoạt tiên, trên cơ sở tính chất P, ta có thể xác định được tập S1  a11 , a12 ,..., a1n 
1

những phần tử của tập A1 có thể chọn vào vị trí thứ nhất của lời giải. Do đó, ta có phân hoạch
của tập D ra thành n1 tập con được mô tả trong Hình 1.3. Ở đây, ta ký hiệu
D(a1i )  {x  D : x1  a1i }, i  1, 2, ..., n1 là tập các phương án có thể phát triển từ phương án bộ
phận rỗng (). Ta có:
D = D (a11 )  D ( a12 )  ...  D ( a1n1 ) .
Như vậy, ta có thể đặt tương ứng mỗi phương án bộ phận cấp k (a1, a2, ..., ak) với một tập con
các phương án của bài toán:
D(a1, ..., ak) = {x  D: xi = ai , i = 1,..., k}.
Ở bước tổng quát của thuật toán quay lui, ta sẽ làm việc với phương án bộ phận (a1, a2, ..., ak)
và xét các cách tiếp tục phát triển phương án này. Điều đó tương đương với việc phân hoạch
tập D ra thành các tập con nhỏ hơn. Giả sử a1k 1 ,..., akp1 là các khả năng lựa chọn thành phần
thứ k+1 của lời giải, quá trình phân hoạch tập D(a 1 , …, a k ) được thực hiện như:
D = D (a11 )  D ( a12 )  ...  D ( a1n1 ) .
Như vậy, ta có thể đặt tương ứng mỗi phương án bộ phận cấp k (a1, a2, ..., ak) với một tập con
các phương án của bài toán:
D(a1, ..., ak) = {x  D: xi = ai , i = 1,..., k}
()D

-
𝐷(𝑎11 ) 𝐷(𝑎12 )
Hình 1. 3 Quá trình phân nhánh

6
𝐷(𝑎1 , 𝑎2 , … , 𝑎𝑘 ) = *𝑥 ∈ 𝐷: 𝑥𝑖 = 𝑎𝑖 , 𝑖 = 1, … , 𝑘+

1 𝑝
𝑎𝑘+1 𝑎𝑘+1

𝑝
1
𝐷(𝑎1 , 𝑎2 , … , 𝑎𝑘 , 𝑎𝑘+1 )) 𝐷(𝑎1 , 𝑎2 , … , 𝑎𝑘 , 𝑎𝑘+1 )

Hình 1. 4 Phân hoạch tập con

Ở bước tổng quát của thuật toán quay lui, ta sẽ làm việc với phương án bộ phận (a1, a2, ..., ak)
và xét các cách tiếp tục phát triển phương án này. Điều đó tương đương với việc phân hoạch
tập D ra thành các tập con nhỏ hơn. Giả sử a1k 1 ,..., akp1 là các khả năng lựa chọn thành phần
thứ k+1 của lời giải, quá trình phân hoạch tập D(a1, …, ak) được thực hiện như sau: Ta có
p
phân hoạch: D (a1 , ..., ak )  D( a1,..., ak , aki 1 ) . Thay biểu diễn của D(a1, …, ak) vào chỗ của
i 1

nó trong phân hoạch đang có của tập D ta thu được phân hoạch mới của tập D ra thành các
tập con.

Tính cận: Cần đưa ra cách tính cận cho giá trị hàm mục tiêu của bài toán trên mỗi tập
con trong phân hoạch của tập các phương án. Cần xây dựng hàm g xác định trên tập tất cả các
phương án bộ phận của bài toán thoả mãn bất đẳng thức sau:
g(a1,..., ak) ≤ min{f(x): x  D, xi = ai, i = 1,..., k} (1.1)
Bất đẳng thức (1.1) có nghĩa là giá trị của hàm g tại phương án bộ phận (a1, a2, ..., ak) không
vượt quá giá trị nhỏ nhất của hàm mục tiêu của bài toán trên tập con các phương án:
D(a1,..., ak) = {x  D: xi = ai, i = 1,..., k},
nghĩa là g(a1, a2, ..., ak) là cận dưới cho giá trị hàm mục tiêu trên tập D(a1, a2, ..., ak). Vì lẽ
đó, hàm g được gọi là hàm cận dưới và giá trị g(a1, a2, ..., ak) được gọi là cận dưới của tập
D(a1, a2, ..., ak). Do có thể đồng nhất tập D(a1, a2, ..., ak) với phương án bộ phận (a1, a2, ...,
ak), nên ta cũng gọi giá trị g(a1, a2, ..., ak) là cận dưới của phương án bộ phận (a1,..., ak).

Giả sử, đã có hàm g, ta xét cách sử dụng hàm này để giảm bớt khối lượng duyệt trong
quá trình duyệt tất cả các phương án theo thuật toán quay lui. Trong quá trình liệt kê các

7
Thuật toán 1.1. Thuật toán nhánh cận
1. BEGIN
2. f := +∞;
3. Branch (1);
4. if ( f < +∞) then
5. < f là giá trị tối ưu và x là phương án tối ưu>;
6. else
7. <Bài toán không có phương án>;
8. end if
9. END

Thuật toán 1.2. Branch (k)


1. BEGIN
2. for ak  Ak do
3. if (ak  Sk) then
4. xk := ak;
5. if (k == n) then < Cập nhật kỉ lục>
6. else
7. If (g(x1,..., xk) ≤ f ) then Branch(k + 1);
8. end if
9. end for
10. END

phương án có thể đã thu được một số phương án của bài toán. Gọi x là phương án với giá trị
hàm mục tiêu nhỏ nhất trong số các phương án đã tìm được và f  f (x) . Ta sẽ gọi x là

phương án tốt nhất hiện có và f là kỉ lục. Giả sử đã có f , khi đó nếu

g(a1, a2, ..., ak) > f

thì từ bất đẳng thức (1.1) suy ra f < g(a1, a2, ..., ak) ≤ min{f(x): x  D(a1, a2, ..., ak)}. Vì thế
tập D(a1, a2, ..., ak) chắc chắn không chứa phương án tối ưu và có thể loại bỏ khỏi quá trình
duyệt. Lược đồ của thuật toán nhánh cận được trình bày chi tiết ở Thuật toán 1.1 và 1.2.

1.2.2 Thuật toán di truyền

Lược đồ tổng quát của thuật toán di truyền [13, 32] đòi hỏi xác định phương pháp mã hóa lời
giải và xây dựng các toán tử: ước lượng, lựa chọn, lai ghép và đột biến. Đầu tiên, ta khởi tạo
quần thể của các cá thể ban đầu. Sau đó, trong mỗi bước lặp, các thể cha mẹ được lựa chọn từ
quần thể để thực hiện lai ghép tạo ra các cá thể con cháu. Các cá thể con cháu sẽ được đột

8
Thuật toán 1.3. Lược đồ tổng quát của thuật toán di truyền
1. BEGIN
2. Khởi tạo quần thể ban đầu SP;
3. while (Điều kiện kết thúc chưa thỏa) do
4. (TP, TM) = Lựa chọn từ SP; //TP và TM là cá thể cha và mẹ
5. TC = Lai ghép TP và TM; //TC là cá thể con cháu được lai ghép từ TP và TM
6. TCˊ = Đột biến cá thể con cháu TC; //TCˊ là cá thể sau khi đột biến
7. SP = SP ∪ TCˊ; //Bổ sung cá thể TCˊ vào trong quần thể
8. Giảm kích thước quần thể về kích thước ban đầu;
9. end while
10. Đưa ra lời giải tốt nhất;
11. END

Thuật toán 1.4. Lược đồ tổng quát của thuật toán đàn kiến
1. BEGIN
2. Khởi tạo thông tin vết mùi τ;
3. while (Điều kiện kết thúc chưa thỏa) do
4. Khởi tạo cá thể kiến Tk; //Tk là cá thể kiến ở vòng lặp thứ k
5. Cho Tk dò đường dựa trên thông tin vết mùi τ;
6. Cập nhập thông tin vết mùi τ do cá thể Tk để lại;
7. end while
8. Đưa ra lời giải tốt nhất;
9. END

Thuật toán 1.5. Lược đồ tổng quát của thuật toán tabu
1. BEGIN
2. Khởi tạo solution ban đầu so;
3. s = so; s* = so;
4. tabulist = Ø; //tabulist là danh sách tabu
5. while (Điều kiện kết thúc chưa thỏa) do
6. M = Ø; //M là tập các bước chuyển ứng viên
7. s  N s (là lân cận của s):
8. m = move (s, s);
9. if (m  tabulist) M = M  {m};
10. if (m  tabulist nhưng cải thiện được lời giải tốt nhất) M = M  {m};
11. Chọn bước chuyển m tốt nhất trong tập M.
12. st  m ( s ); s  st;
13. if ( ( f ( st)  f ( s* )) s*  st;
14. Cập nhập tabulist;
15. Tăng cường hóa lời giải;
16. Đa dạng hóa lời giải;
17. end while
18. Đưa ra lời giải tốt nhất;
19. END

9
Thuật toán 1.6. Lược đồ tổng quát của thuật toán lân cận biến đổi
1. BEGIN
2. T *  ;
3. //thực hiện lần lượt k thuật toán lận cận
4. for i =1 to k do
T   arg minT N (T ) L(T )
5. i

6. if ((L( T ' ) < L( T * )) then


7. T *  T '; T ←T ';
8. i ← 1;
9. else
10. i++;
11. end if
12. END

biến và được bổ sung vào quần thể ban đầu. Cuối cùng, một vài cá thể bị loại bỏ từ quần thể
theo một tiêu chí lựa chọn để đảm bảo kích thước quần thể là không thay đổi. Thuật toán sẽ
lặp lại các bước trên cho đến khi điều kiện kết thúc được thỏa mãn và đưa ra lời giải tốt nhất
trong số các lời giải tìm được. Toán tử lai ghép và toán tử đột biến đóng một vai trò quan
trọng trong thuật toán di truyền. Mục đích của toán tử lai ghép nhằm cải thiện chất lượng của
quần thể sau mỗi thế hệ. Trong khi đó, toán tử đột biến giúp cho quần thể đa dạng hơn. Mã
giả của thuật toán di truyền được trình bày trong Thuật toán 1.3.

1.2.3 Thuật toán đàn kiến

Thuật toán đàn kiến [10] mô phỏng hành vi của các đàn kiến trong thực tế. Khi di chuyển các
con kiến để lại vết mùi trên đường đi để các con kiến theo sau lần theo vết mùi đó. Dựa vào
nồng độ mùi, các con kiến theo sau lựa chọn đường đi có nồng độ mùi cao hơn. Việc thực
hiện thuật toán đàn kiến bao gồm các bước: Đầu tiên, ta khởi tạo vết mùi xuất phát. Tiếp đến,
tại mỗi bước lặp, ta tạo ra một cá thể kiến và cho kiến dò đường dựa trên vết mùi do các cá
thể kiến trước đó để lại trên đường đi. Khi cá thể kiến này di chuyển, thì bản thân nó cũng để
lại vết mùi trên đường đi nó đi qua. Vết mùi này sẽ được cập nhập và bay hơi để các cá thể
kiến theo sau lần theo vết mùi đó. Thuật toán sẽ thực hiện các bước lặp cho đến khi điều kiện
kết thúc được thỏa mãn. Mã giả của thuật toán được trình bày trong Thuật toán 1.4.

1.2.4 Thuật toán Tabu

Từ một lời giải ban đầu, thuật toán tabu [20, 46] lặp đi lặp lại việc tìm kiếm nhằm cải thiện
dần lời giải tốt nhất của bài toán. Tại mỗi bước lặp, thuật toán duyệt trong lân cận của lời giải

10
hiện tại để chọn ra lời giải tốt nhất và lời giải này thay thế cho lời giải hiện tại ở bước lặp kế
tiếp. Mỗi lời giải trong lân cận của lời giải hiện tại được gọi là một lân cận của lời giải hiện
tại. Việc thực hiện tác động lên lời giải hiện tại để biến nó thành một lân cận được gọi là một
bước chuyển (move). Điểm khác biệt căn bản của tìm kiếm tabu so với các thuật toán tìm
kiếm địa phương khác là: Tại mỗi bước lặp, để tránh việc duyệt trở lại những lời giải đã từng
được khảo sát, thuật toán tabu sử dụng một danh sách (được gọi là danh sách tabu) để lưu trữ
một số bước chuyển đã từng được sử dụng. Danh sách tabu sẽ chứa một số bước chuyển vừa
được thực hiện trong một số bước lặp ngay trước đó và các bước chuyển nằm trong danh
sách tabu được gọi là các bước chuyển tabu. Các bước chuyển tabu sẽ bị cấm sử dụng lại khi
nó còn nằm trong danh sách tabu. Mỗi bước chuyển tabu sẽ được cập nhập vào trong danh
sách tabu khi thực hiện bước lặp. Sau đó, các bước chuyển này có thể được loại khỏi danh
sách tabu và tái dụng lại. Mã giả của thuật toán được trình bày trong Thuật toán 1.5.

1.2.5 Thuật toán lân cận biến đổi

Ý tưởng của thuật toán lân cận biến đổi (Variable neighborhood search-VNS) [21, 22, 23,
33] là thực hiện lần lượt từng thuật toán lân cận, hết thuật toán lân cận này đến thuật toán lân
cận khác. Trong quá trình thực hiện thuật toán VNS, ta luôn ghi nhận lời giải tốt nhất (kỉ
lục). Khi thực hiện một thuật toán lân cận, nếu tìm được kỉ lục mới thì ta quay trở lại thực
hiện thuật toán VNS từ đầu. Ngược lại, ta chuyển sang thuật toán lân cận tiếp theo. Quá trình
được tiếp tục cho đến khi thực hiện hết tất cả các thuật toán lân cận mà lời giải tốt nhất không
được cải thiện. Mã giả của thuật toán được trình bày trong Thuật toán 1.6.

1.3 Các nghiên cứu liên quan giải bài toán MLP

Bài toán MLP giải được bằng thuật toán thời gian tính đa thức trong một số trường hợp đặc
biệt khi đồ thị của bài toán là:
 Cây không trọng số – độ phức tạp thời gian của thuật toán là O(max(n + m)) [6] (n
và m lần lượt là số lượng đỉnh và cạnh của đồ thị).
 Đường thẳng – độ phức tạp thời gian của thuật toán là O(n2) [6, 49].
 Cây với đường kính là 3 (đường kính của cây là số đỉnh trên đường đi đơn đi qua
nhiều đỉnh nhất trên cây) – độ phức tạp thời gian của thuật toán là O(n2) [6].
 Cây với số lượng lá là hằng số k – độ phức tạp thời gian của thuật toán là O(nk)
(với k là một hằng số cho trước) [49].

11
Trong trường hợp tổng quát, ngoại trừ P = NP, một lược đồ xấp xỉ với thời gian đa
thức là không tồn tại [41]. Hiện nay, một số công trình nghiên cứu đã được đề xuất để giải bài
toán MLP. Có thể phân loại các thuật toán hiện biết ra thành ba nhóm chính: Các thuật toán
đúng, các thuật toán gần đúng cận tỷ lệ, và các thuật toán meta-heuristic. Dưới đây chúng tôi
sẽ điểm qua các kết quả đó.

1.3.1 Thuật toán đúng

Các thuật toán đúng cho phép tìm lời giải tối ưu nhưng có đánh giá độ phức tạp thời gian
bùng nổ tổ hợp trong tình huống tồi nhất. Mặc dù trong thực tế chúng thường chạy nhanh hơn
đánh giá lý thuyết này, tuy vậy, chúng cũng chỉ có thể áp dụng để giải các bài toán MLP với
kích thước nhỏ.

Theo hướng thuật toán quy hoạch động, Wu. [49] đề xuất một thuật toán với độ phức
tạp thời gian hàm mũ để giải bài toán MLP. Sau đó, Wu et al. [50] phát triển thuật toán của
mình bằng việc kết hợp thuật toán quy hoạch động với phương pháp nhánh cận. Để đánh giá
hiệu quả của thuật toán, Wu et al. tiến hành thực nghiệm thuật toán trên một số file dữ liệu
ngẫu nhiên và một số file dữ liệu được trích rút từ bộ dữ liệu TSPLIB [51]. Kết quả thực
nghiệm chỉ ra rằng thuật toán của Wu et al. có thể giải bài toán MLP với kích thước lên đến
26 đỉnh. Tuy nhiên, hiệu quả của thuật toán trong các trường hợp có kích thước lớn hơn chưa
được xem xét.

1.3.2 Thuật toán gần đúng cận tỷ lệ

Các thuật toán gần đúng cận tỷ lệ α (α – approximation algorithm) có ưu điểm là nó đảm bảo
đưa ra lời giải với chi phí không lớn hơn α lần chi phí của lời giải tối ưu.

Hiện nay, có một vài thuật toán gần đúng cận tỷ lệ được đề xuất. Blum et al. [6] đưa
ra một thuật toán với cận tỷ lệ là 144 trong trường hợp metric. Goemans et al. [18] đưa ra cận
tỷ lệ 21.55. Sau đó, Arora et al. [3] đề xuất thuật toán gần đúng với cận tỷ lệ là 17.24. Thuật
toán gần đúng của Archer et al. [1] có cận tỷ lệ 7.18 trong trường hợp metric và 3.01 trong bộ
dữ liệu TSPLIB [51]. Gần đây, K.Chaudhuri et al. [9] đưa ra thuật toán gần đúng với cận tỷ lệ
là 3.59. Cận tỷ lệ này được biết là cận tỷ lệ nhỏ nhất hiện nay cho bài toán MLP.

Hiện tại, trong hướng tiếp cận gần đúng cận tỷ lệ, phần lớn các công trình chỉ ra rằng
chi phí tối ưu của bài toán k-MST được xem như cận dưới cho độ trễ đỉnh thứ k trong hành
trình tối ưu MLP [1, 6, 18]. Blum et al. [6] chỉ ra rằng nếu có thuật toán gần đúng với cận tỷ

12
lệ β cho bài toán k-MST (k = 2, 3, ..., n), thì ta có thuật toán gần đúng với cận tỷ lệ 8×β cho
bài toán MLP. Sau đó, Goeman et al. [18] giảm cận tỷ lệ bài toán MLP xuống còn 3.59×β.
Nếu sử dụng thuật toán gần đúng có cận tỷ lệ nhỏ nhất là 2 cho bài toán k-MST [15], thì thuật
toán gần đúng cho bài toán MLP của Blum et al. và Goeman et al. có cận tỷ lệ lần lượt là 16
và 7.18. Gần đây, Archer et al. [1] trình bày thuật toán tạo ra các k-MST (k = 2, 3, ..., n) bằng
việc sử dụng kỹ thuật nới lỏng lagrange thay vì sử dụng thuật toán giải bài toán k-MST như
trong [15]. Tuy không giảm được cận tỷ lệ 7.18 nhưng thời gian chạy thuật toán được giảm
đáng kể. Khác với các cách tiếp cận trên, K.Chaudhuri et al. [9] chỉ ra rằng lời giải tối ưu của
bài toán đường đi ngắn nhất đi qua k đỉnh (ta gọi là bài toán k-troll) là một cận dưới tốt hơn
cho độ trễ đỉnh thứ k trong hành trình tối ưu MLP. Tuy nhiên, bài toán k-troll cũng khó tương
tự như bài toán k-MST, bởi vậy họ đưa ra thuật toán cho bài toán tìm cây khung đi qua k đỉnh
có chi phí bị chặn bởi chi phí tối ưu của bài toán k-troll. Để thu được lời giải cho bài toán
MLP, họ chuyển các cây khung này thành các hành trình đi qua k đỉnh và kết nối các hành
trình này. Như vậy, ta không phải mất cận tỷ lệ 2 cho bài toán k-MST và thuật toán của
K.Chaudhuri et al. có cận tỷ lệ là 3.59. Hầu hết các kết quả có được từ hướng tiếp cận gần
đúng cận tỷ lệ đều đưa ra cận tỷ lệ ở dạng lý thuyết (cận tỷ lệ trường hợp tồi nhất), có một
ngoại lệ trong [1], khi Archer et al. tiến hành thực nghiệm trên bộ dữ liệu TSPLIB [51]. Kết
quả thực nghiệm cho thấy, cận tỷ lệ trung bình đạt được từ bộ dữ liệu này là 3.01 tốt hơn rất
nhiều so với cận tỷ lệ lý thuyết. Tuy vậy, cận tỷ lệ này vẫn còn là quá lớn, chưa đáp ứng yêu
cầu giải các bài toán ứng dụng thực tế.

1.3.3 Thuật toán meta-heuristic

Các thuật toán meta-heuristic là những thuật toán có độ phức tạp thời gian thường không quá
lớn, nhưng chất lượng lời giải tìm được bởi các thuật toán này chỉ có thể đánh giá thông qua
thực nghiệm. Thuật toán meta-heuristic thường áp dụng hiệu quả cho các bài toán tối ưu hóa
tổ hợp như bài toán MLP.

Hiện nay, có hai công trình nghiên cứu theo hướng tiếp cận meta-heuristic giải bài
toán MLP đã được công bố. Trong công trình [40], A. Salehipour et al. đề xuất thuật toán
meta-heuristic dựa trên GRASP (Greedy randomized adaptive search procedure) và VNS
(Variable neighborhood search). Sau đó, M. Silva et al. [43] cũng đề xuất một thuật toán
meta-heuristic khác dựa trên lược đồ của GRASP, ILS (Iterated local search) và RVND
(Random variable neighborhood descend). Để đánh giá hiệu quả của các thuật toán, A.
Salehipour et al. và M. Silva et al. thực nghiệm thuật toán của họ trên các bộ dữ liệu. Kết quả

13
thực nghiệm cho thấy, chất lượng lời giải thu được từ các thuật toán meta-heuristic tốt hơn rất
nhiều so với chất lượng lời giải của các thuật toán gần đúng cận tỷ lệ hiện biết. Điều đó
chứng tỏ, meta-heuristic là hướng tiếp cận tiềm năng cho bài toán MLP.

1.4 Mục đích, phạm vi nghiên cứu

Do bài toán MLP là bài toán NP-Khó, do đó không có một hướng tiếp cận hiệu quả duy nhất
cho bài toán trong mọi trường hợp. Việc đưa ra các hướng tiếp cận hiệu quả cho nhiều trường
hợp khác nhau của bài toán này có ý nghĩa về mặt khoa học. Đối với một bài toán NP-khó,
hiện tại có ba hướng tiếp cận chính để phát triển thuật toán giải: 1) hướng tiếp cận đúng; 2)
hướng tiếp cận gần đúng cận tỷ lệ; 3) hướng tiếp cận meta-heuristic. Trước hết, các thuật toán
đúng tìm lời giải tối ưu thường có độ phức tạp tính toán bùng nổ tổ hợp trong tình huống tồi
nhất, mặc dù trong thực tế chúng thường chạy nhanh hơn đánh giá lý thuyết này. Tuy vậy,
thuật toán đúng cũng chỉ có thể giải bài toán MLP với kích thước nhỏ. Trong cách tiếp cận
thứ hai, các thuật toán gần đúng với cận tỷ lệ  có ưu điểm lớn là về mặt lý thuyết chúng đảm
bảo đưa ra lời giải có chi phí không vượt quá lần chi phí của lời giải tối ưu. Cuối cùng, các
thuật toán meta-heuristic là những thuật toán có độ phức tạp tính toán thường là không quá
lớn và khá hiệu quả đối với lớp bài toán NP-khó như bài toán MLP, nhưng chất lượng lời giải
tìm được bởi các thuật toán này chỉ có thể đánh giá thông qua thực nghiệm.

Trong luận án này, chúng tôi nghiên cứu việc phát triển các thuật toán hiệu quả để
giải bài toán cực tiểu hóa độ trễ, là một bài toán tối ưu hóa tổ hợp có nhiều ứng dụng trong
thực tiễn:
 Phát triển thuật toán đúng cho phép giải bài toán với kích thước lớn hơn. Hiện tại,
hầu hết lời giải tối ưu của các bộ dữ liệu được nhiều tác giả sử dụng trong thực
nghiệm xác định hiệu quả của các thuật toán giải bài toán MLP là chưa biết. Điều
này gây khó khăn cho việc đánh giá một cách chính xác hiệu quả của các thuật
toán. Chúng tôi sử dụng các bộ dữ liệu có lời giải tối ưu thu được nhờ thuật toán
đúng để phân tích thêm về hiệu quả của các thuật toán đề xuất và để khảo sát lựa
chọn các tham số trong các thuật toán meta-heuristic.
 Khảo sát thực nghiệm về hiệu quả của các thuật toán gần đúng cận tỷ lệ hiện biết,
là cơ sở để đề xuất thuật toán gần đúng mới với cận tỷ lệ tốt hơn. Theo hướng tiếp
cận thuật toán gần đúng cận tỷ lệ, hiện nay một số thuật toán gần đúng cận tỷ lệ
giải bài toán MLP đã được công bố. Tuy nhiên, hiệu quả của các thuật toán này chỉ
được đánh giá trên khía cạnh lý thuyết. Chúng tôi đã tiến hành nghiên cứu thực

14
nghiệm để đánh giá hiệu quả thực tế của các thuật toán gần đúng. Chúng tôi tập
trung vào phân tích ba khía cạnh chính là cận tỷ lệ, thời gian chạy thực tế và chất
lượng của cận dưới. Nhằm giảm cận tỷ lệ cho thuật toán gần đúng giải bài toán
MLP, chúng tôi đề xuất thuật toán gần đúng dựa trên phương pháp Subgradient.
 Phát triển ba thuật toán theo hướng tiếp cận meta-heuristic. Chúng tôi đề xuất thuật
toán dựa trên lược đồ tổng quát của thuật toán di truyền để giải bài toán MLP và
một số kỹ thuật mới được tích hợp vào từng bước của thuật toán di truyền. Nhằm
nâng cao chất lượng lời giải và thời gian chạy thuật toán, chúng tôi đề xuất hai
thuật toán meta-heuristic lai là: Thuật toán (ACO-GA) lai ghép giữa thuật toán di
truyền (GA) và thuật toán đàn kiến (ACO); và thuật toán TS-VNS lai ghép giữa
thuật toán Tabu (TS) và thuật toán lân cận biến đổi (VNS).

Để đánh giá hiệu quả của các thuật toán đề xuất, chúng tôi tiến hành thực nghiệm trên
các bộ dữ liệu đã được các nhóm nghiên cứu trên thế giới sử dụng. Các kết quả tính toán thực
nghiệm theo các thuật toán đề xuất được so sánh với kết quả tính toán thực nghiệm của các
công trình nghiên cứu liên quan [1, 3, 6, 9, 18, 40, 43, 50].

1.5 Dữ liệu thực nghiệm

Một trong những cách đánh giá chất lượng của các thuật toán giải bài toán MLP nói riêng và
các bài toán NP-khó nói chung là tiến hành thực nghiệm trên các bộ dữ liệu được cộng đồng
các nhà khoa học cùng nghiên cứu về bài toán đưa ra. Tập các bộ dữ liệu như vậy thường
được gọi là bộ dữ liệu chuẩn (Benchmark test). Hiện nay, đối với bài toán MLP bộ dữ liệu
chuẩn như vậy cũng đã hình thành, tuy rằng chưa đủ nhiều và chưa thật đa dạng. Mục này
dành cho việc mô tả bộ dữ liệu được dùng để tiến hành thực nghiệm khảo sát hiệu quả của
các thuật toán, trong đó ngoài các bộ dữ liệu được đề xuất bởi các nhà khoa học trên thế giới,
có nhiều bộ dữ liệu có kích thước nhỏ hơn 40 đỉnh do chúng tôi xây dựng nhằm làm phong
phú hơn bộ dữ liệu chuẩn. Mục đích của việc tạo thêm các bộ dữ liệu kích thước nhỏ nhằm có
thể tìm được lời giải tối ưu từ thuật toán đúng (chú ý là hiện tại thuật toán đúng chỉ áp dụng
được cho bài toán MLP với kích thước nhỏ hơn 40 đỉnh). Nhờ lời giải tối ưu có được, chúng
ta có thể đánh giá một cách chính xác hiệu quả của các thuật toán gần đúng trên các bộ dữ
liệu này. Ở khía cạnh khác, các bộ dữ liệu này cũng hỗ trợ đắc lực cho việc tiến hành thực
nghiệm xác định các thông số của các giải thuật metaheuristics.

Một bộ dữ liệu chuẩn thường bao gồm các file dữ liệu, mỗi file chứa thông tin về một
bài toán cụ thể cần giải. Nếu thông tin trong file mô tả bài toán kích thước lớn (nhỏ) thì để
đơn giản, ta sẽ gọi là file dữ liệu lớn (nhỏ). Ở đây, dựa vào giá trị của n (số đỉnh trong một

15
Bảng 1. 1 Mô tả các bộ dữ liệu
Tên bộ dữ liệu Kích Tên file dữ liệu Số đỉnh trong Đặc tính Lời giải tối ưu
thước file file dữ liệu
eil51
eil76
Nhóm 1
st70
rat195
kroA100
Bộ dữ liệu euclidean
kroB100
Nhóm 2 (30  40)
thực 2 kroC100
berlin52
pr76
tsp225
Nhóm 3
tss225
Lin105
test 1
test 2
test 3 Có lời giải tối ưu
File dữ test 4 từ thuật toán đúng
Bộ dữ liệu
liệu nhỏ test 5
(30  40) euclidean
đề xuất.
ngẫu nhiên 1 test 6
test 7
test 8
test 9
test 10
test 1
test 2
test 3 phi euclidean
test 4
Bộ dữ liệu thỏa mãn tính
test 5
(30  40)
ngẫu nhiên 2 test 6 chất bất đẳng
test 7
thức tam giác
test 8
test 9
test 10
TPR-10-x
( x  1  20) 10
TPR-20-x Có lời giải tối ưu
20
( x  1  20) từ [43].
TPR-50-x
( x  1  20) 50
Bộ dữ liệu
ngẫu nhiên 3 File dữ TPR-100-x euclidean
100
liệu lớn ( x  1  20)
TPR-200-x 200 Chưa có
( x  1  20)
TPR-500-x 500
( x  1  20)
Bộ dữ liệu 50  500 Chưa có
TSPLIB
thực 1

16
file dữ liệu), chúng tôi chia các file dữ liệu này thành hai loại: File dữ liệu nhỏ với n ≤ 40 và
file dữ liệu lớn với n > 40.

Hiện nay trong các công trình nghiên cứu về bài toán MLP của các tác giả: Wu et al.
[50], Archer et al. [1], A. Salehipour et al. [40], và M. Silva et al. [43] đã đưa ra các bộ dữ
liệu được sử dụng để đánh giá hiệu quả của các thuật toán. Ngoài ra, để có thêm nhiều file dữ
liệu, chúng tôi tạo ra các file dữ liệu ngẫu nhiên euclidean, phi euclidean và các file dữ liệu
được trích chọn từ các file dữ liệu có kích thước lớn trong bộ dữ liệu thực TSPLIB. Trong
luận án, các dữ liệu thực nghiệm này sẽ được gọi là bộ dữ liệu chuẩn.

Chúng tôi phân bộ dữ liệu thực nghiệm chuẩn này ra thành ba bộ dữ liệu ngẫu nhiên
và hai bộ dữ liệu thực. Tất cả các file dữ liệu trong các bộ dữ liệu đều thỏa mãn điều kiện bất
đẳng thức tam giác. Ba bộ dữ liệu ngẫu nhiên do chúng tôi đề xuất gồm một bộ dữ liệu chứa
các file dữ liệu euclidean (gọi là bộ dữ liệu ngẫu nhiên 1), một bộ dữ liệu chứa các file dữ
liệu phi euclidean (gọi là bộ dữ liệu ngẫu nhiên 2), và một bộ dữ liệu ngẫu nhiên do A.
Salehipour et al. [40] cung cấp (gọi là bộ dữ liệu ngẫu nhiên 3). Dữ liệu thực tế bao gồm các
file dữ liệu được lấy từ bộ dữ liệu TSPLIB (gọi là bộ dữ liệu thực 1) [51] và các file dữ liệu
được trích rút từ bộ dữ liệu TSPLIB (gọi là bộ dữ liệu thực 2). Mỗi file dữ liệu chứa thông tin
về một bài toán trên đồ thị gồm n đỉnh.

Trong bộ dữ liệu ngẫu nhiên 1, các file dữ liệu được tạo ngẫu nhiên với chi phí cạnh
là các số nguyên từ 1 đến 100, và các chi phí này thỏa mãn tính chất bất đẳng thức tam giác.
Trong bộ dữ liệu ngẫu nhiên 2, tọa độ các đỉnh trong file dữ liệu được tạo ngẫu nhiên trong
hình vuông 200×200 trên mặt phẳng euclidean hai chiều. Khi đó, chi phí mỗi cạnh được tính
bởi khoảng cách euclidean giữa hai đỉnh. Đối với mỗi bộ dữ liệu, chúng tôi tạo ra 30 file dữ
liệu khác nhau có kích thước từ 30 đến 40 đỉnh. Ngoài ra, để có thêm nhiều file dữ liệu với
kích thước nhỏ, chúng tôi trích chọn ngẫu nhiên từ 30 đến 40 đỉnh trong các file dữ liệu có
kích thước lớn hơn trong TSPLIB (các file dữ liệu được trích chọn này sẽ được phân vào bộ
dữ liệu thực 2). Việc trích chọn được tiến hành như sau: Như ta biết, bộ dữ liệu TSPLIB là
một tập các file dữ liệu, mỗi file dữ liệu lưu trữ toạ độ của các điểm trên mặt phẳng hai chiều.
Gọi Xmax, Ymax là hoành độ và tung độ lớn nhất, Xmin, Ymin là hoành độ và tung độ nhỏ nhất
xmax  xmin y  ymin
trong một file dữ liệu. Gọi x  và y  max . Chúng tôi chia bộ dữ liệu
n n
trên thành ba nhóm khác nhau dựa trên giá trị Δx, Δy:
 Nhóm 1 với Δx, Δy nhỏ (Δx, Δy ≤ 3, các đỉnh được phân bố gần nhau).

17
 Nhóm 2 với Δx, Δy lớn (Δx, Δy ≥ 9, các đỉnh được phân bố thưa).
 Nhóm 3 các đỉnh được phân bố đặc biệt (chẳng hạn, nhiều đỉnh cách đều nhau hoặc
nằm trên một đường thẳng).
Chúng tôi tạo ba nhóm file dữ liệu tương ứng với các nhóm trong TSPLIB nói trên. Trong
mỗi nhóm của TSPLIB, ta chọn ra bốn file dữ liệu làm đại diện và thực hiện trích chọn ngẫu
nhiên từ 30 đến 40 đỉnh từ các file dữ liệu trong nhóm đó. Cụ thể, nhóm 1 gồm các file dữ
liệu được trích chọn từ eil51, st70, eil76 và rat195. Nhóm 2 gồm các file dữ liệu được trích
chọn từ kroA100, kroB100, KroC100 và Berlin52. Cuối cùng, các file dữ liệu được trích
chọn từ tsp225, tss225, pr76 và lin105 thuộc về nhóm 3. Chú ý các số 51, 70, 76, … trong tên
file cho biết số đỉnh trong file dữ liệu. Chi tiết về các bộ dữ liệu được mô tả trong Bảng 1.1.

Đối với những file dữ liệu thực nghiệm kích thước lớn, chúng ta không biết lời giải tối
ưu. Vì thế để đánh giá hiệu quả của một thuật toán, người ta thường so sánh chất lượng của
lời giải tìm được với chất lượng của lời giải tốt nhất hiện biết. Đối với các bộ dữ liệu nhỏ,
khi biết được lời giải tối ưu từ các thuật toán đúng, chúng ta sử dụng tiêu chí gap1, ngược lại,
đối với bộ dữ liệu lớn, khi lời giải tối ưu chưa được công bố, thì chúng ta sử dụng tiêu chí
gap2:
Best Sol  OPT
gap1[%]   100%
OPT
Best Sol  UB
gap2 [%] | | 100% ,
UB
trong đó, OPT là lời giải tối ưu và UB là lời giải của thuật toán lân cận gần nhất [40]. Đối với
bộ dữ liệu nhỏ, thuật toán nào cho gap1 càng nhỏ thì lời giải của thuật toán đó càng gần giá trị
tối ưu và càng tốt. Đối với bộ dữ liệu lớn, thì thuật toán nào cho gap2 càng lớn thì càng tốt,
điều đó chứng tỏ chất lượng lời giải của thuật toán đó càng được cải thiện được so với UB.

1.6 Kết quả của luận án

Luận án đạt được những kết quả chính sau đây:


 Đề xuất thuật toán nhánh cận dựa trên một số tiêu chuẩn cắt nhánh hiệu quả. Thuật
toán đề xuất cho phép giải các bài toán MLP trên đồ thị với 40 đỉnh (thuật toán
đúng do Wu et al. [50] đề xuất chỉ làm việc được với những đồ thị dưới 30 đỉnh).
Thời gian chạy của thuật toán đề xuất là nhanh hơn thuật toán của Wu et al. trên
một số file dữ liệu (xem công trình [4] trong danh mục các công trình công bố
được sử dụng trong luận án).

18
 Khảo sát thực nghiệm để đánh giá và so sánh hiệu quả của các thuật toán gần đúng
cận tỷ lệ trên ba khía cạnh cận tỷ lệ, thời gian chạy và chất lượng của cận dưới
(xem công trình [3] trong danh mục các công trình công bố được sử dụng trong
luận án).

 Đề xuất thuật toán gần đúng dựa trên phương pháp Subgradient với cận tỷ lệ được
đánh giá bởi thực nghiệm là tốt hơn so với các thuật toán gần đúng cận tỷ lệ hiện
biết trên nhiều bộ dữ liệu (xem công trình [6] trong danh mục các công trình công
bố được sử dụng trong luận án)..

 Đề xuất thuật toán meta–heuristic dựa trên lược đồ của thuật toán di truyền để giải
bài toán MLP. Kết quả thực nghiệm cho thấy thuật toán đề xuất đưa ra lời giải với
cận tỷ lệ tốt hơn cận tỷ lệ của các thuật toán gần đúng cận tỷ lệ hiện biết đối với
hầu hết các bộ dữ liệu (xem công trình [2] trong danh mục các công trình công bố
được sử dụng trong luận án).

 Đề xuất thuật toán meta-heuristic (ACO-GA) lai ghép giữa thuật toán di truyền
(GA) và thuật toán đàn kiến (ACO). Kết quả thực nghiệm cho thấy thuật toán đề
xuất đưa ra lời giải với cận tỷ lệ tốt hơn cận tỷ lệ của các thuật toán meta-heuristic
hiện biết trên nhiều bộ dữ liệu (xem công trình [5] trong danh mục các công trình
công bố được sử dụng trong luận án).

 Đề xuất thuật toán meta-heuristic đơn lời giải TS-VNS lai ghép giữa thuật toán
Tabu (TS) và thuật toán lân cận biến đổi (VNS), trong đó, các thuật toán khảo sát
lân cận được tăng tốc nhờ việc chỉ ra các thuật toán có độ phức tạp thời gian hằng
số để tính độ trễ của các lời giải lân cận. Kết quả thực nghiệm cho thấy, đối với các
bài toán kích thước nhỏ, thuật toán luôn cho ra lời giải tối ưu, trong khi, đối với các
bài toán kích thước lớn, thuật toán cho lời giải tốt hơn lời giải tìm được bởi các
thuật toán meta-heuristic hiện biết trên nhiều bộ dữ liệu (xem công trình [7] trong
danh mục các công trình công bố được sử dụng trong luận án).

Các kết quả chính của luận án đã được công bố trong 7 bài báo khoa học đã được
đăng tại các tạp chí khoa học chuyên ngành quốc gia và quốc tế và các hội thảo khoa học
chuyên ngành quốc tế.

19
1.7 Cấu trúc của luận án

Luận án được trình bày trong bốn chương và phần kết luận:
 Chương 1 giới thiệu bài toán MLP, nêu các ứng dụng của bài toán MLP trong thực
tế, các hướng tiếp cận giải bài toán và các nghiên cứu liên quan. Phần cuối chương
1 dành cho việc trình bày về phạm vi nghiên cứu, dữ liệu thực nghiệm và những
đóng góp của luận án.

 Chương 2 đề xuất thuật toán nhánh cận và một số tiêu chuẩn cắt nhánh hiệu quả
theo hướng tiếp cận đúng giải bài toán MLP. Các kết quả thực nghiệm của thuật
toán, cũng như các so sánh và đánh giá với các thuật toán khác cũng được trình
bày.

 Chương 3 trình bày các kết quả nghiên cứu theo hướng tiếp cận gần đúng cận tỷ
lệ. Đầu tiên, trình bày khảo sát thực nghiệm về hiệu quả của các thuật toán gần
đúng cận tỷ lệ giải bài toán MLP. Các kết quả thực nghiệm trên bộ dữ liệu chuẩn là
cơ sở để đưa ra các đánh giá và so sánh về hiệu quả giữa các thuật toán trên ba khía
cạnh: cận tỷ lệ thực nghiệm, thời gian chạy và chất lượng cận dưới. Sau đó, trình
bày thuật toán dựa trên phương pháp Subgradient. Cơ sở lý thuyết được sử dụng
trong thuật toán, cũng như các kết quả thực nghiệm, đánh giá và so sánh với các
thuật toán khác cũng được đề cập.

 Chương 4 trình bày ba thuật toán giải bài toán MLP theo hướng tiếp cận meta-
heuristic. Đầu tiên, chương này trình bày thuật toán dựa trên lược đồ thuật toán di
truyền giải bài toán MLP. Sau đó, trình bày về thuật toán lai ghép giữa thuật toán
di truyền và thuật toán đàn kiến. Cuối cùng, trình bày về thuật toán lai ghép giữa
thuật toán Tabu và thuật toán lân cận biến đổi để giải bài toán MLP. Chương này
kết thúc bởi phần trình bày các kết quả thực nghiệm, đánh giá và so sánh với các
thuật toán meta-heuristic hiện biết.

 Cuối cùng, phần kết luận đánh giá những kết quả thu được trong luận án.

20
CHƢƠNG 2
THUẬT TOÁN NHÁNH CẬN

Hiện nay, hai thuật toán theo hướng tiếp cận đúng đã được đề xuất. Trong [49], Wu đã trình
bày thuật toán quy hoạch động giải bài toán MLP trong trường hợp tổng quát với độ phức tạp
thời gian bùng nổ tổ hợp. Sau đó, Wu et al. [50] phát triển thuật toán kết hợp phương pháp
nhánh cận và quy hoạch động. Các kết quả thực nghiệm chỉ ra rằng thuật toán sau khi phát
triển hiệu quả hơn thuật toán trước. Tuy nhiên, thuật toán này cũng chỉ được thực nghiệm
trên các file dữ liệu nhỏ (ít hơn 30 đỉnh). Bởi vậy, hiệu quả của thuật toán trên các file dữ liệu
có kích thước lớn hơn chưa được xem xét. Trong chương này, chúng tôi trình bày thuật toán
dựa trên phương pháp nhánh cận và hai tiêu chuẩn cắt nhánh. Hiệu quả của thuật toán được
đánh giá trên các bộ dữ liệu ngẫu nhiên và bộ dữ liệu thực. Kết quả thực nghiệm cũng được
so sánh với kết quả của thuật toán Wu et al. trên một số file dữ liệu.

Hiện tại, lời giải tối ưu bài toán MLP trên nhiều bộ dữ liệu chưa được công bố. Do đó,
việc đánh giá một cách chính xác hiệu quả của các thuật toán giải bài toán MLP trên các bộ
dữ liệu như vậy gặp nhiều khó khăn. Chúng tôi sử dụng thuật toán đúng để thu được lời giải
tối ưu bài toán MLP cho một số file dữ liệu kích thước nhỏ. Nhờ có lời giải tối ưu, chúng tôi
có thể đánh giá một cách chính xác hiệu quả của các thuật toán gần đúng trên các bộ dữ liệu
này.

21
2.1 Thuật toán của Wu et al.

Hiện nay, hai thuật toán theo hướng tiếp cận đúng đã được đề xuất. Trong [49], Wu đã trình
bày thuật toán quy hoạch động giải bài toán MLP trong trường hợp tổng quát với độ phức tạp
thời gian bùng nổ tổ hợp. Sau đó, Wu et al. [50] đã phát triển thuật toán đúng bằng việc kết
hợp kỹ thuật nhánh cận và phương pháp quy hoạch động. Để xây dựng thuật toán, Wu et al.
đưa ra một số khái niệm sau:
 Hành trình bất kỳ P = v1, v2, …, vk với k < n (n là số lượng đỉnh trong đồ thị) được
gọi là hành trình bộ phận, ngược lại, nếu k = n thì hành trình P được gọi là hành
trình đầy đủ. Tập các đỉnh trong P được xác định bởi V(P) = {v1, v2, …, vk}.
 Gọi W(P) là độ dài của hành trình P và được tính như sau: c(v1, v2) + c(v2, v3) + …
k 1
+ c(vk-1, vk) =  c (v , v ) .
i 1
i i 1

 Giả sử, P1 = v1, v2, …, vk và P0 = vk, vk+1, …, vn lần lượt là các hành trình bộ phận
trên G, trong đó đỉnh cuối trong P1 là đỉnh đầu tiên trong P0. Khi đó, hành trình P2
= v1, v2, …, vk, vk+1, …, vn là một hành trình ghép nối của hai hành trình P1 và P0
(kí hiệu P1 || P0).
 Mỗi hành trình bất kỳ P = v1, v2, …, vk có một cấu hình là (V(P), v), trong đó, V(P)
= {v1, v2, …, vk}, và đỉnh cuối v = vk.
 Hàm chi phí: Cho P là một hành trình trên G, hàm chi phí được định nghĩa là: c(P)
= L(P) + (n - |V(P)|)w(P). Khi P là một hành trình đầy đủ thì c(P) = L(P). Như
vậy, hàm chi phí không chỉ phụ thuộc vào hành trình P mà còn phụ thuộc vào các
đỉnh chưa được thăm.
 Cho hai hành trình P1, P2 có cùng một cấu hình. Cho Y2 = P2 || P0 và Y1 = P1 || P0 là
các hành trình đầy đủ. Nếu c(P1) ≤ c(P2) thì L(Y1) ≤ L(Y2).

Thuật toán luôn lưu trữ giá trị cận trên và cận dưới cho mỗi lời giải bộ phận P (ký
hiệu: UB – cận trên, LB – cận dưới). Ban đầu, UB được tạo bởi thuật toán láng giềng gần
nhất. Trong quá trình thực hiện thuật toán, nếu giá trị cận dưới của P (LB) lớn hơn UB, chúng
ta không cần tiếp tục phát triển phương án bộ phận này bởi nếu tiếp tục phát triển sẽ không
đưa ra được lời giải tối ưu. Nếu chúng ta tìm được một hành trình đầy đủ có chi phí nhỏ hơn
so với UB hiện tại thì chúng ta cập nhập UB bằng chi phí của hành trình đó. Trong khi đó,
cận dưới LB được tính như sau:

22
Thuật toán 2.1 Thuật toán đúng của Wu et al. [50]
Đầu vào: Đồ thị G = (V, E) và P = {v1}.
Đầu ra: Hành trình có độ trễ nhỏ nhất.
1. BEGIN
2. Khởi đầu Q1 và chèn P vào trong Q1;
//Qi là danh sách kết nối để lưu trữ các hành trình bộ phận chứa đúng i đỉnh
3. Tính UB của P;
4. for i ←1to n-1 do
5. for each P in Qi do
6. Tính UBˊcủa P;
7. if UBˊ < UB
UB ←UBˊ;
8. end if
9. for each v  V (G ) not in V(P) do
10. Pˊ = P ||{v};
11. if (  P1  Qi+1 cùng cấu hình với Pˊ)
12. if (c(Pˊ) ≤ c(P1)) thì thay thế Pˊ bằng P1;
13. else
14. Tính LB của Pˊ.
15. if (LB < UB) Chèn Pˊ vào trong Qi+1.
16. end if
17. end if
18. end for
19. end for
20. end for
21. END

Cho P là hành trình bộ phận có đỉnh cuối cùng là đỉnh r và P0 = (v0 = r, v1, v2, …, vn ). Khi
 - 
đó, Y = P || P0 là đương đi đầy đủ và V = V(P0) = V – V(P), n = | V |. Với 1 ≤ i ≤ n , ta có:
dY(s, vi) = w(P) + dY(r, vi) ≥ w(P) + w(r, vi) (theo tính chất bất đẳng thức tam giác). Vậy nên,
ta có:
n n
L(Y) ≥ L(P) +  (w( P)  w(r , v )) = L(P) + n w(P) +  w(r , v ) = c(P) +  w(r , v)
i 1
i
i 1
i
vÎV

Do đó, B1(P) = c(P) +  w(r , v) là hàm tính toán cận dưới của tập tất cả các hành trình chứa P
vÎV

như một hành trình bộ phận. Trong quá trình phát triển lời giải, nếu LB > UB thì chúng ta
cũng thực hiện cắt nhánh.

2.2 Lƣợc đồ thuật toán đề xuất

Giả sử, T = (v1, v2, v3, …, vn) là một hành trình MLP. Trong công thức tính tổng độ trễ của T,
ta nhận thấy rằng chi phí của các cạnh (v1, v2), (v2, v3), …, (vn-1, vn) lần lượt được nhân với

23
trọng số (n – 1), (n – 2), …, 1. Do đó, công thức tính tổng độ trễ của hành trình T có thể viết
lại như sau:
n 1
L(T )   (n  k )c(vk , vk 1 ).
k 1

Ký hiệu F = (v1, v2, …, vk) là dãy đỉnh trước của T và B = (vk+1, vk+2, …, vn) là dãy đỉnh sau
của T. Sau đây, chúng tôi đưa ra ba định lý là cơ sở để xây dựng thuật toán nhánh cận.

Định lý 2.1. Giả sử, T = (v1, v2, …, vk-1, vk, …, vn) là hành trình MLP tối ưu. Khi đó, nếu điều
kiện sau đây:
l(P(vk-1, vk)) = l(P(v1, vk)) – l(P(v1, vk-1))
được thỏa mãn, thì l(P(vk-1, vk)) là độ dài đường đi ngắn nhất từ vk-1 đến vk.
Chứng minh. Giả sử l(P(vk-1, vk)) > m(vk-1, vk), với m(vk-1, vk) là độ dài đường đi ngắn nhất từ
vk-1 đến vk. Ta có:
n
L (T )  
j  2, j  k
(l (P (v1 ,v j ))  l (P (v1 , vk 1 ))  m(vk 1 , vk ) .

Ta định nghĩa l (P(v 1 , vk ))  l (P (v 1 , vk 1 ))  m(vk 1 , vk ) . Rõ ràng tồn tại một hành trình T' sao
cho
n
L (T )  
j  2, j  k
(l (P (v1 ,v j ))  l (P(v1 , vk ))  L(T ) .

Bất đẳng thức cuối cùng là trái với giả thiết về tính tối ưu của hành trình T. Mâu thuẫn thu
được đã chứng minh định lý.

Định lý 2.2. Gọi F = (v1, v2, ..., vj, vj+1, ..., vk) là một hành trình bộ phận thứ k. Nếu tồn tại một

đỉnh vp  V = V \ F (k + 1 ≤ p ≤ n) và một chỉ số j (1 < j < k) sao cho điều kiện sau
(n – j)c(vj, vj+1) > (n – j)c(vj, vp) + (n – j – 1)c(vp, vj+1) (2.1)
được thỏa mãn, thì F không thể mở rộng đến lời giải tối ưu.
Chứng minh. Giả sử T = (v1, v2, ..., vj, vj+1, ..., vk, vk+1, vk+2, ..., vn) là hành trình MLP tối ưu.
Ta có F = (v1, v2, ..., vj, vj+1, ..., vk) và B = (vk+1, vk+2, ..., vn). Chèn vp (p = k + 2)  B vào giữa
(vj, vj+1)  F, ta thu được hành trình T' = (v1, v2, ..., vj, vp, vj+1, ..., vk, vk+1, vk+3, vk+4, ..., vn). Độ
trễ của T và T' được tính như sau:
n 1
L(T )   (n  k )c(vk , vk 1 ),
k 1

24
j 1
L(T )   ( n  k )c (v k ,v k 1 )  ( n  j )c (v j , v p )  ( n  j  1)c (v p , v j 1 )
k 1
p 2 n 1
  (n  k  1)c(vk ,vk 1 )  (n  k  2)c(v p 1, v p 1 ) 
k  j 1
 (n  k )c(v , v
k  p 1
k k 1 ).

Đặt ΔT = L(T) – L(T'), ta có:


ΔT = (n – j)c(vj, vj+1) – (n – j)c(vj, vk+2) – (n – j – 1)(vk+2, vj+1) + c(vj+1, vj+2) + c(vj+2, vj+3) + ...
+ c(vk, vk+1) + (n – k – 1)c(vk+1, vk+2) + (n – k – 2)c(vk+2, vk+3) – (n – k – 2)c(vk+1, vk+3).
(2.2)
Theo bất đẳng thức tam giác,
(n – k – 1)c(vk+1, vk+2) + (n – k – 2)c(vk+2, vk+3) – (n – k – 2)c(vk+1, vk+3) > 0.
Nếu điều kiện (2.1) thỏa mãn, thì ΔT > 0. Điều này cho thấy T không phải là lời giải tối ưu và
trái với giả thiết về tính tối ưu của T. Chứng minh tương tự cho trường hợp khi p ≠ k + 2.
Định lý được chứng minh.

Định lý 2.3. Gọi F = (v1, v2, ..., vj, vj+1, ..., vk) là hành trình bộ phận cấp k. Nếu tìm được đỉnh

vp  V = V \ F (k+1 ≤ p ≤ n) và một chỉ số j (1 < j < k) sao cho thực hiện điều kiện sau đây
(n – j)c(vj, vj+1) + l(P(vj+1, vk)) + c(vk, vp) > (n – j)c(vj, vp) + (n – j – 1)c(vp vj+1) (2.3)
thoả mãn thì F không thể mở rộng đến lời giải tối ưu.
Chứng minh. Gọi T = (v1, v2, ..., vj, vj+1, ..., vk, vk+1, vk+2, ..., vn) là hành trình MLP tối ưu. Ta
có F = (v1, v2, ..., vj, vj+1, ..., vk) và B = (vk+1, vk+2, ..., vn). Chèn vp (p = k + 2)  B vào giữa (vj,
vj+1)  F, ta thu được hành trình T' = (v1, v2, ..., vj, vp, vj+1, ..., vk, vk+1, vk+3, vk+4, ..., vn). Theo
(2.2), ta có:
ΔT = (n – j)c(vj, vj+1) – (n – j)c(vj, vk+2) – (n – j – 1)(vk+2, vj+1) + l(P(vj+1, vk)) + c(vk, vk+1) +
c(vk+1, vk+2) + (n – k – 2)c(vk+1, vk+2) + (n – k – 2)c(vk+2, vk+3) – (n – k – 2)c(vk+1, vk+3).
Từ bất đẳng thức tam giác, suy ra
(n – k – 2)c(vk+1, vk+2) + (n – k – 2)c(vk+2, vk+3) ≥ (n – k – 2)c(vk+1, vk+3)

c(vk, vk+1) + c(vk+1, vk+2) ≥ c(vk, vk+2).
Do đó
ΔT ≥ (n – j)c(vj, vj+1) + l(P(vj+1, vk)) + c(vk, vk+2) – (n – j)c(vj, vk+2) – (n – j – 1)c(vk+2, vj+1).
Nếu điều kiện (2.3) thỏa mãn, thì ΔT > 0, và từ đó suy ra T không phải là lời giải tối ưu và
điều này là trái với giả thiết. Chứng minh hoàn toàn tương tự cho trường hợp p ≠ k + 2. Định
lý được chứng minh.

Tiếp theo, dựa trên các tiêu chuẩn cắt nhánh trong các định lý vừa chứng minh, chúng
tôi trình bày thuật toán nhánh cận để giải bài toán MLP. Mã giả của thuật toán được trình bày

25
Thuật toán 2.2. Thuật toán nhánh cận
Đầu vào: Đỉnh xuất phát v1.
Đầu ra: Hành trình tối ưu MLP T.
1. BEGIN
2. Khởi tạo UB;
3. Try(v1,1, 0, 0) ;
4. return UB;
5. END

Thuật toán 2.3. Try (u, k, l(P(v1, u)), L(F))


Đầu vào: u là đỉnh ở vị trí thứ k trong hành trình, l(P(v1, u)) là độ dài đường đi từ v1 đến u
trên F và L(F) là độ trễ của hành trình bộ phận F.
1. BEGIN
2. if (L(F) >= UB) then // L(F) là độ trễ của F
3. Exit(); //cắt nhánh
4. end if
5. if (LB(F) >= UB) then //LB(F) được tính toán theo (2.5)
6. Exit(); // cắt nhánh
7. end if
8. if (k == n) then
9. UB = L(F);
10. Cập nhập hành trình tốt nhất là F;
11. end if
12. for v ϵ V do
13. if v  F then
14. Chọn v;
15. if (PruningRules(F, v) == true) then
16. Exit(); // cắt nhánh
17. end if
18. F = F  v; // bổ sung đỉnh v vào hành trình bộ phần F
19. Try(v, k + 1, l(P(v1, u)) + c(u, v), L(F) + l(P(v1, u)) + c(u, v);
20. F = F \ v; // loại bỏ v ra khỏi hành trình bộ phần F
21. end if
22. end for
23. END

bày trong Thuật toán 2.2. Thuật toán luôn cập nhập giá trị cận trên (UB) của lời giải tối ưu.
Cận trên có thể là một hành trình bất kỳ qua n đỉnh. Ban đầu, giá trị cận trên có thể được khởi
tạo từ thuật toán lân cận gần nhất [37] hay thuật toán ACO−GA trong Chương 4. Tiếp theo,
thuật toán gọi thủ tục đệ quy Thuật toán 2.3. Trong thủ tục này, hành trình bộ phận F sẽ bị
cắt nhánh nếu độ trễ của nó là L(F) không nhỏ hơn UB. Ngược lại, cận dưới của F (LB) sẽ
được tính và nếu LB lớn hơn UB, thì hành trình bộ phận F bị cắt nhánh. Rõ ràng hiệu quả của

26
Thuật toán 2.4. PruningRules (F, v)
Đầu vào: F, u lần lượt là hành trình bộ phận thứ k và một đỉnh ở vị trí thứ k trong hành trình.
Đầu ra: pruned là true hoặc false.
1. BEGIN
2. pruned = false;
3. for (i = 2; i < |F|; i + +) do //|F| trả về kích thước của hành trình bộ phận F.
4. w1 = (n − i)×c(F[i], F[i + 1]);
5. w2 = (n − i)×c(F[i], v);
6. w3 = (n − i − 1)×c(v, F[i + 1]);
7. if (w1 > w2 + w3) then
8. pruned = true;
9. break;
10. end if
11. w4 = l(P(F[i + 1], F.last));//F.last trả về đỉnh cuối trong hành trình F.
12. if ((w1+w4+c×F.last, v) > w2+w3)) then
13. pruned = true;
14. break;
15. end if
16. end for
17. return pruned;
18. END

thuật toán phụ thuộc vào chất lượng hàm ước lượng LB và UB. Sau đây, chúng tôi đưa các
công thức để ước lượng LB của một hành trình bất kỳ T chứa F như là một lời giải bộ phận
thứ k. Giả sử, E = {e1, e2, ..., en} là tập các cạnh trong ma trận chi phí C sao cho c(e1) < c(e2)
< … < c(en-k) < … < c(en). Chú ý: F = (v1, v2, ..., vk), L(vi) là độ trễ của đỉnh thứ i và m(vk-1,
vk) lần lượt là độ dài đường đi ngắn nhất từ vk-1 đến vk. Khi đồ thị Kn là một đồ thị đầy đủ
trong không gian metric, thì m(vk-1, vk) tương đương c(vk-1, vk). Theo định lý 2.1, ta có:

L(vk+1) = L(vk) + m(vk, vk+1).


= l(P(v1, vk)) + c(vk, vk+1).
≥ l(P(v1, vk)) + e1.
L(vk+2) = L(vk+1) + m(vk+1, vk+2) .
= L(vk) + m(vk, vk+1) + m(vk+1, vk+2).
= L(vk) + c(vk, vk+1) + c(vk+1, vk+2).
≥ l(P(v1, vk)) + e1 + e2.

L(vn) = L(vk) + m(vk, vk+1) + m(vk+1, vk+2) + ... + m(vn-1, vn).
≥ l(P(v1, vk)) + e1 + e2 + ...+ en-k.

27
Suy ra,
L(T) = L(F) + L(vk+1) + L(vk+2) + … + L(vn).
≥ L(F) + (n – k)×l(P(v1, vk)) + (n – k)×e1 + (n – k – 1)×e2 + … + en-k . (2.4)
Từ (2.4), ta có được hàm ước lượng cho cận dưới sau:
LB = L(F) + (n – k)×l(P(v1, vk)) + (n – k)×e1 + (n – k – 1)×e2 + … + en-k . (2.5)

Ngoài ra, khi một đỉnh mới được bổ sung vào F, tiêu chuẩn cắt nhánh trong Định lý
2.2 và 2.3 sẽ được áp dụng theo Thuật toán 2.4. Nếu một trong hai tiêu chuẩn cắt nhánh
được thỏa mãn, thì F bị cắt nhánh. Các biến toàn cục được khai báo trong Thuật toán 2.2
gồm UB, Kn và Cij. Trong tất cả các thủ tục, mỗi hành trình được biểu diễn bằng một danh
sách n đỉnh T = (v1, v2, ..., vk, …, vn), với vk là đỉnh thứ k trong danh sách.

Độ phức tạp thời gian tồi nhất của thuật toán đúng đề xuất là O(n!) trong trường hợp
khi các kỹ thuật cắt nhánh đề xuất không thể thu hẹp không gian lời giải của bài toán. Bây
giờ, chúng ta tiến hành so sánh thời gian chạy của thuật toán đề xuất với thuật toán của Wu et
al [49, 50]. Trong công trình của Wu et al. [49], thuật toán thời có độ phức tạp thời gian
O(n22n) là qui hoạch động không sử dụng được bất cứ thông tin về cận dưới và cận trên và
phải chạy đến tận cùng mới cho lời giải. Vì thế, Wu et al. [50] cũng đã đề xuất cải biên thuật
toán, trong đó áp dụng kỹ thuật cắt nhánh để giảm bớt khối lượng tính toán. Thuật toán trong
trường hợp cải biên này có độ phức tạp thời gian là O(n2T), trong đó T là số lượng hành trình
mà thuật toán phải duyệt, mà trong tình huống tồi nhất khi T = n!. Như vậy, độ phức tạp thuật
toán trong trường hợp tồi nhất cũng không tránh khỏi duyệt toàn bộ. Wu et al. đưa ra kết quả
thực nghiệm của thuật toán đúng nói trên đối với một số file dữ liệu từ 25 đến 30 đỉnh và
khẳng định thuật toán có thể áp dụng cho bài toán với kích thước nhỏ hơn 30 đỉnh. Tuy
nhiên, hiệu quả của thuật toán đúng của Wu et al. trong các bài toán có kích thước lớn hơn thì
không được đề cập.

2.3 Kết quả thực nghiệm

Tất cả thực nghiệm được tiến hành trên máy tính intel pentium core 2 dual 2.13 Ghz và Ram
4GB. Riêng thực nghiệm so sánh với thuật toán của Wu et al. [50] được tiến hành trên máy
tính cá nhân có cùng cấu hình với máy tính mà Wu et al. đã sử dụng là intel pentium 2.4Ghz
và Ram 256 MB. Dữ liệu đầu vào bao gồm ba bộ dữ liệu ngẫu nhiên và một bộ dữ liệu thực.
Trong các thực nghiệm, thuật toán được thực thi với hai cận trên: Cận trên UB1 được tạo bởi
thuật toán lân cận gần nhất [37], trong khi cận trên UB2 được tạo ra bởi thuật toán ACO–GA

28
3

2
T EA1
(phút)
1
EA2

0
Bộ dữ liệu ngẫu Bộ dữ liệu ngẫu
Bộ dữ liệu thực 2
nhiên 1 nhiên 2

Hình 2. 1 Thời gian chạy trung bình các file dữ liệu (n = 30) trong các bộ dữ liệu

25
20

T 15 EA1
(phút)
10 EA2
5
0
Bộ dữ liệu ngẫu Bộ dữ liệu ngẫu
Bộ dữ liệu thực 2
nhiên 1 nhiên 2

Hình 2. 2 Thời gian chạy trung bình các file dữ liệu (n = 35) trong các bộ dữ liệu

120
100
80
T EA1
(phút) 60
40
EA2
20
0
Bộ dữ liệu ngẫu Bộ dữ liệu ngẫu
Bộ dữ liệu thực 2
nhiên 1 nhiên 2

Hình 2. 3 Thời gian chạy trung bình các file dữ liệu (n = 40) trong các bộ dữ liệu
30

T 20
( giây) EA1
10 EA2

0
TRP-10-Rx TRP-20-Rx

Hình 2. 4 Thời gian chạy trung bình các file dữ liệu (n = 10, 20) của bộ dữ liệu ngẫu nhiên 3

29
40

30
T EA1
(phút) 20
EA2
10

0
Nhóm 1 Nhóm 2 Nhóm 3

Hình 2. 5 Thời gian chạy trung bình các file dữ liệu trong mỗi nhóm của bộ dữ liệu thực 2
40

T 30 EA1
(giây)
20 EA2
10 BA
0
Ulysses22 Gr24 Gr26

Hình 2. 6 Thời gian chạy trung bình các file dữ liệu nhỏ trong bộ dữ liệu thực 2

(xem chi tiết trong chương 4). Chúng tôi cũng sử dụng kết quả thực nghiệm để so sánh với
kết quả thực nghiệm của Wu et al. [50].

Ký hiệu EA1 và EA2 là thuật toán đề xuất với cận trên lần lượt là UB1 và UB2 và BA
là thuật toán của Wu et al. [50]. Từ Bảng 2.1 đến 2.5, cột 1 và 2 lưu trữ thông tin về các file
dữ liệu và kích thước của chúng; cột 3 là giá trị tối ưu (OPT); cột 4 và 5 tương ứng với lời
giải và thời gian chạy của thuật toán EA1 và EA2. Thời gian chạy T của các thuật toán từ
Bảng 2.1 đến 2.3 tính theo phút, trong khi, từ Bảng 2.4 đến 2.6 thì tính theo giây. Thời gian
chạy của thuật toán BA trong Bảng 2.6 được lấy từ kết quả thực nghiệm trong [50].

2.3.1 Thực nghiệm bộ dữ liệu ngẫu nhiên

Ba bộ dữ liệu ngẫu nhiên gồm các file dữ liệu Euclidean và phi Euclidean được lấy từ các bộ
dữ liệu ngẫu nhiên từ 1 đến 3. Riêng bộ dữ liệu ngẫu nhiên 3, chúng tôi chọn các file dữ liệu
có số đỉnh n = 10 và 20. Mỗi file dữ liệu được chạy 10 lần và kết quả được hiện thị từ Bảng
2.1 đến 2.4 là kết quả trung bình của 10 lần chạy. Hình 2.1 đến 2.4 là thời gian chạy trung
bình của thuật toán trong mỗi bộ dữ liệu.

Từ Hình 2.1 đến 2.4, chúng tôi thấy rằng với cận trên tốt hơn, thì thuật toán cắt nhánh

30
nhanh hơn. Cụ thể, cận trên là lời giải của thuật toán ACO–GA, thì thời gian chạy trung bình
của thuật toán tốt hơn nhiều so với thời gian chạy của thuật toán khi cận trên là lời giải của
thuật toán lân cận gần nhất.

2.3.2 Thực nghiệm bộ dữ liệu thực

Chúng tôi chọn các file dữ liệu thực có kích thước nhỏ trong bộ dữ liệu thực 1 gồm
Ulysses22, Fir26, và Gr24 (22, 26 và 24 là số lượng đỉnh trong mỗi file dữ liệu). Ngoài ra,
chúng tôi sử dụng các file dữ liệu trong bộ dữ liệu thực 2 có số đỉnh từ 30 đến 40 đỉnh.
Chúng tôi chia các file dữ liệu này thành ba nhóm gồm: Nhóm gồm các file dữ liệu mà các
đỉnh phân bố tập trung (nhóm 1), nhóm gồm các file dữ liệu mà các đỉnh được phân bố thưa
(nhóm 2), và nhóm gồm các file dữ liệu mà các đỉnh được phân bố đặc biệt như trên đường
thẳng, hay các đỉnh cách đều nhau, …. Các file dữ liệu được chạy 10 lần và kết quả được
hiện thị trong các Bảng là kết quả trung bình của 10 lần chạy. Thời gian chạy trung bình của
thuật toán trong mỗi bộ dữ liệu được hiển thị từ Hình 2.1 đến 2.3 và Hình 2.5 và 2.6.

Kết quả thực nghiệm từ Hình 2.1 đến 2.3 cho thấy rằng nếu cận trên là lời giải của
thuật toán ACO–GA thay vì thuật toán lân cận gần nhất, thì thời gian chạy của thuật toán tốt
hơn rất nhiều. Hình 2.5 cho thấy thời gian chạy của thuật toán cho các file dữ liệu thuộc
nhóm 1 tốt hơn thời gian chạy của thuật toán cho các file dữ liệu thuộc các nhóm còn lại. Rõ
ràng, hàm ước lượng cận dưới trong (2.5) đưa ra cận dưới tốt hơn cho các file dữ liệu thuộc
nhóm 1. Bởi vậy, thuật toán hiệu quả hơn cho các file dữ liệu khi các đỉnh trong các file dữ
liệu đó phân bố gần nhau. Hình 2.1 đến 2.3 cho thấy thời gian chạy của thuật toán trên các
file dữ liệu thực tốt hơn nhiều so với thời gian chạy của thuật toán trên các file dữ liệu ngẫu
nhiên, có thể các file dữ liệu thực có tính cấu trúc hơn. Kết quả thực nghiệm trong Hình 2.6
chỉ ra rằng thời gian chạy của cả hai thuật toán EA1 và EA2 đều tốt hơn thời gian chạy của
thuật toán BA trong tất cả các file dữ liệu nhỏ trong bộ dữ liệu thực 1.

31
Bảng 2. 1 Thời gian chạy của thuật toán trong bộ dữ liệu ngẫu nhiên 1 (tính theo phút)
EA1 EA2
n File dữ liệu OPT
UB1 T UB2 T
test 1 6198 9321 2.8 6198 1.8
test 2 6270 9412 2.7 6270 1.7
test 3 5476 8124 2.5 5476 1.8
test 4 5697 8012 2.4 5697 1.9
test 5 5579 8321 2.3 5579 1.9
30
test 6 5489 8314 2.3 5489 1.8
test 7 5735 8124 2.2 5735 2.0
test 8 5511 8245 2.1 5511 2.1
test 9 5068 7124 2.3 5068 1.9
test 10 6572 9045 2.2 6572 2.0
Trung bình 2.38 1.89
test 1 6882 9842 20 6882 17
test 2 7230 9654 19 7230 16
test 3 7871 9124 20 7871 15
test 4 7187 9541 22 7187 17
test 5 6773 9875 20 6773 16
35
test 6 6539 9754 19 6539 15
test 7 6375 9324 18 6375 15
test 8 7486 9874 20 7486 16
test 9 7278 9632 18 7278 17
test 10 7906 10214 21 7906 15
Trung bình 19.7 15.9
test 1 8105 12454 112 8105 92
test 2 9248 13952 115 9248 94
test 3 8584 12541 110 8584 90
test 4 9240 13254 110 9240 91
test 5 8097 11214 112 8097 94
40
test 6 9490 12541 116 9490 91
test 7 8450 12844 110 8450 93
test 8 8426 12145 109 8426 92
test 9 8987 12451 109 8987 90
test 10 9705 12986 108 9705 89
Trung bình 111.1 91.6

32
Bảng 2. 2 Thời gian chạy của thuật toán trong bộ dữ liệu ngẫu nhiên 2 (tính theo phút)
EA1 EA2
File dữ liệu OPT
UB1 T UB2 T
test 1 5140 7012 2.7 5140 1.7
test 2 6022 8547 2.6 6022 1.6
test 3 4709 6541 2.3 4709 1.5
test 4 5531 7565 2.2 5531 1.8
test 5 5647 7695 2.2 5647 1.8
30
test 6 5144 7321 2.4 5144 1.7
test 7 5389 7541 2.4 5389 1.9
test 8 6010 8541 2.3 6010 1.9
test 9 5728 8707 2.2 5728 1.9
test 10 6256 8785 2.2 6256 1.9
Trung bình 2.35 1.77
test 1 6895 9854 18 6895 15
test 2 7365 10542 20 7365 16
test 3 7756 9875 21 7756 17
test 4 6964 9587 22 6964 18
test 5 8316 11254 19 8316 15
35
test 6 8523 10214 18 8523 16
test 7 7478 11367 17 7478 14
test 8 6860 9875 19 6860 14
test 9 8568 12125 20 8568 15
test 10 7177 9865 21 7177 17
Trung bình 19.5 15.7
test 1 9526 13625 110 9526 89
test 2 8827 12145 100 8827 91
test 3 9440 12548 105 9440 89
test 4 8539 11251 112 8539 89
test 5 8321 11254 111 8321 92
40
test 6 8327 12657 107 8327 90
test 7 8300 11254 109 8300 91
test 8 9520 13621 110 9520 87
test 9 9759 13214 107 9759 90
test 10 8782 12145 112 8782 87
Trung bình 108.3 89.5

33
Bảng 2. 3 Thời gian chạy của thuật toán trong bộ dữ liệu thực 2 (tính theo phút)
EA1 EA2
n Nhóm File dữ liệu OPT
UB1 T UB2 T
eil51 4171 5451 1.7 4171 1.5
eil76 4074 6124 1.7 4074 1.5
Nhóm 1
st70 5365 7854 1.5 5365 1.3
rat195 10559 14521 1.6 10559 1.3
kroA100 185296 245124 2.0 185296 1.8
kroB100 166192 225644 2.2 166192 1.5
30 Nhóm 2
kroC100 159616 232145 2.3 159616 1.6
berlin52 58234 82451 2.0 58234 1.7
pr76 868102 127548 2.2 868102 1.8
tsp225 20823 31651 2.3 20823 1.9
Nhóm 3
tss225 736103 814524 2.1 736103 1.9
Lin105 87970 115412 2.2 87970 1.6
Trung bình 1.98 1.62
eil51 5051 7125 4.8 5051 2.8
eil76 4482 6214 4.8 4482 3.5
Nhóm 1
st70 7324 9854 4.5 7324 3.3
rat195 13762 19854 4.6 13762 3.2
kroA100 230357 265124 15 230357 6.6
kroB100 226795 251451 14 226795 6.5
35 Nhóm 2
kroC100 197780 238554 16 197780 7.3
berlin52 71521 98541 15 71521 6.7
pr76 931935 1216541 17 931935 6.5
tsp225 24700 35462 16 24700 6.7
Nhóm 3
tss225 820032 1025451 18 820032 6.8
Lin105 134387 187541 17 134387 7.4
Trung bình 12.23 5.61
eil51 6140 8654 75 6140 56
eil76 5894 8545 73 5894 54
Nhóm 1
st70 7801 10214 74 7801 52
rat195 18058 25621 76 18058 54
kroA100 239680 252154 85 239680 65
kroB100 245999 281254 87 245999 60
40 Nhóm 2
kroC100 1122890 1452141 86 1122890 61
berlin52 1372572 1985421 87 1372572 63
pr76 1122891 1587454 87 1122891 62
tsp225 27523 41835 88 27523 64
Nhóm 3
tss225 1138068 1487542 89 1138068 67
Lin105 140450 175412 90 140450 65
Trung bình 83.08 60.25

34
Bảng 2. 4 Thời gian chạy của thuật toán trong bộ dữ liệu ngẫu nhiên 3 (TPR-10-Rx) (tính
theo giây)
EA1 EA2
File dữ liệu OPT
UB1 T UB2 T
TRP-10-R1 1303 1385 8 1303 5
TRP-10-R2 1517 1812 9 1517 7
TRP-10-R3 1233 1512 10 1233 6
TRP-10-R4 1386 1612 11 1386 5
TRP-10-R5 978 1214 9 978 6
TRP-10-R6 1477 1712 9 1477 5
TRP-10-R7 1163 1312 10 1163 7
TRP-10-R8 1234 1385 11 1234 6
TRP-10-R9 1402 1545 9 1402 7
TRP-10-R10 1388 1521 9 1388 5
TRP-10-R11 1405 1587 8 1405 6
TRP-10-R12 1150 1298 9 1150 8
TRP-10-R13 1531 1645 10 1531 5
TRP-10-R14 1531 1698 11 1531 6
TRP-10-R15 1087 1312 12 1087 7
TRP-10-R16 1264 1441 10 1264 7
TRP-10-R17 1058 1198 8 1058 5
TRP-10-R18 1083 1230 9 1083 5
TRP-10-R19 1394 1589 9 1394 6
TRP-10-R20 951 1084 5 951 7
Trung bình 9.3 6.05

35
Bảng 2. 5 Thời gian chạy của thuật toán trong bộ dữ liệu ngẫu nhiên 3 (TPR-20-Rx) (tính
theo giây)
EA1 EA2
File dữ liệu OPT
UB1 T UB2 T
TRP-20-R1 3175 3784 20 3175 10
TRP-20-R2 3248 3912 21 3248 15
TRP-20-R3 3570 4284 22 3570 13
TRP-20-R4 2983 3564 23 2983 12
TRP-20-R5 3248 3941 21 3248 14
TRP-20-R6 3328 4012 24 3328 15
TRP-20-R7 2809 3271 21 2809 14
TRP-20-R8 3461 4187 22 3461 10
TRP-20-R9 3475 4125 21 3475 12
TRP-20-R10 3359 4121 20 3359 14
TRP-20-R11 2916 3512 21 2916 13
TRP-20-R12 3314 3977 22 3314 14
TRP-20-R13 3412 4121 23 3412 12
TRP-20-R14 3297 3956 24 3297 10
TRP-20-R15 2862 3451 20 2862 14
TRP-20-R16 3433 4154 21 3433 11
TRP-20-R17 2924 3509 20 2924 12
TRP-20-R18 3168 3952 22 3168 10
TRP-20-R19 3299 3959 23 3299 12
TRP-20-R20 2796 3355 22 2796 13
Trung bình 21.65 12.5

Bảng 2. 6 Thời gian chạy của thuật toán cho các file dữ liệu nhỏ trong
bộ dữ liệu thực 1 (tính theo giây)
File dữ liệu Ulysses22 Gr24 Gr26
EA1 4.00 20.00 22.24
EA2 3.00 15.00 22.12
BA 3.40 27.41 30.23

36
2.4 Kết luận chƣơng 2

Trong chương này, chúng tôi trình bày thuật toán đúng dựa trên phương pháp nhánh cận để
giải bài toán MLP. Hai tiêu chuẩn được đưa ra để phát triển kỹ thuật cắt nhánh. Kết quả thực
nghiệm trên các bộ dữ liệu ngẫu nhiên và bộ dữ liệu thực chỉ ra rằng:
 Bài toán lên đến 40 đỉnh có thể được giải chính xác.
 Thuật toán đề xuất cũng hiệu quả hơn so với thuật toán của Wu et al. tại một số file
dữ liệu thực nghiệm.

Kết quả tối ưu có được từ thuật toán đúng là cơ sở giúp chúng tôi đánh giá một cách
chính xác hiệu quả của các thuật toán gần đúng sau này. Các kết quả chính của chương này
được công bố tại [4] trong danh mục các công trình công bố được sử dụng trong luận án.

37
CHƢƠNG 3
CÁC THUẬT TOÁN GẦN ĐÚNG CẬN TỶ LỆ

Hiện nay, một số thuật toán gần đúng cận tỷ lệ giải bài toán cực tiểu hóa độ trễ đã được đề
xuất. Tuy nhiên, hiệu quả của các thuật toán này chỉ được đánh giá ở góc độ lý thuyết. Chưa
có công trình nào chỉ ra cận tỷ lệ, thời gian chạy khi giải bài toán thực tế cũng như đánh giá
và so sánh hiệu quả của các thuật toán từ thực nghiệm. Thêm vào đó, chất lượng của cận
dưới, một phần quan trọng trong các thuật toán, cũng không được đề cập. Nhằm giải quyết
vấn đề tồn tại vừa nêu, chúng tôi nghiên cứu thực nghiệm về hiệu quả các thuật toán gần
đúng và đánh giá, so sánh hiệu quả của các thuật toán trên ba khía cạnh cận tỷ lệ, thời gian
chạy thực tế, và chất lượng của cận dưới. Sau đó, chương này trình bày thuật toán dựa trên
phương pháp Subgradient nhằm giảm cận tỷ lệ cho bài toán MLP. Cơ sở lý thuyết được sử
dụng trong thuật toán, cũng như các kết quả thực nghiệm, đánh giá và so sánh với các thuật
toán cận tỷ lệ hiện biết cũng được đề cập.

38
3.1 Đánh giá thực nghiệm hiệu quả của các thuật toán gần đúng
cận tỷ lệ

Hiện tại trong hướng tiếp cận gần đúng cận tỷ lệ, hiệu quả của các thuật toán [1, 3, 6, 9, 18]
chỉ được xem xét trên khía cạnh lý thuyết. Cụ thể, các thuật toán này chỉ để cập đến cận tỷ lệ
trong trường hợp tồi nhất và độ phức tạp thời gian lý thuyết. Có một trường hợp ngoại lệ là
Archer et al. [1] đã thực thi thuật toán của họ trên bộ dữ liệu thực 1 [51] và đưa ra cận tỷ lệ
(được tính toán dựa trên cận dưới thu được nhờ giải quyết bài toán nới lỏng Lagrange) và thời
gian chạy từ thực nghiệm. Tuy nhiên, công trình này không chỉ ra được chất lượng của cận
dưới, cũng như so sánh hiệu quả của các thuật toán gần đúng cận tỷ lệ khác từ thực nghiệm.
Theo hiểu biết của chúng tôi, hiệu quả thực tế của các thuật toán gần đúng cận tỷ lệ giải bài
toán MLP là một vấn đề mà hiện nay chưa có công trình nào đề cập đến. Do đó, chúng tôi
tiến hành thực nghiệm để đánh giá hiệu quả của các thuật toán gần đúng cận tỷ lệ. Chúng tôi
tập trung vào ba khía cạnh chính như cận tỷ lệ, thời gian chạy thực tế và chất lượng của cận
dưới. Đây là những khía cạnh quan trọng để đánh giá hiệu quả của các thuật toán cận tỷ lệ.

Chúng tôi tiến hành thực nghiệm các thuật toán gần đúng cận tỷ lệ trên bộ dữ liệu
thực nghiệm bao gồm ba bộ dữ liệu ngẫu nhiên và hai bộ dữ liệu thực. Từ kết quả thực
nghiệm, chúng tôi đưa ra những đánh giá và so sánh hiệu quả của các thuật toán.

3.1.1 Các thuật toán gần đúng cận tỷ lệ

Mục này trình bày tóm tắt năm thuật toán cận tỷ lệ tốt nhất hiện biết để tiến hành đánh giá
thực nghiệm.

3.1.1.1 Thuật toán Blum et al.

Blum et al. [6] cho rằng chi phí tối ưu của bài toán k−MST (bài toán cây khung nhỏ nhất đi
qua k đỉnh [15]) được xem như cận dưới của độ trễ đỉnh thứ k trong hành trình tối ưu MLP.
Thuật toán Blum et al. được trình bày như sau: Giả sử, có tập lời giải Tk thu được từ thuật
toán gần đúng cận tỷ lệ β cho bài toán k−MST với gốc v1 (k = 2, 3, …, n). Đối với mỗi số
nguyên l (l = 2, 3, .., n), chọn cây Tl có chi phí lớn nhất trong khoảng (2l, 2l+1]. Sau đó, với
mỗi cây Tl, nhân đôi mỗi cạnh của cây để thu được một chu trình Euler Cl (l = 2, 3, …, n) có
gốc là v1. Kết nối các chu trình Cl, đồng thời loại bỏ các đỉnh đã được duyệt từ các chu trình
Cj (j < l) trước đó để thu được hành trình MLP.

39
Thuật toán có cận tỷ lệ là 16 nếu sử dụng thuật toán gần đúng cận tỷ lệ 2 cho bài toán
k−MST [15]. Giải bài toán k−MST, chúng ta cần O(n(n+log cmax))×log n) để gọi PCST (Prize
collection steiner tree) với cmax là chi phí cạnh lớn nhất và O(n2×log n) để thực thi PCST. Bởi
vậy, độ phức tạp thời gian của thuật toán là O(n3(n+log cmax))×log2 n).

3.1.1.2 Thuật toán Goeman et al.

Goemans et al. [18] cho rằng nếu có một thuật toán tìm hành trình ngắn nhất đi qua k đỉnh
trong không gian metric với cận tỷ lệ β, thì tồn tại một thuật toán có cận tỷ lệ 359×β cho bài
toán MLP. Với mỗi j = 1, 2, …, n, thuật toán tìm hành trình ngắn nhất Tj đi qua j đỉnh. Sau
đó, ta kết nối các Tj để thu được hành trình MLP. Mục đích của việc kết nối là lựa chọn các
chỉ số j1, …, jm sao cho khi kết nối các T j , ..., T jm ta thu được hành trình có độ trễ là nhỏ
1

nhất. Để kết nối các hành trình Tj (j = 2, 3, …, n), Goemans et al. đưa ra thuật toán như sau:
Xây dựng đồ thị đầy đủ có hướng Gn với cung (i, j) đi từ min (i, j) đến max (i, j) và có độ dài
(n  (i  j ))  d j
là (với dj là độ dài của Tj). Thuật toán sau đó tìm đường đi ngắn nhất từ đỉnh 1
2

đến đỉnh n. Giả sử, đường đi đó đi qua các đỉnh 1 = j1 < j2 < ... < jm = n, thì hành trình MLP
cuối cùng thu được bằng việc kết nối T = T j , ..., T jm .
1

Sử dụng thuật toán cận tỷ lệ β = 2 cho bài toán k–MST [15], ta thu được một thuật
toán có cận tỷ lệ là 7.18 cho bài toán MLP. So với thuật toán của Blum et al., thì thuật toán
Goeman et al. cho cận tỷ lệ tốt hơn. Tuy nhiên, vẫn cần O(n(n+logcmax)×log n) để gọi PCST
để tạo ra các k–MST, bởi vậy, thuật toán không cải thiện được về thời gian chạy.

3.1.1.3 Thuật toán Archer et al.

Archer et al. [1] không sử dụng thuật toán k-MST trong [15], thay vì đó, Archer et al. đề xuất
thuật toán tạo ra một tập các cây k–MST (k = 2, …, n) bằng việc sử dụng kỹ thuật nới lỏng
lagrangian. Sau đó, các cây này được kết nối theo thuật toán Goeman et al. [18] để thu được
hành trình MLP. Cận tỷ lệ của thuật toán được Archer et al. chứng minh là 7.18. Thuật toán
không giảm cận tỷ lệ so với thuật toán của Goeman et al. Tuy nhiên, độ phức tạp thời gian lại
được cải thiện rõ rệt. Nhờ giảm được số lần gọi PCST xuống còn O(n×log n), nên độ phức
tạp thời gian của thuật toán là O(n3×log2n). Archer et al. cũng đưa ra thuật toán ngẫu nhiên
chỉ sử dụng O(log2n) cho lời gọi PCST và một thuật toán với cận tỷ lệ là (7.18 + ε) khi chỉ sử
dụng O((1/ε)log2n) cho lời gọi PCST. Chi tiết thuật toán của Archer et al. được trình bày
trong Thuật toán 3.1.

40
Thuật toán 3.1. Thuật toán Archer et al.
Đầu vào: Kn, Cij và v1 lần lượt là đồ thị đầy đủ, ma trận chi phí và đỉnh xuất phát.
Đầu ra: T là hành trình MLP.
1. BEGIN
2. Thu được Tk (k = j1, j2, ..., jm (1 = j1 < j2 <....< jm = n))
từ Get_k_Tree (Kn, Cij, v1, k);
3. Chuyển các Tk thành các hành trình Euler Ck.
4. T = Kết nối Ck theo thuật toán Goemans et al. [18];
5. return T;
6. END

Thuật toán 3.2. Get_k_Tree (Kn, Cij, v1, k)


Đầu vào: Kn, Cij, v1, k lần lượt là một đồ thị đầy đủ, ma trận chi phí, đỉnh xuất phát và số
lượng đỉnh trong cây.
Đầu ra: bk, Tk là cận dưới và lời giải k-MST
1. BEGIN
2. λmin = 0; λmax = cmax; Tlo = Ø; blo = 0;
3. δ = 1 – 1/(4n – 1);
4. while (λmin ≤ λmax) do
5. λmid = (λmin + λmax ) / 2;
6. (Thi, bhi) = PCST(Kn, Cij, λmid, v1);
7. if (hi == k) then
8. bk = bhi; Tk = Thi;
9. break;
10. else
11. if (hi < k)
12. λmin= λmid;
13. if (|λmid – λ| < ((1 – δ)×cmin)/(δ×n)) then
14. bk = Interpolate(k, |Tlo|, |Thi|, blo, bhi, δ);
15. break;
16. end if
17. else
18. λmax = λmid;
19. if (|λmid – λ| < ((1 – δ)cmin)/(δ×n) then
20. bk = Interpolate(k, |Tlo|, |Thi|, blo, bhi, δ);
21. break;
22. end if
23. end if
24. Tlo = Thi; blo = bhi; λ = λmid;
25. end while
26. return bk, Tk;
27. END

Chú ý: Hàm Interpolate là hàm nội suy bk từ blo và bhi như sau:
k = αlo×|Tlo|×δ + αhi×|Thi|×δ.
αlo + αhi = 1.
bk = αlo×blo×δ + αhi×bhi×δ.

41
Xây dựng tập các k–MST (k = 2, …, n) bằng việc sử dụng thuật toán gần đúng cho bài
toán PCST giá trị phạt được thiết lập là λ [17]. Thuật toán trả về cây T và một cận dưới. Nếu λ
= 0, thì kết quả trả về là một cây chứa một đỉnh gốc. Tương tự, nếu λ = cmax, thì kết quả trả về
là một cây với n đỉnh. Đối với mỗi k =1, 2, …, n, thực hiện tìm kiếm nhị phân cho giá trị λ để
thu được một cây với chính xác k đỉnh. Nếu thành công, thì ta thu được k–tree (Tk) và giá trị
cận dưới. Ngược lại, ta có hai cây Tlo, Thi và hai giá trị cận dưới blo và bhi với |Tlo| < k và |Thi| >
k cho hai giá trị λlo và λhi. Nếu hai giá trị của λlo và λhi đủ gần, thì ta nội suy bk của cây có k
đỉnh từ blo và bhi theo hàm Interpolate. Chi tiết được trình bày trong Thuật toán 3.2.

Để giảm số lần gọi PCST xuống còn O(n×log n) trong tìm kiếm nhị phân khi mà
cmax/cmin = poly(n) (cmax, cmin lần lượt là chi phí của cạnh lớn nhất và nhỏ nhất), ta xóa các
đỉnh trong khoảng cách cmax/4n3 so với đỉnh gốc. Sau đó, áp dụng thuật toán Thuật toán 3.1
để thu được hành trình bộ phận MLP. Cuối cùng, ta bổ sung đỉnh đã bị xóa vào hành trình bộ
phận này để thu được hành trình MLP.

3.1.1.4 Thuật toán Chauhuri et al.

Hiện tại, trong hướng tiếp cận gần đúng cận tỷ lệ, các công trình [1, 6, 18] chỉ ra rằng chi phí
tối ưu của bài toán k–MST được xem như cận dưới cho độ trễ đỉnh thứ k trong hành trình tối
ưu MLP. Có một ngoại lệ khi K.Chaudhuri et al. [9] chỉ ra rằng lời giải tối ưu của bài toán
hành trình ngắn nhất đi qua k đỉnh (ta gọi là bài toán k–troll) là một cận dưới tốt hơn cho độ
trễ đỉnh thứ k trong hành trình tối ưu MLP. Tuy nhiên, bài toán k–troll cũng khó tương tự như
bài toán k–MST, bởi vậy họ sử dụng thuật toán tìm cây khung đi qua k đỉnh Tk có chi phí bị
chặn bởi chi phí của hành trình ngắn nhất đi qua k đỉnh. Do đó, nếu vẫn sử dụng thuật toán kết
nối của Goemans et al. [18] để kết nối các Tk (k = 2, …, n), thì ta không phải mất cận tỷ lệ 2
cho bài toán k–MST, bởi vậy thuật toán có cận tỷ lệ 3.59 cho bài toán MLP.

K.Chaudhuri et al. biến đổi thuật toán cho việc tìm k–MST có đỉnh gốc v1 và một đỉnh
cuối vend với chi phí bị chặn bởi chi phí hành trình ngắn nhất đi từ v1 đến vend. Về cơ bản, ta
vẫn sử dụng thuật toán tạo ra các k-MST và cần “đoán” đỉnh cuối vend. Ta có (n – 1) khả năng
cho việc “đoán” đỉnh cuối vend trong mỗi lần tạo cây k–tree (Tk ). Bởi vậy, với mỗi giá trị k, ta
có tập (n – 1) k-tree khác nhau và ta chọn k-tree có chi phí nhỏ nhất là lời giải của bài toán k-
troll. Độ phức tạp thời gian của thuật toán là O(n5×log2 n). Tuy nhiên, K.Chaudhuri et al. cho
rằng chỉ cần tạo ra các k–tree với O(log n) giá trị λ khác nhau. Do đó, độ phức tạp thời gian
của thuật toán giảm xuống là O(n4×log2 n).

42
Thuật toán 3.3. Thuật toán K.Chaudhuri et al.
Đầu vào: Kn, Cij, v1 lần lượt là một đồ thị đầy đủ, ma trận chi phí, đỉnh gốc.
Đầu ra: Hành trình MLP.
1. BEGIN
2. Thu được Tk (k = j1, j2, ..., jm (1 = j1 < j2 <....< jm = n)) từ
Get_best_k_troll (Kn, Cij, v1, k);
3. Chuyển các Tk thành các hành trình Euler Ck.
4. T = Kết nối Ck theo thuật toán Goemans et al. [18];
5. Return T;
6. END

Thuật toán 3.4. Get_best_k_troll (Kn, Cij, v1, k)


Đầu vào: Kn, Cij, v1 lần lượt là một đồ thị đầy đủ, ma trận chi phí, đỉnh gốc và số lượng đỉnh
trong cây.
Đầu ra: Tk là cây cần tìm.
1. BEGIN
2. sT = Ø;
3. bT = +∞; Tk-troll = Ø;
4. for (i = 1; i ≤ n – 1; i ++) do
5. vend = {v Kn | v # v1 và v  sT};
6. sT = sT  {vend};
7. Tk = Get_k_troll (Kn, Cij, v1, vend, k);
8. if (bT > c(Tk))
9. Tk-troll = Tk; bT = c(Tk);
10. end if
11. end for
12. return Tk-troll;
13. END

Hàm Get_k_troll bao gồm các bước giống với hàm Get_k_tree trong Thuật toán 3.2.
Tuy nhiên, hàm Get_k_troll gọi thủ tục PCST với đỉnh cuối vend. Mỗi đỉnh dự đoán vend tạo ra
một Tk . Ta chọn Tk với chi phí nhỏ nhất bởi hàm Get_best_k_troll trong Thuật toán 3.4. Để
kết nối các Tk này, ta sử dụng thuật toán kết nối của Goemans et al. [18]. Chi tiết thuật toán
được trình bày trong Thuật toán 3.3.

3.1.1.5 Thuật toán Arora et al.

Arora et al. [3] cho rằng có thể phân rã hành trình MLP thành các đoạn sao cho bất kỳ sự thay
đổi nào trong mỗi đoạn không ảnh hưởng nhiều đến tổng độ trễ của hành trình MLP. Sau đó,
thay thế mỗi đoạn bởi hành trình người du lịch tối ưu (optimum traveling salesman tour). Gọi
OPT là độ trễ của hành trình tối ưu MLP. Arorea et al. chỉ ra rằng: Có thể kết nối O(log n/ε)

43
hành trình người du lịch tối ưu để thu được hành trình MLP có độ trễ nhiều nhất là (1 +
ε)×OPT, với ε > 0.

Arora et al. đã sử dụng ý tưởng này để xây dựng lược đồ xấp xỉ giải bài toán MLP
trong không gian euclidean. Thuật toán của Arora et al. bao gồm các bước: Ban đầu, n đỉnh
của đồ thị được bao phủ bởi một ô vuông (boundingbox) như Hình 3.1. Ta đặt một lưới LxL
trên ô vuông đó và di chuyển các đỉnh trong ô vuông đến điểm lưới gần nhất. Theo Arora et
al., bước này còn được gọi là bước làm tròn (well_rounded) và độ trễ hành trình tối ưu MLP
sau bước làm tròn nhiều nhất bằng O(δ×OPT) (0 < δ < ε và OPT là độ trễ của hành trình tối
ưu MLP trước khi làm tròn). Tiếp theo, thao tác đệ quy chia nhỏ lưới LxL thành các ô vuông
(square) có kích thước nhỏ hơn. Ta dừng việc chia khi mà mỗi ô vuông chứa nhiều nhất một
đỉnh của đồ thị ban đầu. Trong Hình 3.2, ta coi ô vuông ban đầu là ô vuông mức 0 và các ô
vuông tại mỗi lần chia nhỏ sẽ ứng với ô vuông mức 1, 2, … Việc phân chia này tạo ra một
cây (quadtree) có gốc là hình vuông mức 0 (boundingbox) và các con của cây tại mỗi mức
cũng là các hình vuông được được tạo thành bởi quá trình chia nhỏ như Hình 3.2. Mỗi nút
của cây có bốn con và cây có O(L2) nút và độ sâu là O(log L). Trên mỗi cạnh ô vuông, có một
log n
tập các điểm gọi là portal. Mỗi ô vuông có bốn portal ở bốn góc và portal cách đều

nhau trên mỗi cạnh. Ta định nghĩa một hành trình–(m, k) ((m, k)–light tour) là một hành trình
đi qua mỗi cạnh của mỗi ô vuông trong một quadtree nhiều nhất k lần và chỉ tại một trong m
portal của nó như Hình 3.3. Phương pháp quy hoạch động ở bước cuối cùng được thực hiện
để tìm một hành trình–(c×log n/ε, f×log n/ε) (c, f là hằng số và ε > 0) đi qua n đỉnh. Để ghi
nhận lời giải, ta xây dựng một bảng tra cứu (tableMatrix) cho mỗi ô vuông (square) theo
chiến lược từ dưới lên (bottom- up). Khi xét một ô vuông của quadtree, cần liệt kê tất cả các
khả năng cho ra một crossing (Hình 3.4) và tìm trong bảng tra cứu những hành trình bộ phận
(hành trình đi qua k đỉnh và k < n) nào có thể ghép nối với nó để tạo thành một hành trình
mới. Kiểm tra xem hành trình mới này có là hành trình–(c×log n/ε, f×log n/ε). Nếu đúng thì
cập nhập vào trong bảng tra cứu. Khi kết thúc thuật toán quy hoạch động, có nhiều hơn một
hành trình đi qua n đỉnh được tạo thành. Hành trình với độ trễ là nhỏ nhất được chọn là lời
giải bài toán. Theo Arora et al. thì độ trễ hành trình thu được nhiều nhất bằng (1 + ε)×OPT.
Chi tiết thuật toán được trình bày từ Thuật toán 3.5 đến Thuật toán 3.9.

44
Hình 3. 1 Hình vuông (bounding box) bao phủ các đỉnh

Hình 3. 2 Phân chia ô vuông và quadtree tương ứng

45
Hình 3. 3 Tập các portal

Hình 3. 4 Minh họa crossing đi qua các portal

Thuật toán 3.5. Thuật toán Arora et al.


Đầu vào: Kn, Cij, f, c lần lượt là đồ thị đầy đủ, ma trận chi phí, và các hằng số.
Đầu ra: Hành trình MLP tốt nhất.
1. BEGIN
2. boundingBox = Well_rounded (Kn);
3. squareMatrix = Construct_Shifted_Quadtree (boundingBox);
4. tableMatrix = DynamicProgramming(squareMatrix, f, c);
5. return hành trình qua n đỉnh có độ trễ nhỏ nhất từ tableMatrix;
6. END

Thuật toán 3.6. well_rounded (Kn)


Đầu vào: Kn là đồ thị đầy đủ.
Đầu ra: boundingBox là hình vuông (LxL).
1. BEGIN
2. L = O(n);
3. Chia hình vuông thành các ô vuông cách đều g = ϴ(δ×L/n2) (0 < δ < ε);
4. Chuyển mỗi đỉnh của Kn đến điểm lưới gần nhất;
5. Chia độ dài các cạnh trong Kn cho g;
6. return boundingBox;
7. END

46
Thuật toán 3.7. Construct_Shifted_Quadtree (boundingBox)
Đầu vào: Một well-rounded boundingBox.
Đầu ra: squareMatrix lưu trữ một tập các Quadtrees.
1. BEGIN
2. Chia boundingBox cho đến tận khi mỗi hình vuông chứa nhiều nhất một đỉnh để tạo
thành các quadtree;
3. Sinh hai số ngẫu nhiên a, b (0  a, b < L);
4. Dịch các quatree lần lượt theo tọa độ x và tọa độ y bởi đại lượng a và b;
5. return quadtrees;
6. END

Thuật toán 3.8. CalculateMatrix (sq: square, f, c)


Đầu vào: sq, f, c lần lượt là hình vuông, các hằng số cho trước.
1. BEGIN
2. Portals = sq.getPortals();
3. Crossing = doCrosings(Portals, sq);
4. for i := 0 to Crosings.getSize() do
5. Tìm trong tableMatrix những hành trình bộ phận thỏa crossing hiện tại.
6. Kết nối chúng để tạo thành một hành trình bộ phận mới.
7. if (hành trình này là hành trình–(clogn/ε, flogn/ε))
8. Lưu trữ vào trong tableMatrix;
9. end for
10. END

Thuật toán 3.9. DynamicProgramming (squareMatrix: q, f, c)


Đầu vào: squareMatrix là một tập các quadtree
Đầu ra: Biến ma trận toàn cục lưu trữ các hành trình (clog n/ε, flog n/ε).
1. BEGIN
2. leaves = q.leaves();
3. squares = q.getSquares();
4. for i := 0 to leaves.getSize() do
5. calculateMatrix(leaves[i], f, c);
6. end for
7. for i:= 0 to squares.getSize() do
8. calculateMatrix(squares[i], f, c);
9. end for
10. return tableMatrix;
11. END

3.1.2 Kết quả thực nghiệm

Để đánh giá hiệu quả của thuật toán, hai thực nghiệm được tiến hành. Dữ liệu trong thực
nghiệm đầu tiên bao gồm các file dữ liệu nhỏ trong bộ dữ liệu ngẫu nhiên từ 1 đến 3 và bộ dữ

47
liệu thực 2. Thực nghiệm thứ hai được tiến hành với các file dữ liệu lớn trong bộ dữ liệu thực
1 và bộ dữ liệu ngẫu nhiên 3. Đối với các file dữ liệu nhỏ, lời giải tối ưu từ thuật toán đúng
cho phép ta đánh giá chính xác hiệu quả của các thuật toán. Đối với các file dữ liệu lớn, khi
mà lời giải tối ưu chưa được biết đến, hiệu quả của các thuật toán chỉ được đánh giá một cách
tương đối.

Các thuật toán được sử dụng trong các thực nghiệm gồm thuật toán của Blum et al.
(BA), Goemans et al. (GKA), Archer et al. (AA), Chauhuri et al. (KA) và Arora et al. (AK).
Đối với thuật toán của Arora et al., chúng tôi thực thi thuật toán cận tỷ lệ (1 + ε) với ε > 0 cho
các file dữ liệu thỏa không gian euclidean và thuật toán cận tỷ lệ 11.65 cho các file dữ liệu
phi euclidean. Ta ký hiệu: LB, L và T lần lượt là cận dưới, độ trễ lời giải và thời gian chạy
chạy tính bằng phút của các thuật toán. Trong các bảng, các giá trị của các cột là kết quả của
các thuật toán gần đúng bao gồm cận tỷ lệ p, LB và T. Trong các bảng từ 3.1 đến 3.2, cận tỷ
lệ p  L / OPT (OPT là lời giải tối ưu có được từ thuật toán đúng trong chương 2). Trong các
bảng 3.3 và 3.4, do chưa biết lời giải tối ưu của các file dữ liệu lớn nên chúng ta sử dụng cận
tỷ lệ như sau   L f A (fA là cận dưới của giá trị tối ưu được lấy từ Archer et al. [1]) và cũng
không đánh giá chất lượng của cận dưới. Do không có cận dưới nên trong các Bảng thực
nghiệm, thuật toán AK không có giá trị LB. Kết quả thực nghiệm của thuật toán AA trong
Bảng 3.4 được lấy từ [1].

3.1.2.1 Thực nghiệm các file dữ liệu nhỏ

Mỗi file dữ liệu được thực thi 10 lần cho tất cả các thuật toán. Kết quả thực nghiệm được
trình bày trong Bảng 3.1 và 3.2 là các kết quả trung bình của 10 lần chạy. Hình 3.5 đến 3.7
biểu diễn cận tỷ lệ, cận dưới, và thời gian chạy trung bình trong mỗi bộ dữ liệu của từng thuật
toán.

Hình 3.5 cho thấy cận tỷ lệ thực nghiệm của các thuật toán tốt hơn rất nhiều so với
cận tỷ lệ lý thuyết. Trong đó, thuật toán AK và KA là hai thuật toán có cận tỷ lệ tốt nhất và
đưa ra lời giải cạnh tranh với nhau. Tuy nhiên, thuật toán AK hiệu quả hơn đối với các file dữ
liệu euclidean. Thuật toán BA có cận tỷ lệ tồi nhất trong số các thuật toán gần đúng. Cận tỷ lệ
của thuật toán GK nhỏ hơn một chút so với cận tỷ lệ của thuật toán AA.

Từ Hình 3.6 có thể thấy rằng giá trị cận dưới đạt được từ thuật toán KA tốt hơn giá trị
cận dưới đạt được từ các thuật toán gần đúng còn lại. Tuy nhiên, giá trị cận dưới tốt nhất thu

48
4
BA
3 GKA
p 2 AA
1 AK
KA
0
Bộ dữ liệu thực 2 Bộ dữ ngẫu nhiên 1 Bộ dữ ngẫu nhiên 2 Bộ dữ ngẫu nhiên 3
(TPR-50-Rx)

Hình 3. 5 Cận tỷ lệ thực nghiệm trung bình của các thuật toán đối với các bộ dữ liệu nhỏ

0.8
0.6 BA
LB GKA
0.4
AA
0.2 AK
0
Bộ dữ liệu thực 2 Bộ dữ ngẫu nhiên 1 Bộ dữ ngẫu nhiên 2 Bộ dữ ngẫu nhiên 3
(TPR-50-Rx)

Hình 3. 6 Cận dưới trung bình của các thuật toán đối với các bộ dữ liệu nhỏ

0.2
BA
GKA
T
0.1 AA
KA
AK
0
Bộ dữ liệu thực 2 Bộ dữ ngẫu nhiên 1 Bộ dữ ngẫu nhiên 2 Bộ dữ ngẫu nhiên 3
(TPR-50-Rx)

Hình 3. 7 Thời gian chạy trung bình của các thuật toán đối với các bộ dữ liệu nhỏ

6
BA
4 GKA
p AA
2 AK
KA
0
Bộ dữ liệu ngẫu nhiên 3
Bộ dữ liệu thực 1
(TPR-100-Rx)

Hình 3. 8 Cận tỷ lệ trung bình của các thuật toán đối với các bộ dữ liệu lớn

49
8
BA
6 GKA
T 4 AA
2 KA
0 AK
Bộ dữ liệu ngẫu nhiên 3 Bộ dữ liệu thực 1
(TPR-100-Rx)

Hình 3. 9 Thời gian chạy trung bình của các thuật toán đối với các bộ dữ liệu lớn

được còn xa so với giá trị hàm mục tiêu của lời giải tối ưu khi mà giá trị cận dưới trung bình
chỉ bằng 0.65 lần so với giá trị tối ưu.

Hình 3.7 cho thấy thời gian chạy của các thuật toán BA, GKA và AA tốt hơn so với
thuật toán KA và AK, và thời gian chạy của các thuật toán AA là tốt nhất.

3.1.2.2 Thực nghiệm các file dữ liệu lớn

Mỗi file dữ liệu được thực thi 10 lần cho tất cả các thuật toán. Kết quả thực nghiệm được
trình bày trong Bảng 3.3 và 3.4 là các kết quả trung bình của 10 lần chạy. Hình 3.8 đến 3.9
biểu diễn cận dưới, cận tỷ lệ và thời gian chạy trung bình cho mỗi bộ dữ liệu của từng thuật
toán.

Từ Hình 3.8 nhận thấy rằng cận tỷ lệ thực nghiệm của các thuật toán gần đúng tốt hơn
rất nhiều so với cận tỷ lệ lý thuyết của chúng. Trong các thuật toán gần đúng, thuật toán KA
và AK vẫn đưa ra cận tỷ lệ tốt nhất. Trong một vài file dữ liệu, cận tỷ lệ tốt hơn thu được từ
thuật toán KA, tuy nhiên, trong một vài file dữ liệu khác thì thuật toán AK cho cận tỷ lệ tốt
hơn. Thuật toán BA vẫn là thuật toán kém hiệu quả khi cận tỷ lệ thu được từ thuật toán này là
tồi nhất. Thuật toán GKA đưa ra cận tỷ lệ nhỉnh hơn so với thuật toán AA.

Hình 3.9 cho biết thuật toán BA và GKA có thời gian chạy tốt hơn so với thuật toán
AK và KA. Tuy nhiên, thời gian chạy của các thuật toán trên là lớn khi kích thước bài toán từ
200 đỉnh trở lên. Bởi vậy, các thuật toán này chỉ nên áp dụng cho các bài toán với kích thước
nhỏ hơn 200 đỉnh. Trong khi đó, thời gian chạy thuật toán AA trong những trường hợp này là
chấp nhận được.

50
Bảng 3. 1 Kết quả thực nghiệm các thuật toán trong các bộ dữ liệu nhỏ

Bộ dữ liệu File dữ liệu OPT BA GKA KA AA AK


LB p 1 T1 LB p 2 T2 LB p 3 T3 LB p 4 T4 p 5 T5
eil51 6140 0.60 3.01 0.10 0.60 1.33 0.10 0.64 1.20 0.13 0.56 1.33 0.09 1.20 0.18
eil76 5894 0.60 3.10 0.16 0.60 1.37 0.18 0.64 1.21 0.18 0.58 1.37 0.10 1.19 0.15
st70 7801 0.60 3.11 0.10 0.60 1.38 0.10 0.60 1.22 0.10 0.57 1.38 0.08 1.22 0.15
rat195 18058 0.64 3.04 0.11 0.64 1.37 0.11 0.64 1.21 0.12 0.58 1.39 0.08 1.23 0.16
kroA100 239680 0.60 3.01 0.09 0.60 1.36 0.10 0.65 1.25 0.10 0.57 1.38 0.09 1.25 0.15
kroB100 245999 0.55 3.12 0.10 0.55 1.35 0.10 0.62 1.21 0.12 0.53 1.35 0.07 1.21 0.13
Bộ dữ liệu
kroC100 1122890 0.60 3.10 0.10 0.60 1.31 0.10 0.64 1.20 0.12 0.57 1.33 0.08 1.22 0.14
thực 1
berlin52 1372572 0.58 3.07 0.14 0.58 1.30 0.15 0.65 1.30 0.18 0.55 1.30 0.10 1.27 0.16
pr76 1122891 0.54 3.08 0.09 0.54 1.32 0.11 0.60 1.30 0.12 0.51 1.35 0.09 1.30 0.15
tsp225 27523 0.55 3.10 0.12 0.55 1.31 0.13 0.60 1.25 0.15 0.50 1.31 0.11 1.25 0.17
tss225 1138068 0.52 3.12 0.12 0.52 1.31 0.12 0.63 1.30 0.13 0.50 1.33 0.09 1.28 0.14
Lin105 140450 0.61 3.15 0.11 0.61 1.32 0.11 0.64 1.23 0.13 0.60 1.32 0.08 1.27 0.15
Trung bình 0.58 3.08 0.11 0.58 1.34 0.12 0.63 1.24 0.13 0.55 1.35 0.09 1.24 0.15
test 1 8105 0.61 3.23 0.11 0.61 1.36 0.12 0.65 1.18 0.15 0.58 1.36 0.09 1.18 0.16
test 2 9248 0.62 3.24 0.13 0.62 1.31 0.14 0.67 1.21 0.15 0.55 1.34 0.10 1.23 0.15
test 3 8584 0.60 3.20 0.13 0.60 1.32 0.13 0.60 1.23 0.13 0.57 1.32 0.11 1.21 0.14
test 4 9240 0.57 3.14 0.12 0.57 1.34 0.13 0.64 1.26 0.15 0.52 1.34 0.12 1.24 0.16
test 5 8097 0.58 3.24 0.15 0.58 1.32 0.16 0.61 1.21 0.18 0.53 1.35 0.12 1.22 0.15
Bộ dữ liệu
ngẫu nhiên 1 test 6 9490 0.55 3.25 0.11 0.55 1.33 0.11 0.62 1.29 0.12 0.51 1.33 0.09 1.29 0.16
test 7 8450 0.56 3.21 0.12 0.56 1.32 0.12 0.64 1.27 0.12 0.53 1.32 0.10 1.25 0.15
test 8 8426 0.57 3.24 0.11 0.57 1.31 0.11 0.60 1.14 0.13 0.54 1.34 0.08 1.14 0.15
test 9 8987 0.54 3.43 0.12 0.54 1.30 0.13 0.60 1.20 0.15 0.52 1.33 0.12 1.22 0.14
test 10 9705 0.55 3.23 0.13 0.55 1.31 0.14 0.58 1.25 0.18 0.54 1.31 0.11 1.25 0.17
Trung bình 0.58 3.24 0.12 0.58 1.32 0.13 0.62 1.22 0.15 0.54 1.33 0.10 1.22 0.15
test 1 9526 0.62 3.24 0.11 0.62 1.34 0.12 0.64 1.27 0.13 0.60 1.36 0.11 1.21 0.15
test 2 8827 0.61 3.20 0.10 0.61 1.38 0.10 0.65 1.21 0.10 0.58 1.38 0.08 1.21 0.16
test 3 9440 0.60 3.25 0.14 0.60 1.36 0.15 0.61 1.16 0.17 0.57 1.38 0.11 1.20 0.17
test 4 8539 0.57 3.20 0.12 0.57 1.30 0.12 0.64 1.20 0.13 0.55 1.30 0.10 1.20 0.15

Bộ dữ liệu test 5 8321 0.59 3.21 0.11 0.59 1.48 0.12 0.61 1.23 0.13 0.57 1.48 0.10 1.21 0.17
ngẫu nhiên 2 test 6 8327 0.57 3.23 0.10 0.57 1.32 0.10 0.65 1.24 0.10 0.55 1.35 0.09 1.24 0.16
test 7 8300 0.56 3.21 0.08 0.56 1.31 0.08 0.64 1.25 0.10 0.54 1.31 0.07 1.25 0.14
test 8 9520 0.55 3.23 0.09 0.55 1.34 0.09 0.62 1.27 0.10 0.53 1.34 0.07 1.27 0.16
test 9 9759 0.58 3.22 0.11 0.58 1.32 0.12 0.61 1.25 0.17 0.55 1.35 0.08 1.28 0.14
test 10 8782 0.57 3.21 0.13 0.57 1.39 0.15 0.57 1.27 0.17 0.54 1.39 0.10 1.27 0.13

Trung bình 0.58 3.22 0.11 0.58 1.35 0.12 0.62 1.24 0.13 0.56 1.36 0.09 1.23 0.15

51
Bảng 3. 2 Kết quả thực nghiệm các thuật toán trên bộ dữ liệu ngẫu nhiên 3 (TPR-50-Rx)

BA GKA KA AA AK
Bộ dữ liệu
OPT
ngẫu nhiên 3
LB p1 T1 LB p2 T2 LB p3 T3 LB p4 T4 p5 T5
TRP-50-R1 12198 0.57 3.21 0.15 0.57 1.32 0.17 0.65 1.28 0.18 0.55 1.32 0.10 1.28 0.16
TRP-50-R2 11621 0.61 3.23 0.16 0.61 1.34 0.16 0.65 1.21 0.17 0.58 1.34 0.10 1.21 0.17
TRP-50-R3 12139 0.64 3.24 0.17 0.64 1.32 0.18 0.67 1.30 0.19 0.58 1.32 0.12 1.30 0.18
TRP-50-R4 13071 0.63 3.22 0.18 0.63 1.35 0.19 0.63 1.28 0.21 0.60 1.35 0.12 1.30 0.20
TRP-50-R5 12126 0.57 3.21 0.19 0.57 1.33 0.20 0.62 1.27 0.23 0.55 1.33 0.14 1.22 0.22
TRP-50-R6 12684 0.58 3.20 0.15 0.58 1.37 0.15 0.65 1.28 0.20 0.55 1.37 0.12 1.16 0.20
TRP-50-R7 11176 0.62 3.21 0.14 0.62 1.32 0.14 0.67 1.26 0.16 0.59 1.39 0.12 1.16 0.16
TRP-50-R8 12910 0.60 3.23 0.14 0.60 1.33 0.15 0.64 1.27 0.17 0.57 1.35 0.10 1.17 0.18
TRP-50-R9 13149 0.60 3.20 0.15 0.60 1.32 0.15 0.62 1.26 0.19 0.58 1.36 0.13 1.19 0.20
TRP-50-R10 12892 0.60 3.21 0.16 0.60 1.53 0.17 0.63 1.23 0.18 0.56 1.53 0.10 1.18 0.18
TRP-50-R11 12103 0.61 3.21 0.13 0.61 1.37 0.13 0.67 1.30 0.19 0.57 1.37 0.09 1.30 0.18
TRP-50-R12 10633 0.65 3.20 0.14 0.65 1.36 0.15 0.68 1.33 0.18 0.59 1.36 0.10 1.33 0.19
TRP-50-R13 12115 0.59 3.18 0.16 0.59 1.38 0.16 0.64 1.26 0.23 0.56 1.40 0.11 1.23 0.21
TRP-50-R14 13117 0.60 3.21 0.12 0.60 1.37 0.14 0.67 1.28 0.17 0.58 1.37 0.12 1.14 0.22
TRP-50-R15 11986 0.55 3.22 0.13 0.55 1.33 0.13 0.65 1.20 0.17 0.53 1.36 0.12 1.25 0.18
TRP-50-R16 12138 0.60 3.21 0.12 0.60 1.35 0.14 0.67 1.29 0.19 0.58 1.35 0.11 1.29 0.20
TRP-50-R17 12176 0.62 3.12 0.14 0.62 1.32 0.14 0.64 1.20 0.18 0.60 1.35 0.12 1.20 0.16
TRP-50-R18 13357 0.60 3.12 0.15 0.60 1.36 0.16 0.65 1.26 0.19 0.58 1.36 0.13 1.25 0.17
TRP-50-R19 11430 0.60 3.12 0.15 0.60 1.37 0.17 0.63 1.32 0.19 0.57 1.37 0.14 1.30 0.20
TRP-50-R20 11935 0.64 3.13 0.16 0.64 1.38 0.18 0.67 1.26 0.21 0.60 1.38 0.15 1.26 0.21
Trung bình 0.60 3.19 0.15 0.60 1.36 0.16 0.65 1.27 0.19 0.57 1.37 0.12 1.24 0.19

52
Bảng 3. 3 Kết quả thực nghiệm các thuật toán trên bộ dữ liệu ngẫu nhiên 3 (TPR-100-Rx)

BA GKA KA AA AK
Bộ dữ liệu
ngẫu nhiên 3
p1 T1 p2 T2 p3 T3 p4 T4 p5 T5
TRP-100-R1 5.45 2.27 2.95 2.35 2.70 3.11 2.95 0.54 2.75 3.35
TRP-100-R2 5.21 2.25 3.12 2.31 2.81 2.86 3.15 0.51 2.70 3.31
TRP-100-R3 5.48 2.24 2.85 2.33 2.80 2.90 3.11 0.52 2.80 3.32
TRP-100-R4 5.43 2.26 2.87 2.32 2.75 2.86 3.05 0.47 2.82 3.31
TRP-100-R5 5.35 2.21 2.89 2.38 2.83 3.13 2.89 0.48 2.76 3.36
TRP-100-R6 5.42 2.22 2.83 2.30 2.77 3.23 2.83 0.52 2.70 3.30
TRP-100-R7 5.42 2.20 2.98 2.38 2.81 3.00 2.98 0.53 2.85 3.35
TRP-100-R8 5.41 2.22 2.89 2.31 2.75 3.17 2.89 0.52 2.70 3.33
TRP-100-R9 5.35 2.24 3.02 2.32 2.81 2.80 3.12 0.49 2.85 3.30
TRP-100-R10 5.41 2.27 3.05 2.34 2.80 2.91 3.05 0.51 2.80 3.31
TRP-100-R11 5.35 2.28 2.98 2.36 2.75 3.16 2.98 0.52 2.75 3.32
TRP-100-R12 5.42 2.26 3.01 2.34 2.71 3.01 3.01 0.53 2.62 3.31
TRP-100-R13 5.42 2.27 3.12 2.35 2.70 2.95 3.12 0.51 2.67 3.36
TRP-100-R14 5.51 2.25 2.84 2.33 2.75 3.16 2.84 0.49 2.70 3.30
TRP-100-R15 5.55 2.21 3.03 2.38 2.60 2.82 3.03 0.51 2.57 3.38
TRP-100-R16 5.55 2.28 3.08 2.36 2.85 2.95 3.08 0.52 2.95 3.32
TRP-100-R17 5.41 2.21 3.14 2.38 2.85 3.01 3.14 0.53 2.97 3.33
TRP-100-R18 5.42 2.22 2.85 2.31 2.47 3.05 3.08 0.50 2.32 3.34
TRP-100-R19 5.42 2.24 3.07 2.32 3.07 2.98 3.21 0.51 3.07 3.31
TRP-100-R20 5.42 2.23 3.05 2.30 2.85 2.96 3.11 0.52 2.98 3.32
Trung bình 5.42 2.24 2.98 2.34 2.77 3.00 3.03 0.51 2.77 3.33

53
Bảng 3. 4 Kết quả thực nghiệm các thuật toán trên bộ dữ liệu thực 1

Bộ dữ liệu
BA GKA KA AA AK
thực 1
p1 T1 p2 T2 p3 T3 p4 T4 p5 T5
berlin52 5.16 0.14 3.12 0.15 3.12 0.17 3.36 0.02 2.95 0.15
bier127 5.01 5.12 2.98 5.21 2.66 7.93 3.14 0.07 2.78 8.10
ch130 5.17 5.12 2.90 5.54 2.85 7.93 3.07 0.18 2.80 8.12
ch150 5.72 6.32 2.72 6.37 2.56 8.23 2.72 0.23 2.65 8.28
eil101 5.27 1.45 3.17 1.55 2.85 2.63 3.17 0.05 3.15 3.10
eil51 5.34 0.10 3.30 0.12 2.90 0.17 3.34 0.01 2.76 0.23
eil76 5.24 0.08 3.20 0.10 3.22 0.12 3.24 0.02 3.12 0.18
kroA100 5.25 2.50 3.00 2.57 2.60 3.63 3.02 0.06 3.00 4.02
kroA150 5.07 9.35 2.80 9.85 2.86 11.70 3.07 0.15 2.72 15.80
kroB100 5.01 2.21 2.80 2.45 2.57 3.42 2.88 0.03 2.57 4.05
kroB150 5.89 9.23 2.80 9.75 2.77 12.10 2.89 0.11 2.67 17.50
kroB200 5.85 23.90 2.79 25.30 2.93 30.60 2.87 0.74 2.70 41.60
kroC100 5.79 2.14 2.64 2.35 2.37 3.25 2.79 0.08 2.50 3.45
kroD100 5.14 2.21 3.10 2.52 3.08 3.40 3.14 0.07 2.70 3.58
kroE100 5.17 2.15 2.85 2.75 2.34 3.08 3.01 0.03 2.49 3.32
lin105 5.84 2.12 2.75 2.35 2.85 3.36 2.85 0.08 2.67 3.46
pr107 5.55 2.25 2.40 2.85 2.38 3.30 2.40 2.07 2.24 3.45
pr124 5.28 5.65 3.28 5.85 3.28 6.23 3.28 0.13 3.10 6.75
pr76 5.97 0.07 2.97 0.08 2.97 0.1 2.89 0.08 2.35 0.23
rat99 5.89 2.01 2.89 2.17 2.77 2.31 2.97 0.09 2.64 2.65
rd100 5.97 2.65 2.97 2.91 2.54 3.03 2.92 0.01 2.63 3.74
st70 5.92 0.41 2.92 0.45 2.92 0.55 2.94 0.16 2.68 0.75
Trung bình 5.48 3.96 2.93 4.24 2.79 5.33 3.00 0.20 2.72 6.48

54
3.2 Thuật toán dựa trên phƣơng pháp Subgradient

Nhận thấy rằng các thuật toán gần đúng được đề xuất để giải bài toán MLP [1, 6, 9, 18] trình
bày ở trên, đều bắt đầu từ tập các lời giải của bài toán k-MST hoặc k-troll. Các thuật toán [1,
6, 18] bắt đầu từ tập các lời giải của bài toán k-MST, còn thuật toán của K. Chaudhuri et al.
lại bắt đầu từ tập các lời giải của bài toán k-troll. Trong [9], K. Chaudhuri et al. chỉ ra rằng sử
dụng tập các lời giải của bài toán k-troll cho cận tỷ lệ tốt hơn so với việc sử dụng tập các lời
giải của bài toán k-MST. Thực vậy, thuật toán của K. Chaudhuri et al. đưa ra cận tỷ lệ tốt
nhất cho bài toán MLP. Nhắc lại, thuật toán của K. Chaudhuri et al. bao gồm ba bước: Đầu
tiên, thuật toán tìm một tập các lời giải của bài toán k-troll (k = 2, 3, …, n), mà mỗi lời giải là
một cây khung đi qua k đỉnh gọi là k-tree (Tk). Sau đó, thuật toán chuyển các Tk thành các
hành trình Euler Ck (k = 2, ..., n) thỏa mãn điều kiện C(Ck) ≤ β×C(Tk) với β =2 (ở đây ký hiệu
C(Ck) và C(Tk) lần lượt là chi phí của Ck và Tk). Cuối cùng, sử dụng kỹ thuật của Goeman et
al. [18] kết nối các hành trình Euler để thu được lời giải bài toán MLP với độ trễ không quá
n
3.59  (  / 2) C (Ck ) , từ đó suy ra thuật toán có cận tỷ lệ tương ứng là 3.59. Về mặt trực
k 2

quan có thể nhận thấy là: Nếu như tìm được hành trình C k' có chi phí nhỏ hơn chi phí của
hành trình Ck, ta có thể hy vọng giảm được cận tỷ lệ của thuật toán giải bài toán MLP.

Trong mục này, chúng tôi đề xuất một thuật toán dựa trên phương pháp Subgradient.
Thuật toán vẫn sử dụng một tập các lời giải của bài toán k-troll như đầu vào. Giả sử, chúng
tôi có tập các lời giải này, trong đó mỗi lời giải là một k-tree. Đối với mỗi k-tree, phương
pháp subgradient được sử dụng để biến đổi nó thành một hành trình có chi phí nhỏ hơn chi
phí của hành trình Euler tương ứng. Cuối cùng, kết nối các hành trình này để thu được lời
giải bài toán MLP. Chúng tôi tiến hành thực nghiệm trên các bộ dữ liệu thực nghiệm để đưa
ra những đánh giá về hiệu quả của thuật toán đề xuất.

3.2.1 Lƣợc đồ thuật toán

Trước tiên, chúng tôi đưa ra ba định lý để chỉ ra hướng dịch chuyển, độ dài bước dịch chuyển
tại mỗi vòng lặp đảm bảo phương pháp subgradient hội tụ đến một hành trình có chi phí nhỏ
hơn chi phí của hành trình Euler. Sau đó, các kết quả lý thuyết này là cơ sở để xây dựng thuật
toán giải bài toán MLP. Không làm mất tính tổng quát, ta chọn ngẫu nhiên một k-tree trong
tập các k-trees (k = 2, 3, …, n) để mô tả phương pháp subgradient trong quá trình biến đổi nó
thành một hành trình. Để thuận tiện cho việc trình bày thuật toán, ta nhắc lại một số khái

55
niệm và định nghĩa. Trước hết, theo định nghĩa, k-tree là một cây khung đi qua k đỉnh, có một
đỉnh gốc v1 và một đỉnh cuối vend. Gọi V ' = (v1, v2, …, vk = vend) là tập k đỉnh trong k-tree này.
Gọi U là một tập các cây k-tree được tạo bởi k đỉnh trong V' có đỉnh gốc v1 và một đỉnh cuối
vend và T* là cây khung có chi phí nhỏ nhất trong U. Tiếp đến, theo định nghĩa, k-tour trên tập
đỉnh V' là một hành trình đi qua k đỉnh từ đỉnh v1 đến vend. Gọi I là một tập các k-tour đi qua k
đỉnh trong V' từ v1 đến vend và Ttour
*
là hành trình có chi phí nhỏ nhất trong tập I. Với một cây

k-tree (ký hiệu là Tr)  U, gọi C(Tr) là chi phí của nó và d(vi, Tr) là bậc của đỉnh vi trong Tr.
Đối với vectơ thực k chiều τ = (τ1, τ2, …, τk), ta định nghĩa C( cij , Tr) là chi phí của k-tree hoặc

k-tour Tr được tính theo cij = cij + τi + τj. Theo định nghĩa, khi Tr là một cây k-tree, chi phí
của nó được tính bởi công thức:
k
C (c ij , Tr )  C (cij , Tr )    i d (vi , Tr ) . (3.1)
i 1

Còn nếu Tr là một k-tour thì chi phí của nó được tính bởi công thức:
k 1
C (c ij , Tr )  C (cij , Tr )   1   k  2   i . (3.2)
i 2

Do mỗi k-tour đều là một cây k-tree nên ta có:


min(C (cij , Tr ))  min(C (cij , Tr )) . (3.3)
TrU TrI

*
Do Ttour là hành trình tối ưu và từ (3.2) và (3.3), suy ra:
k 1
min C (c ij , Tr )  C (cij , Ttour
*
)  1   k  2   i . (3.4)
TrU i 2

*
Để ngắn gọn ta viết C(Tr) thay cho C(cij, Tr) và C (Ttour
*
) thay cho C (cij , Ttour ) . Từ (3.1) và

(3.4), ta có:
n k 1
min{(C (Tr )    i d (vi , Tr )}  C (Ttour
*
)  1   k  2   i , (3.5)
TrU i 1 i 2

k 1
min{C (Tr )    i ( d (vi , Tr )  2)   1 ( d (vi , Tr )  1)   k ( d (vi , Tr )  1)}  C (Ttour
*
). (3.6)
TrU i 2

Xét hàm w() được xác định như sau:


k 1
w( )  min{C (Tr )   1 ( d (vi , Tr )  1)   k ( d (vi , Tr )  1)    i ( d (vi , Tr )  2)} . (3.7)
TrU i2

Đối với một cây Tr, ta định nghĩa vectơ vT = (d(v1, Tr) − 1, d(v2, Tr) − 2, d(v3, Tr) − 2, ...,
d(vk, Tr) − 1) và viết lại hàm w() dưới dạng:
w( )  min{C (Tr )   vT } ,
T U

56
trong đó,  vT là tích vô hướng của hai vectơ  và vT.

Bất đẳng thức (3.6) cho thấy mỗi w(τ) đều là cận dưới cho C( Ttour
*
) và ta quan tâm đến tìm τ
đem lại giá trị lớn nhất cho w(τ), nghĩa là quan tâm đến lời giải của bài toán
max{w( )} .

Việc tìm τ đem lại giá trị lớn nhất cho w(τ) đồng nghĩa với việc ép bậc của tất cả các đỉnh vi
(vi ≠ v1 và vend) là 2 và bậc của đỉnh v1 và vend là 1. Về mặt trực quan, ta sẽ tìm một vectơ τ để
k-tree giống với một hành trình nhất đồng thời chi phí của nó phải bị chặn trên bởi chi phí của
*
Ttour .

M. Held et al. [25] đưa ra lý thuyết cơ sở cho thuật toán lặp theo phương pháp Subgradient để
tìm max{w( )} . Thuật toán này biến đổi k−tree thành một chu trình, mà mỗi đỉnh trong chu

trình đều có bậc là 2. Thuật toán của chúng tôi phỏng theo thuật toán của M. Held et al. Tuy
nhiên, chúng tôi cải biên thuật toán để thay vì biến đổi k−tree thành chu trình, thuật toán cần
biến nó thành một hành trình. Thuật toán lặp bắt đầu từ vector τ(0) tiến hành xây dựng dãy
vector {τ(m), m = 0, 1, …, } theo công thức sau:
τ(m+1) = τ(m) + tm d(m) . (3.8)
với d(m) là hướng dịch chuyển từ τ(m) và tm là độ dài bước dịch chuyển. Polytak et al. [35] chỉ
ra rằng dãy {w(τ(m))} sẽ hội tụ đến max{w( )} khi d(m) là subgradient của w tại τ(m) và dãy

{tm} thỏa các điều kiện sau:



tm  0 và  tm  , tm  0 m .
m 1

Với mỗi vectơ τ, ký hiệu T*(τ) là cây khung đem lại giá trị nhỏ nhất cho vế phải của (3.7), khi
đó:
w(τ) = C(T*(τ)) + τ.vT*(τ) . (3.9)
Giả sử  là vectơ tùy ý, ta có
L(T*(τ)) +  .vT*(τ) ≥ min{C (Tr ) +  .vT } = w(  ). (3.10)
T U

Từ (3.9) và (3.10) suy ra


 .vT*(τ) – τ.vT*(τ) ≥ w(  ) – w(τ). (3.11)
Phân tích trên đã chứng minh kết quả sau đây:
Định lý 3.1. Đối với vectơ  bất kỳ, ta có
(  – τ).vT*(τ) ≥ w(  ) – w(τ). (3.12)
Siêu phẳng qua τ với vectơ pháp tuyến là vT*(τ) sẽ xác định một nửa mặt phẳng

57
{ : (   )vT * ( )  0} chứa tất cả các điểm  sao cho w(  ) ≥ w(τ). Bất đẳng thức (3.12) của

định lý 3.1 cho thấy vT*(τ) là subgradient của hàm w tại τ.

Đinh lý 3.2. Giả sử  là vector sao cho w(  ) ≥ w(τ) và

2(w( ) – w( ) )
0t  ,
||v * ||2
T ( )

trong đó || . || ký hiệu chuẩn Euclidean, khi đó


||  – (τ + tvT*(τ))|| < ||  – τ||,
nghĩa là điểm τ + t.vT*(τ) gần  hơn τ.
Chứng minh: Ta có
||  – (τ + t.vT*(τ))||2 = ||  – τ||2 – 2t(  – τ).vT*(τ) + t2||vT*(τ)||2 .
= ||  – τ||2 – t[2(  – τ).vT*(τ) – t||vT*(τ)||2] .
≤ ||  – τ||2 – t[2(w(  ) – w(τ)) – t||vT*(τ)||2] ≤ ||  – τ||2.
Định lý 3.2 chỉ ra giới hạn cho độ dài bước dịch chuyển tm. Định lý 3.3 sau đây sẽ chỉ ra cách
lựa chọn độ dài bước dịch chuyển tm đảm bảo sự hội tụ của dãy{w(τ(m))}.

Định lý 3.3. Ký hiệu w = max w( ) . Gọi {τ(m)} là dãy xấp xỉ đươc tính theo công thức lặp:

τ ( m1)  τ ( m)  tm v , (3.13)
T* (τ ( m ) )

w  w(τ ( m ) )
với tm  m ( ), (3.14)
||v ( m ) ||2
T* (τ )

thì nếu  ε, 0 < ε < λm ≤ 2 thì {τ(m)} hoặc là chứa một điểm τ(h)  P( w ) hoặc hội tụ đến một
điểm trên biên của P( w)  { : C (T * ( ( m) ))   v  w m}.
T * ( ( m) )

Để chứng minh định lý, ta cần sử dụng kết quả trong [34] sau đây: Gọi {ym} là dãy các điểm
ngoài tập P( w ). Dãy {ym} được gọi là Féjer-monotone của P( w ) nếu với mọi x ϵ P( w ) thì ym
≠ ym+1 và |ym – x| ≥ |ym + 1 – x| (m = 1, …, l). Trong [34], T. Motzkin et al. chỉ ra rằng bất kỳ
dãy nào là Féjer-monotone của P( w ) đều hội tụ.
Chứng minh. Để chứng minh định lý ta chỉ cần xét tình huống khi dãy {τ(m)} không chứa
một điểm nào thuộc tập P( w ). Khi đó, theo định lý 3.2, dãy{τ(m)} là một Féjer-monotone của
P( w ) và vì thế nó là dãy hội tụ. Từ đó suy ra ||τ(m+1) – τ(m)||  0, m  +. Theo (3.13) và
(3.14) thì

58
Thuật toán 3.10. Thuật toán SGA
Đầu vào: Kn, cij, v1, e lần lượt là đồ thị đầy đủ n đỉnh, ma trận chi phí, đỉnh gốc và giá trị
ngưỡng cho trước.
Đầu ra: Hành trình T là lời giải bài toán MLP.
1. For k = 2 to n do
2. (Tk, vend) = k-troll(Kn, v1, cij); //vend ϵ Tk;
3. (Ttour, UB) = SGM(Tk, v1, vend, l);
4. L.add(Ttour); //L là danh sách lưu trữ Ttour
5. end for
6. T = Kết nối các Ttour ϵ L theo thuật toán Goemans et al. [18];
7. return (T);

Thuật toán 3.11. Thuật toán SGM


Đầu vào: Tk, v1, t và l lần lượt là lời giải của bài toán k-troll của thuật toán K. Chaudhuri et
al., đỉnh gốc, đỉnh t và số lượng vòng lặp.
Đầu ra: Hành trình Ttour.
1. Initiate  (0)  (0, 0,...., 0) ;
2. Initiate λ = 2;
3. UB = double.Max; LB = 0; m = 0; Ttour = Ø;
4. if Tk is a tour then
5. return (Tk);
6. else
7. while e <  do
8. Tk' = MST-algorithm(Tk);
9. NLB = w( ( m) ) theo (3.7);
'
10. ( Ttour , UB) = Euler-tour-algorithm ( Tk' ) theo [37];
11. if NLB > LB then
12. LB = NLB;
13. end if
14. if NUB < UB then
15. UB = NUB;
'
16. Ttour = Ttour ;
17. end if
18. Update  ( m1) theo (3.13);
19. Update tm 1 theo (3.14);
20. m++;
21. λ = λ /2;
UB  LB
22. e  100% ;
LB
23. end while
24. end if
25. Return (Ttour, UB);

59
w  w(τ ( m ) )
||τ (m+1)
– τ || = m (
(m)
)  0, khi m  +,
||v ( m ) ||2
T* (τ )

từ đó suy ra, w  w(τ ( m) )  0 và do tính liên tục của w(.), suy ra w( lim ( m) )  w . Vậy điểm
m

tới hạn của {τ(m)} phải nằm trên biên của P( w ).

Rõ ràng, việc lựa chọn độ dài bước dịch chuyển tm đảm bảo chắc chắn {w(τ(m))} hội tụ đến w
chỉ ra trong định lý 3.3 đòi hỏi phải biết giá trị w . Tuy nhiên, giá trị chính xác của w là chưa
biết, bởi vậy, chúng tôi phải sử dụng ước lượng trên của w . Nếu một ước lượng trên của w
(UB) được sử dụng thì điều kiện Polyak có thể không được thực hiện, nếu dãy {λm} không
giảm dần về 0. Để làm được điều này, ban đầu chúng tôi thiết lập λ = 2, sau đó, giá trị λ được
giảm đi một nửa sau mỗi vòng lặp để đảm bảo dãy {λm} giảm dần về 0.

Bây giờ, chúng tôi sử dụng kết quả lý thuyết vừa trình bày như là cơ sở để xây dựng
thuật toán. Mã giả của thuật toán được trình bày chi tiết trong Thuật toán 3.10. Đầu tiên,
thuật toán K. Chauhuri et al. được sử dụng để thu được tập các k−tree (k = 2, 3, ..., n) có gốc
v1 và một đỉnh cuối vend. Sau đó, với mỗi k−tree (ký hiệu là Tk), thực hiện kiểm tra xem nó có
là một hành trình. Nếu nó là một hành trình thì ta thu được một hành trình tối ưu và thuật toán
dừng. Ngược lại, nếu tìm được bất kỳ một Tk không phải là một hành trình, thì cần biến đổi Tk
để thu được hành trình đi từ v1 đến vend. Việc này được thực hiện bằng Thuật toán 3.11. Ban
đầu, ta tính toán cận dưới của Ttour
*
theo (3.7) và cận trên UB là chi phí của một hành trình bất
kỳ từ v1 đến vend. Sau đó, ta sử dụng thuật toán tìm cây khung nhỏ nhất trong [37] cho các
đỉnh trong Tk để thu được cây khung nhỏ nhất Tk' . Sử dụng thuật toán trong [37] để chuyển
'
Tk' thành một hành trình ( Ttour ). Chi phí của hành trình này sẽ được so sánh với giá trị cận
trên hiện tại. Cận trên chỉ được cập nhập khi giá trị của nó lớn hơn chi phí của hành trình
đó. Tương tự như vậy, giá trị cận dưới mới (NLB) cũng được tính toán và nếu chi phí đó
lớn hơn giá trị cận dưới hiện tại thì cận dưới được cập nhập. Ở cuối vòng lặp, cập nhập t, τ
lần lượt theo (3.13) và (3.14). Thuật toán lặp lại cho đến khi  nhỏ hơn một ngưỡng cho trước.
Cuối cùng, các lời giải thu được từ Thuật toán 3.11 được kết nối để cho ra lời giải bài toán
MLP.

3.2.2 Kết quả thực nghiệm

Hai thực nghiệm được tiến hành trên các bộ dữ liệu. Dữ liệu được sử dụng trong thực nghiệm
đầu tiên bao gồm các file dữ liệu nhỏ trong bộ dữ liệu ngẫu nhiên từ 1 đến 3 và bộ dữ liệu

60
thực 2. Trong khi, dữ liệu được sử dụng trong thực nghiệm thứ hai bao gồm các file dữ liệu
lớn trong bộ dữ liệu ngẫu nhiên 3 và bộ dữ liệu thực 1. Trong cả hai thực nghiệm, giá trị
ngưỡng  của thuật toán là 3%.

Ta gọi KA, SGA lần lượt là thuật toán của K. Chaudhuri et al. [9] và thuật toán đề
xuất. Trong các Bảng, OPT là lời giải tối ưu; Li, pi, Ti (i = 1, …, 3) lần lượt là độ trễ của lời
giải, cận tỷ lệ và thời gian chạy tính theo phút của thuật toán KA, SGA và AA; cột gap3 được
n
UBk2  UBk1
tính theo công thức gap3 [%]   | | 100% ( UBk1 và UBk2 lần lượt là chi phí của
k 2 UBk1
hành trình Euler và chi phí của Ttour). Đối với các file dữ liệu nhỏ, khi mà lời giải tối ưu được
p2  p1
biết từ thuật toán đúng, thì gap4 [%] | | 100% , ngược lại, khi lời giải tối ưu của các
p1

L2  L1
file dữ liệu lớn chưa biết, thì gap4 [%] | | 100% . Chúng ta thấy rằng tiêu chí gap3
L1
được sử dụng để chỉ ra rằng các hành trình do phương pháp Subgradient tạo ra có chi phí nhỏ
hơn bao nhiêu % so với chi phí của các hành trình Euler và tiêu chí gap4 chỉ ra rằng sau khi
ghép nối các hành trình đó thì chúng ta sẽ giảm bao nhiêu % cận tỷ lệ cho thuật toán giải bài
toán MLP. Giá trị của gap3 và gap4 càng lớn thì chứng tỏ thuật toán SGA càng hiệu quả.

3.2.2.1 Thực nghiệm các file dữ liệu nhỏ

Mỗi file dữ liệu được thực thi 10 lần. Kết quả được mô tả trong Bảng 3.5 và 3.6 là kết quả

trung bình của 10 lần chạy thuật toán. Trong Bảng 3.7 đến 3.8, gap 3 , gap 4 , T lần lượt là giá

trị trung bình của gap3 , gap4 , T cho từng bộ dữ liệu trong Bảng 3.5 và 3.6.

Bảng 3.7 cho thấy, thuật toán đề xuất đưa ra các hành trình có chi phí nhỏ hơn so với
chi phí của các hành trình Euler ( gap 3 của tất cả các bộ dữ liệu là 16%). Khi kết nối các hành
trình thu được để tạo ra lời giải cho bài toán MLP thì cận tỷ lệ được phát triển so với cận tỷ lệ
của thuật toán K. Chaudhuri et al ( gap 4 của tất cả các bộ dữ liệu là 7.17%). Tuy nhiên, trong
một số trường hợp cận tỷ lệ không được giảm dù các hành trình này được sử dụng. Bởi vậy,
sử dụng các hành trình có chi phí nhỏ hơn để kết nối không luôn luôn đảm bảo thu được lời
giải có cận tỷ lệ tốt hơn cho bài toán MLP. Bảng 3.7 cũng cho thấy lời giải thu được từ các bộ
dữ liệu rất sát với lời giải tối ưu của bài toán MLP ( p 2 của các bộ dữ liệu là 1.15).

61
Bảng 3.8 cho thấy thời gian chạy của thuật toán SGA không tốt bằng thời gian chạy
của thuật toán KA bởi thuật toán SGA phải mất thêm thời gian để chạy thủ tục SGM.

3.2.2.2 Thực nghiệm các file dữ liệu lớn

Mỗi file dữ liệu được thực thi 10 lần. Kết quả được mô tả trong Bảng 3.9 và 3.10 là kết quả

trung bình của 10 lần chạy thuật toán. Trong Bảng 3.11 và 3.12, gap 3 , gap 4 , T lần lượt là giá

trị trung bình của gap3 , gap4 , T cho từng bộ dữ liệu trong Bảng 3.9 và 3.10.

Bảng 3.11 cho thấy thuật toán đề xuất đưa ra các hành trình có chi phí nhỏ hơn so với
chi phí của các hành trình Euler ( gap 3 của tất cả các bộ dữ liệu là 16.33%). Khi sử dụng các

hành trình thu được để tạo ra lời giải cho bài toán MLP thì cận tỷ lệ được phát triển ( gap 4 của
tất cả các bộ dữ liệu là 9.60%) so với cận tỷ lệ của thuật toán K. Chaudhuri et al.

Bảng 3.12 cho thấy thời gian chạy của thuật toán vẫn lớn hơn so với thời gian chạy
của thuật toán K. Chaudhuri et al.

62
Bảng 3. 5 Kết quả thực nghiệm cho các bộ dữ liệu nhỏ

KA SGA
Bộ dữ liệu File dữ liệu OPT
p1 T1 gap3[%] p2 gap4[%] T2
eil51 6140 1.20 0.13 16.5 1.02 15.0 0.22
eil76 5894 1.21 0.18 17.7 1.17 3.3 0.28
st70 7801 1.22 0.10 17.6 1.20 1.6 0.22
rat195 18058 1.21 0.12 13.3 1.16 4.1 0.23
kroA100 239680 1.25 0.10 13.1 1.23 1.6 0.20
kroB100 245999 1.21 0.12 14.1 1.08 10.7 0.22
Bộ dữ liệu thực 2
kroC100 1122890 1.20 0.12 16.6 1.12 6.7 0.21
berlin52 1372572 1.30 0.18 11.4 1.23 5.4 0.20
pr76 1122891 1.38 0.12 15.3 1.36 1.4 0.23
tsp225 27523 1.40 0.15 11.3 1.25 10.7 0.22
tss225 1138068 1.30 0.13 14.6 1.23 5.4 0.24
Lin105 140450 1.23 0.13 20.4 1.11 9.8 0.21
Trung bình 1.26 0.13 15.2 1.18 6.31 0.22
test 1 8105 1.18 0.15 18.2 1.11 5.9 0.25
test 2 9248 1.21 0.15 18.8 1.12 7.4 0.25
test 3 8584 1.23 0.13 22.2 1.12 8.9 0.23
test 4 9240 1.26 0.15 20.8 1.12 11.1 0.22
test 5 8097 1.21 0.18 19.0 1.15 5.0 0.22
Bộ dữ liệu ngẫu
test 6 9490 1.29 0.12 21.1 1.17 9.3 0.24
nhiên 1
test 7 8450 1.27 0.12 16.4 1.15 9.4 0.22
test 8 8426 1.14 0.13 16.3 1.14 0.0 0.21
test 9 8987 1.20 0.15 10.3 1.15 4.2 0.24
test 10 9705 1.25 0.18 13.1 1.07 14.4 0.23
Trung bình 1.22 0.15 17.6 1.13 7.57 0.23
test 1 9526 1.27 0.13 10.2 1.17 7.9 0.23
test 2 8827 1.21 0.10 13.1 1.13 6.6 0.20
test 3 9440 1.16 0.17 14.0 1.14 1.7 0.25
test 4 8539 1.20 0.13 16.6 1.16 3.3 0.23
test 5 8321 1.23 0.13 16.9 1.2 2.4 0.24
Bộ dữ liệu ngẫu
test 6 8327 1.24 0.10 19.1 1.17 5.6 0.23
nhiên 2
test 7 8300 1.25 0.10 18.4 1.2 4.0 0.24
test 8 9520 1.27 0.10 12.7 1.13 11.0 0.25
test 9 9759 1.25 0.17 17.5 1.15 8.0 0.22
test 10 8782 1.27 0.17 10.4 1.19 6.3 0.23
Trung bình 1.24 0.13 14.9 1.16 5.70 0.23

63
Bảng 3. 6 Kết quả thực nghiệm với bộ dữ liệu ngẫu nhiên 3 (TPR-50-Rx)
KA SGA
File dữ liệu OPT
p1 T1 gap3[%] p2 gap4[%] T2
TRP-50-R1 12198 1.28 0.18 19.4 1.26 1.56 0.25
TRP-50-R2 11621 1.21 0.17 23.8 1.18 2.48 0.26
TRP-50-R3 12139 1.30 0.19 15.3 1.14 12.31 0.25
TRP-50-R4 13071 1.28 0.21 13.1 1.17 8.59 0.27
TRP-50-R5 12126 1.27 0.23 15.5 1.11 12.60 0.28
TRP-50-R6 12684 1.28 0.20 15.6 1.11 13.28 0.25
TRP-50-R7 11176 1.26 0.16 12.1 1.05 16.67 0.26
TRP-50-R8 12910 1.27 0.17 19.0 1.09 14.17 0.27
TRP-50-R9 13149 1.26 0.19 17.0 1.17 7.14 0.25
TRP-50-R10 12892 1.23 0.18 17.9 1.10 10.57 0.26
TRP-50-R11 12103 1.30 0.19 16.2 1.15 11.54 0.24
TRP-50-R12 10633 1.33 0.18 13.8 1.20 9.77 0.26
TRP-50-R13 12115 1.26 0.23 16.6 1.22 3.17 0.25
TRP-50-R14 13117 1.28 0.17 17.4 1.17 8.59 0.26
TRP-50-R15 11986 1.20 0.17 13.6 1.14 5.00 0.27
TRP-50-R16 12138 1.29 0.19 19.0 1.25 3.10 0.27
TRP-50-R17 12176 1.20 0.18 14.3 1.15 4.17 0.26
TRP-50-R18 13357 1.26 0.19 13.5 1.10 12.70 0.25
TRP-50-R19 11430 1.32 0.19 16.2 1.14 13.64 0.26
TRP-50-R20 11935 1.26 0.21 15.8 1.12 11.11 0.25
Trung bình 1.27 0.19 16.26 1.16 9.11 0.26

Bảng 3. 7 Mô tả gap1 , gap 2 đối với các bộ dữ liệu nhỏ

Bộ dữ liệu SGA KA

gap 3 [%] gap 4 [%] p2 p1


Bộ dữ liệu thực 2 15.2 6.31 1.18 1.26
Bộ dữ liệu ngẫu nhiên 1 17.6 7.56 1.13 1.22
Bộ dữ liệu ngẫu nhiên 2 14.9 5.70 1.16 1.24
Bộ dữ liệu ngẫu nhiên 3 (TPR-50-Rx) 16.26 9.11 1.16 1.30
Trung bình 16.0 7.17 1.15 1.26

Bảng 3. 8 Mô tả T đối với các bộ dữ liệu nhỏ

KA SGA
Bộ dữ liệu
T1 T2
Bộ dữ liệu thực 2 0.13 0.22
Bộ dữ liệu ngẫu nhiên 1 0.15 0.23
Bộ dữ liệu ngẫu nhiên 2 0.13 0.23
Bộ dữ liệu ngẫu nhiên 3 (TPR-50-Rx) 0.16 0.26
Trung bình 0.14 0.24

64
Bảng 3. 9 Kết quả thực nghiệm với bộ dữ liệu ngẫu nhiên 3 (TPR-100-Rx)
KA SGA
File dữ liệu
L1 T1 gap3[%] L2 gap4[%] T2
TRP-100-R1 41593 3.11 15.6 35690 14.2 6.4
TRP-100-R2 49853 2.86 11.6 40552 18.7 6.3
TRP-100-R3 38513 2.90 17.7 36561 5.1 7.0
TRP-100-R4 41096 2.86 14.9 37612 8.5 7.1
TRP-100-R5 40045 3.13 12.6 37584 6.1 7.8
TRP-100-R6 43113 3.23 16.6 38819 10.0 7.5
TRP-100-R7 42253 3.00 15.6 39609 6.3 6.1
TRP-100-R8 38872 3.17 15.1 38872 0.0 6.0
TRP-100-R9 39338 2.80 23.6 39338 0.0 6.3
TRP-100-R10 37307 2.91 22.0 36750 1.5 6.3
TRP-100-R11 44685 3.16 15.5 38590 13.6 7.5
TRP-100-R12 48622 3.01 20.8 43880 9.8 7.8
TRP-100-R13 40234 2.95 15.2 39914 0.8 6.9
TRP-100-R14 37013 3.16 17.6 36105 2.5 6.8
TRP-100-R15 43180 2.82 17.5 43180 0.0 7.4
TRP-100-R16 41981 2.95 12.6 41722 0.6 7.7
TRP-100-R17 46084 3.01 19.4 42346 8.1 5.9
TRP-100-R18 40926 3.05 17.7 37340 8.8 5.9
TRP-100-R19 43338 2.98 18.7 40158 7.3 5.4
TRP-100-R20 40445 2.96 21.1 39133 3.2 5.6
Trung bình 3.00 17.07 6.30 6.69

65
Bảng 3. 10 Kết quả thực nghiệm với bộ dữ liệu thực 1
File dữ liệu AA KA SGA
L3 L1 T1 gap3[%] L2 gap4[%] T2
st70 26384 26384 0.55 19.4 19553 13.5 1.6
kroD100 1297932 1272501 3.40 21.8 1102503 3.4 6.1
pr107 2205490 21750029 3.3 15.1 1983475 90.8 6.6
rat99 75048 71792 2.31 16.5 60752 15.4 5.2
berlin52 197137 182677 0.17 15.6 151929 16.8 0.5
bier127 5929120 5024830 7.93 12.3 5011031 0.3 14.6
ch130 455849 422064 7.93 12.9 398993 5.5 18.1
ch150 571369 537336 8.23 13.2 516567 3.9 32.4
eil101 38582 34615 2.63 13.1 31572 8.8 4.7
eil51 14683 12738 0.17 13.2 11021 13.5 0.4
eil76 26128 25925 0.12 13.3 19799 23.6 0.4
kroA100 1307340 1124829 3.63 17.9 1056240 6.1 6.1
kroA150 2494782 2322070 11.7 16.2 2164241 6.8 32.1
kroB100 1274207 1137403 3.42 19.8 1015440 10.7 5.3
kroB150 2376125 2273740 12.1 16.6 2072589 8.8 31.6
kroB200 3731218 3437322 30.6 19.5 2981413 13.3 41.9
kroC100 1207746 1025222 3.25 17.7 1025222 0.0 0.9
kroE100 1345314 1045034 3.08 18.7 984759 5.8 5.7
pr124 4778217 4778217 6.23 13.2 3480681 27.2 12.8
pr144 4844537 4844537 10.8 12.9 4462457 7.9 24.6
pr76 4359810 4359810 0.1 12.8 4359810 0.0 0.4
rd100 458419 390381 3.03 12.8 377967 3.2 5.8
Trung bình 5.70 15.6 12.9 11.8

Bảng 3.11 Mô tả gap3 , gap 4 đối với các bộ dữ liệu lớn

SGA
Bộ dữ liệu
gap 3 [%] gap 4 [%]
Bộ dữ liệu thực 1 15.60 12.9
Bộ dữ liệu ngẫu nhiên 3 (TPR-100-Rx) 17.07 6.30
Trung bình 16.33 9.60

Bảng 3. 12 Mô tả T đối với các bộ dữ liệu lớn

KA SGA
Bộ dữ liệu
T1 T2
Bộ dữ liệu thực 1 5.70 11.8
Bộ dữ liệu ngẫu nhiên 3 (TPR-100-Rx) 3.00 6.69
Trung bình 4.35 9.25

66
3.3 Kết luận chƣơng 3

Trong chương này, chúng tôi trình bày khảo sát thực nghiệm về hiệu quả của các thuật toán
gần đúng cận tỷ lệ hiện biết ở thời điểm hiện tại. Thực nghiệm cho thấy:
 Cận tỷ lệ thực nghiệm của các thuật toán tốt hơn rất nhiều so với cận tỷ lệ lý
thuyết. Chất lượng lời giải đưa ra bởi thuật toán Arora et al. và Chaudhuri et al. là
tốt nhất. Tuy nhiên, thuật toán Arora et al. cho kết quả tốt hơn đối với các file dữ
liệu euclidean. Thuật toán Blum et al. cho chất lượng lời giải là tồi nhất. cận tỷ lệ
của thuật toán Goeman et al. nhỉnh hơn so với cận tỷ lệ của thuật toán Archer et al.
 Thời gian chạy của các thuật toán của Arora et al., Chaudhuri et al. và Goeman et
al. là lớn khi áp dụng các bài toán có kích thước từ 200 đỉnh trở lên, trong khi đó,
thời gian chạy của thuật toán của Archer et al. là chấp nhận được.
 Chất lượng cận dưới là không tốt khi giá trị của nó còn xa so với giá trị tối ưu. Lý
do bởi vì chúng ta sử dụng lời giải k-MST hoặc k-troll là cận dưới để xây dựng lời
giải MLP thay vì xây dựng công thức tính cận dưới trực tiếp cho bài toán MLP. Vì
vậy, việc xây dựng công thức tính cận dưới tốt hơn cho bài toán MLP là cần thiết.

Các kết quả chính được công bố trong [3] tại danh mục các công trình công bố được sử
dụng trong luận án.

Ngoài ra, để giảm cận tỷ lệ cho bài toán MLP, chúng tôi đề xuất một thuật toán dựa
trên phương pháp Subgradient. Thuật toán vẫn sử dụng một tập các lời giải của bài toán k-
troll như đầu vào và biến đổi từng lời giải thành một hành trình có chi phí nhỏ hơn chi phí
của hành trình Euler tương ứng. Về mặt trực quan, khi kết nối các hành trình này để thu được
lời giải cho bài toán MLP, thì ta mong chờ thu được thuật toán với cận tỷ lệ nhỏ hơn cho bài
toán MLP. Chúng tôi cũng tiến hành thực nghiệm trên các bộ dữ liệu. Kết quả thực nghiệm
cho thấy, cận tỷ lệ thu được tốt hơn so với cận tỷ lệ của các thuật toán gần đúng cận tỷ lệ tốt
nhất hiện biết. Tuy nhiên, cận tỷ lệ đạt được theo hướng tiếp cận này vẫn còn xa so với lời
giải tối ưu. Các kết quả chính được công bố trong [6] tại danh mục các công trình công bố
được sử dụng trong luận án.

67
CHƢƠNG 4
CÁC THUẬT TOÁN META-HEURISTIC

Các thuật toán gần đúng với cận tỷ lệ  có ưu điểm lớn là về mặt lý thuyết chúng đảm bảo
đưa ra lời giải có chi phí không lớn hơn lần chi phí của lời giải tối ưu. Tuy nhiên, cận tỷ lệ
tốt nhất đạt được hiện nay còn là quá lớn và chưa đáp ứng được yêu cầu của thực tế ứng
dụng. Một hướng tiếp cận khác cũng được quan tâm đó là hướng tiếp cận meta-heuristic. Các
thuật toán meta-heuristic là những thuật toán có độ phức tạp tính toán thường là không quá
lớn. Tuy nhiên, chất lượng lời giải tìm được bởi các thuật toán này chỉ có thể đánh giá thông
qua thực nghiệm. Trong hướng tiếp cận meta-heuristic giải bài toán MLP, các kết quả thực
nghiệm cho thấy các thuật toán được đề xuất trong [40, 43] đều đưa ra lời giải tốt hơn rất
nhiều so với lời giải tìm được bởi các thuật toán gần đúng cận tỷ lệ. Do đó, hướng tiếp cận
meta-heuristic là hướng tiếp cận tiềm năng cho bài toán MLP.

Trong chương này, chúng tôi phát triển ba thuật toán theo hướng tiếp cận meta-
heuristic. Chúng tôi đề xuất thuật toán dựa trên lược đồ của thuật toán di truyền để giải bài
toán MLP và một số kỹ thuật mới được tích hợp vào từng bước của thuật toán di truyền.
Nhằm nâng cao chất lượng lời giải và thời gian chạy thuật toán, chúng tôi đề xuất hai thuật
toán meta-heuristic lai là: Thuật toán (ACO-GA) lai ghép giữa thuật toán di truyền (GA) và
thuật toán đàn kiến (ACO); và thuật toán TS-VNS lai ghép giữa thuật toán Tabu (TS) và
thuật toán lân cận biến đổi (VNS).

Để đánh giá hiệu quả của thuật toán đề xuất, chúng tôi tiến hành thực nghiệm thuật
toán trên các bộ dữ liệu chuẩn để đưa ra những đánh giá và so sánh hiệu quả của các thuật
toán đề xuất với các thuật toán meta-heuristic hiện biết.

68
4.1. Thuật toán di truyền

4.1.1 Lƣợc đồ của thuật toán

Lược đồ tổng quát của thuật toán [13, 32] đòi hỏi phải xác định các thủ tục chính sau đây:
Khởi tạo quần thể, lựa chọn, lai ghép và đột biến. Đầu tiên, ta khởi tạo quần thể các cá thể.
Sau đó, trong mỗi bước lặp, các cá thể cha mẹ được lựa chọn để thực hiện lai ghép tạo ra các
cá thể con cháu. Các cá thể con cháu được đột biến và bổ sung chúng vào quần thể ban đầu.
Cuối cùng, một vài cá thể bị loại bỏ khỏi quần thể theo một tiêu chí lựa chọn để đưa kích
thước quần thể về kích thước ban đầu. Các bước trên được lặp lại cho đến khi điều kiện
dừng của thuật toán thỏa mãn.

Chúng tôi phát triển thuật toán dựa trên lược đồ của thuật toán di truyền giải bài toán
MLP và các kỹ thuật sau đây được tích hợp vào từng bước của thuật toán:
 Kết hợp thuật toán di truyền với thuật toán tìm kiếm địa phương.
 Đề xuất toán tử lai ghép và toán tử đột biến cho bài toán MLP.
 Để duy trì tính đa dạng trong quần thể, chúng tôi sử dụng kỹ thuật hủy diệt (Social
disaster technique) [39].

Sau đây, chúng tôi trình bày chi tiết các bước của thuật toán di truyền trong Thuật
toán 4.1.

Mã hóa: Mỗi đường đi được mã hóa bởi một danh sách có thứ tự gồm n đỉnh T = (v1,
v2, …, vi, …, vn), trong đó vi là đỉnh thứ i trong đường đi.

Hàm đánh giá độ thích nghi (ký hiệu là F): Cá thể có độ trễ càng nhỏ thì độ thích
nghi càng lớn. Như vậy, độ trễ của cá thể tỷ lệ nghịch với độ thích nghi của cá thể đó.
1
F
L(T )

Khởi tạo quần thể ban đầu với kích thước quần thể là SP: Để đảm bảo số lượng cá
thể được khởi tạo ngẫu nhiên chiếm tỷ lệ  1 % trong quần thể ban đầu, tại mỗi bước, ta gieo

một số ngẫu nhiên từ 1 đến 100. Nếu số đó nhỏ hơn  1 , thì cá thể được tạo một cách ngẫu
nhiên, ngược lại, cá thể được tạo theo thuật toán lân cận gần nhất [37]. Chi tiết xem trong
Thuật toán 4.2.

69
Thuật toán 4.1. Lược đồ thuật toán di truyền-GA
Đầu vào: Đồ thị đầy đủ Kn, đỉnh xuất phát v1, và ma trận chi phí Cij.
Đầu ra: Lời giải tốt nhất T*.
1. BEGIN
2. P = initPopulation(Kn, SP, v1); //khởi tạo quần thể ban đầu
3. while (Điều kiện kết thúc chưa thỏa mãn)
4. if (thỏa mãn điều kiện hủy diệt)
5. P = initPopulation(Kn, SP – 1, v1)  T*; //áp dụng kỹ thuật hủy diệt;
6. else
7. Pad = ; //khởi tạo tập các cá thể con
8. for (i =1; i ≤ SP; i++) //SP là kích thước quần thể
9. (TP, TM) = selectionOperator(P); //Lựa chọn cá thể cha TP và mẹ TM
10. if (rand(1) ≤ Pc) //hàm rand(1) trả lại số ngẫu nhiên  (0, 1)
11. TC = crossoverOperator(TP, TM); //lai ghép cá thể cha mẹ
12. if (rand(1) ≤ Pm) //đột biến cá thể con
13. TC = mutationOperator(TC);
14. if (rand(1) ≤ Pls) //tìm kiếm địa phương
15. TC = localSearch(TC);
16. //cập nhập cá thể tốt nhất:
17. if (L(TC) < L(T*)) T* = TC;
18. Bổ sung TC vào Pad;
19. end if
20. end for
21. P = tập gồm Sp cá thể tốt nhất trong P  Pad;
22. end if
23. end while
24. Đưa ra lời giải tốt nhất T*;
25. END

Toán tử lựa chọn: Chọn ngẫu nhiên một nhóm cá thể lời giải với kích thước nhóm
cho trước (ta kí hiệu kích thước nhóm là NG). Sau đó, chọn ra hai cá thể có độ trễ nhỏ nhất
làm cá thể cha mẹ. Ưu điểm của toán tử là lực lựa chọn thay đổi một cách dễ dàng bằng
cách thay đổi kích thước nhóm. Chẳng hạn khi giá trị NG nhỏ, các cá thể có độ thích nghi
thấp sẽ có nhiều cơ hội được lựa chọn hơn khi giá trị NG lớn.

Toán tử lai ghép: Xét một dãy các đỉnh thuộc cá thể cha: vk ,vk+1, ..., vk+m  TP=(v1,
v2, ..., vk, vk+1, ..., vk+m, ..., vn). Giả sử, các đỉnh trong dãy này có thứ tự như trên thì độ trễ của
TP là nhỏ nhất. Khi đó, dãy được xem là sở hữu đặc tính tốt. Trong bài toán TSP, nếu ta sao
chép toàn bộ dãy này từ cá thể cha vào cá thể con, thì đặc tính đó được bảo toàn. Tuy nhiên,
trong bài toán MLP, độ trễ của cá thể là (n – 1)c(v1, v2) + (n – 2)c(v2, v3) + ... + (n – k +
1)c(vk-1, vk) + (n – k)c(vk, vk+1) + (n – k – m + 1)c(vk+m-1, vk+m) + ... + c(vn-1, vn). Bởi vậy, độ trễ
còn phụ thuộc vào vị trí mà dãy đỉnh đó được chèn vào cá thể con. Chúng tôi đề xuất một
toán tử lai ghép phù hợp với đặc điểm hàm mục tiêu bài toán MLP. Ý tưởng cơ bản là với

70
Thuật toán 4.2. initPopulation (Khởi tạo quần thể ban đầu)
Đầu vào: Kn, SP, và v1 lần lượt là đồ thị đầy đủ, ma trận chi phí, kích thước quần thể, cá thể
lời giải và đỉnh xuất phát.
Đầu ra: Quần thể P.
1. BEGIN
2. P=;//khởi tạo quần thể rỗng
3. TC=;//khởi tạo cá thể
4. for (i = 1; i ≤ SP; i++)
5. TC = TCv1};//cá thể luôn có đỉnh xuất phát là đỉnh v1
6. rand = random(100);// hàm sinh số ngẫu nhiên từ 1 đến 100.
7. if (rand <  1 )
8. for (j = 2; j ≤ n; j++)
9. Chọn ngẫu nhiên đỉnh {v | v TC};
10. TC = TCv};
11. end for
12. else
13. TC = Lời giải của thuật toán lân cận gần nhất;
14. Bổ sung TC vào quần thể P;
15. end if
16. end for
17. Đưa ra lời giải tốt nhất;
18. END

mỗi lựa chọn đỉnh kế tiếp từ cá thể cha mẹ, ta cần xem theo cả hai hướng tiến và lùi. Hướng
lựa chọn mà cho ra giá trị hàm mục tiêu nhỏ hơn sẽ được lựa chọn. Cụ thể, toán tử lai ghép
được thiết kế như sau: Gọi TM, TP và TC lần lượt là các thể mẹ, cá thể cha và cá thể con.
Trong bước khởi tạo, ta thiết lập TC[1] = TP[1]; TC[2] = TM[2]. Tại bước thứ k (k = 3, ..., n),
ta tìm vị trí i sao cho TP[i] = TC[k–1]. Đến đây, ta xem xét ba trường hợp có thể xảy ra đối
với hai đỉnh TP[i–1] và TP[i+1]:
 Hai đỉnh TP[i–1] và TP[i+1] chưa có trong TC: Thiết lập TC = TC  TP[i–1] và TC
= TC  TP[i+1]. Không làm mất tính tổng quát, ta giả sử L(TC1) < L(TC2) (L(TC) là
độ trễ của TC), thì thiết lập TC =TC1.
 Khi một trong hai đỉnh TP[i–1] và TP[i+1] đã có trong TC, thì đỉnh còn lại sẽ được
bổ sung vào TC.
 Khi cả hai đỉnh đều đã có trong TC, thì chọn một đỉnh ngẫu nhiên chưa có trong TC
để bổ sung vào TC.
Chi tiết toán tử lai ghép được trình bày trong Thuật toán 4.3.

Toán tử đột biến: Ý tưởng là chia cá thể con thành hai dãy. Sau đó, trong mỗi bước,
từng đỉnh trong dãy thứ hai được chèn vào từng vị trí trong dãy đầu tiên. Ta chọn vị trí chèn

71
Thuật toán 4.3. crossoverOperator (Toán tử lai ghép)
Đầu vào: TM và TP và TC lần lượt là cá thể mẹ và cá thể cha.
Đầu ra: TC là cá thể con.
1. BEGIN
2. TC[1] = TP[1] = v1; TC[2] = TM[2];
3. for (k = 3; k ≤ n; k++)
4. Xác định chỉ số i sao cho TP[i] = TC[k–1];
5. if (TP[i–1] && TP[i+1]  TC)
6. TC1 = TC  TP[i–1];
7. TC2 = TC  TP[i+1];
8. if (L(TC1) < L(TC2)) TC = TC1;
9. else TC = TC2;
10. else
11. if (TP[i–1] || TP[i+1]  TC)
12. if (TP[i–1]  TC) TC = TC TP[i–1]
13. else
14. TC = TC TP[i+1];
15. end if
16. else
17. Chọn ngẫu nhiên đỉnh v {v TP | v TC};
18. TC = TC v};
19. end if
20. end if
21. Hoán đổi vai trò TM và TP;
22. end for
23. return (TC);
24. END

sao cho độ trễ của dãy thứ nhất là nhỏ nhất. Lặp lại các bước trên cho đến khi dãy thứ nhất có
đủ n đỉnh. Chi tiết toán tử đột biến được trình bày tại Thuật toán 4.4.

Thuật toán tìm kiếm địa phương: Hiệu quả của việc kết hợp thuật toán di truyền và
thuật toán tìm kiếm địa phương đã được trình bày trong [13]. Ý tưởng là, vai trò của thuật
toán tìm kiếm địa phương là tìm ra các vùng không gian lời giải tiềm năng và thuật toán GA
sẽ tìm kiếm lời giải tốt nhất trong vùng không gian lời giải đó. Ở đây, ta sử dụng thuật toán 2-
opt, swap-adjacent, swap và 3-opt [26]. Để giảm độ phức tạp thời gian của các thuật toán, ta
sẽ thu hẹp lân cận tìm kiếm bằng cách cố định ngẫu nhiên một đỉnh và chỉ thực hiện tìm kiếm
trong lân cận gồm các lời giải thu được nhờ phép biến đổi liên quan đến đỉnh này. Nhờ đó, độ
phức tạp thời gian của 2-opt, swap-adjacent, swap chỉ là O(n), còn độ phức tạp thời gian của
3–opt là O(n2).

72
Thuật toán 4.4. mutationOperator (Toán tử đột biến)
Đầu vào: TC là cá thể con.
Đầu ra: TC1 là cá thể con sau khi đột biến.
1. BEGIN
2. k = rand (|TC1|); //chọn một giá trị ngẫu nhiên k (1 < k  n)
3. Chia TC thành TC1 = (v1, ..., vk-1) và TC2 = (vk, ..., vn);
4. for (i = 1; i ≤ |TC1|; i++)
5. min = +∞;
6. for (j = 1; j ≤ |TC2|; j++)
7. TC1 = Chèn(TC1, i, TC2[j]);//chèn đỉnh TC2[j] vào TC1 ở vị trí thứ i
8. if (L(TC1) ≤ min)
9. min = L(TC1);
10. k = i;
11. v = TC2[j];
12. end if
13. TC1 = TC1 \ TC2[j]; //loại đỉnh TC2[j] ra khỏi TC1.
14. end for
15. Chèn(TC1, k, v);//chèn đỉnh v vào TC1 ở vị trí thứ k
16. TC2 = TC2 \ {v};//loại đỉnh v ra khỏi TC2.
17. end for
18. return (TC1);
19. END

Kỹ thuật hủy diệt (Social disaster technique-SDT) [39]: Một trong những vấn đề
thường gặp phải của thuật toán di truyền đó là vấn đề hội tụ sớm đến lời giải cực trị địa
phương. Nguyên nhân chính đó là quần thể mất dần đi sự đa dạng sau một số vòng lặp. Điều
này dẫn đến chất lượng lời giải của thuật toán bị giảm. Kỹ thuật hủy diệt có thể giúp thuật
toán tránh được sự hội tụ sớm. Ý tưởng là đánh giá mức độ đa dạng của quần thể để áp dụng
kỹ thuật. Khi mà quần thể không còn duy trì sự đa dạng, thì kỹ thuật được áp dụng. Trong
thuật toán di truyền đề xuất, nếu sau một số lượng thế hệ mà lời giải tốt nhất không được cải
thiện, thì chỉ giữ lại cá thể tốt nhất trong quần thể, trong khi đó các cá thể còn lại được khởi
tạo lại theo Thuật toán 4.2. Ta ký hiệu số lượng thế hệ mà áp dụng kỹ thuật hủy diệt là
NGD.

Giảm kích thước quần thể về kích thước ban đầu: Sau mỗi thế hệ, ta loại bỏ đi
những cá thể có độ thích nghi nhỏ nhất ra khỏi quần thể cho đến khi kích thước quần thể là
SP, những cá thể còn lại sẽ đóng vai trò là cá thể cha mẹ ở thế hệ tiếp theo.

Điều kiện dừng thuật toán: Thuật toán sẽ dừng nếu sau một số lượng thế hệ xác định,
lời giải tốt nhất không được cải thiện. Ta ký hiệu số lượng thế hệ để kết thúc thuật toán là
NGT.

73
Bây giờ, ta đánh giá độ phức tạp thời gian lý thuyết của thuật toán: Một vòng lặp
của thuật toán đòi hỏi thực hiện các công việc sau: 1) Việc khởi tạo quần thể P đòi hỏi thời
gian O(SP×n2) (trong đó xây dựng từng cá thể theo phương pháp ngẫu nhiên mất thời gian
O(n) và theo thuật toán lân cận gần nhất là O(n2)); 2) Độ phức tạp thời gian của việc thực
hiện thuật toán di truyền tại mỗi vòng lặp đòi hỏi O(n2) (bởi vì, thời gian đòi hỏi bởi việc thực
hiện toán tử lựa chọn là O(NG2) (NG < n), toán tử lai ghép: O(n2), toán tử đột biến: O(n2),
thuật toán tìm kiếm địa phương: O(n2) (trong đó, độ phức tạp thời gian của thuật toán tìm
kiếm địa phương 2-opt, swap-adjacent, swap là O(n), và 3-opt là O(n2)). Giả sử, thuật toán di
truyền kết thúc sau k1 vòng lặp, khi đó độ phức tạp thời gian của thuật toán là O(k1×SP×n2).

4.1.2 Kết quả thực nghiệm

Chúng tôi thực thi thuật toán trên máy tính cá nhân với cấu hình với Intel Pentium core i7
2.93 Ghz và 8GB bộ nhớ trong.

Chúng tôi tiến hành ba thực nghiệm. Vai trò của thực nghiệm đầu tiên là để xác định
giá trị các tham số được sử dụng trong thuật toán. Đối với bộ dữ liệu ngẫu nhiên từ 1 đến 2 và
bộ dữ liệu thực 2, ta chọn ra trong mỗi bộ ba file dữ liệu đại diện. Sau đó, tiến hành thực
nghiệm trên các file dữ liệu này để tìm ra giá trị tham số mà thuật toán cho kết quả lời giải tốt
nhất. Từ đó, cố định các giá trị tham số này trong hai thực nghiệm kế tiếp. Hai thực nghiệm
kế tiếp có vai trò đánh giá hiệu quả của thuật toán đề xuất. Dữ liệu trong thực nghiệm thứ hai
bao gồm các file dữ liệu nhỏ trong bộ dữ liệu ngẫu nhiên từ 1 đến 3 và bộ dữ liệu thực 2.
Thực nhiệm thứ ba được tiến hành với các file dữ liệu lớn trong bộ dữ liệu thực 1 và bộ dữ
liệu ngẫu nhiên 3. Đối với các file dữ liệu nhỏ, lời giải tối ưu từ thuật toán đúng cho phép ta
đánh giá chính xác hiệu quả của thuật toán. Đối với các file dữ liệu lớn, khi mà lời giải tối ưu
chưa được biết đến, hiệu quả của các thuật toán chỉ được đánh giá một cách tương đối.

Ta gọi AA, AS, MS, GA−no−SDT và GA−SDT lần lượt là thuật toán của Archer et
al. [1], A. Salehipour et al. [40], M. Silva et al. [43], thuật toán di truyền đề xuất không sử
dụng kỹ thuật SDT và sử dụng kỹ thuật SDT. Trong các Bảng thực nghiệm từ 4.1 đến 4.11,
cột OPT, Aver Sol, Best Sol, lần lượt là lời giải tối ưu, lời giải trung bình và lời giải tốt nhất
thu được sau 10 lần chạy; cột gap1[%], cột gap2[%] được tính như đã mô tả ở mục 1.5; cột
STDV là đo độ lệch chuẩn của độ trễ lời giải sau 10 lần chạy; và cột T là thời gian chạy của
các thuật toán tính theo phút. Trong Bảng 4.5, cột GA-no-SDT và GA-SDT tương ứng với
kết quả thuật toán không sử dụng và sử dụng kỹ thuật SDT. Trong Bảng 4.11, kết quả thực
nghiệm của thuật toán Archer et al. được lấy từ [1]. Dấu “−” trong mỗi cột nghĩa là không có

74
kết quả thực nghiệm của thuật toán với file dữ liệu tương ứng. Trong Bảng 4.12, thời gian
chạy trung bình của thuật toán AS và MS lấy từ [40, 43].

4.1.2.1 Thực nghiệm xác định tham số

Do có nhiều tham số đầu vào, nên khi tiến hành thực nghiệm ta sẽ thay đổi giá trị của một
tham số được chọn và cố định các giá trị tham số còn lại, từ đó có thể xem xét ảnh hưởng của
tham số được chọn đến kết quả của thuật toán. Từ các kết quả thực nghiệm, chúng ta sẽ chọn
ra giá trị phù hợp cho tham số đó và cố định giá trị tìm được trong các thực nghiệm xác định
các tham số tiếp theo. Bằng cách đó, ta xác định giá trị của tất cả các tham số của thuật toán
di truyền.

Thực nghiệm xác định tham số kích thước quần thể: Các tham số cố định: Pc = 0.7,
Pm = 0.2, NG = 5,  1 = 30, NGD = 10 và NGT = 50 và tham số thay đổi: SP = (n, 3×n, 5×n,
7×n). Kết quả thực nghiệm tại Bảng 4.1 cho thấy, khi tăng kích thước quần thể, chất lượng lời
giải cũng tăng theo. Tuy nhiên, khi tăng đến một giá trị đủ lớn, chất lượng lời giải gần như
không được cải thiện. Như vậy, việc tăng kích thước quần thể không phải lúc nào cũng tăng
chất lượng lời giải, mà thậm chí còn làm tăng thời gian chạy. Từ Bảng 4.1, chúng tôi chọn SP
= 5×n là phù hợp và cố định giá trị tham số này cho các thực nghiệm kế tiếp.

Thực nghiệm xác định xác suất lai ghép và đột biến: Các tham số cố định: SP=5×n,
NG = 5,  1 = 30, NGD = 10 và NGT = 50 và tham số thay đổi: Pc  (0.6,0.7) , Pm (0.1,0.2) .
Kết quả thực nghiệm tại Bảng 4.2 cho thấy, giá trị Pc = 0.7, Pm = 0.2, thì thuật toán cho kết
quả tốt nhất. Chúng tôi cố định các giá trị tham số này cho các thực nghiệm kế tiếp.

Thực nghiệm xác định kích thước nhóm: Các tham số cố định: SP=5×n, Pc = 0.7, Pm
= 0.2,  1 = 30, NGD = 10 và NGT = 50 và tham số thay đổi: NG = (5, 10, 15). Nếu NG càng
lớn, thì lực lựa chọn càng lớn dẫn đến thuật toán càng hội tụ sớm, kết quả đạt được không
cao. Kết quả thực nghiệm trong Bảng 4.3 cho thấy với NG = 5, kết quả lời giải của thuật toán
thu được tốt nhất.

Thực nghiệm xác định tỷ lệ  1 %: Các tham số cố định: SP=5×n, NG = 5; Pc = 0.7,

Pm = 0.2, NGD = 10 và NGT = 50 và tham số thay đổi:  1 % = (20, 30, 40). Kết quả thực

nghiệm tại Bảng 4.4 cho thấy  1 = 30, thì thuật toán cho kết quả tốt nhất. Chúng tôi cố định
giá trị tham số này cho các thực nghiệm kế tiếp.

75
Bảng 4. 1 Thực nghiệm lựa chọn kích thước quần thể
n 3×n 5×n 7×n
Bộ dữ liệu Best sol OPT Aver gap1 Aver gap1 Aver gap1 Aver gap1
Sol [%] Sol [%] Sol [%] Sol [%]
eil51 6140 6391 4.09 6185 0.73 6140 0 6140 0
Bộ dữ liệu thực 2 kroA100 239680 261508 9.11 241741 0.86 241741 0.86 241741 0.86
Lin105 140450 141952 1.07 141952 1.07 140542 0.07 140542 0.07
Trung bình 4.75 0.89 0.31 0.31
test 1 8105 8483 4.66 8217 1.38 8105 0 8105 0
Bộ dữ liệu ngẫu nhiên 1 test 2 9248 9462 2.31 9307 0.64 9248 0 9248 0
test 3 8584 9296 8.29 8723 1.62 8658 0.86 8658 0.86
Trung bình 5.09 1.21 0.29 0.29
test 1 9526 9745 2.30 9684 1.66 9556 0.31 9556 0.31
Bộ dữ liệu ngẫu nhiên 2 test 2 8827 9012 2.10 9012 2.10 8872 0.51 8872 0.51
test 3 9440 9642 2.14 9574 1.42 9475 0.37 9475 0.37
Trung bình 2.18 1.72 0.40 0.40

Bảng 4. 2 Thực nghiệm lựa chọn tham số xác xuất lai ghép và đột biến
Pc = 0.6, Pc = 0.6, Pc = 0.6, Pc = 0.7, Pc = 0.7, Pc = 0.7,
Pm = 0.1 Pm = 0.2 Pm = 0.3 Pm = 0.1 Pm = 0.2 Pm = 0.3
Bộ dữ liệu Best sol OPT Aver gap1 Aver gap1 Aver gap1 Aver gap1 Aver gap1 Aver gap1
Sol [%] Sol [%] Sol [%] Sol [%] Sol [%] Sol [%]
Bộ dữ liệu eil51 6140 6243 1.68 6243 1.68 6243 1.68 6243 1.68 6140 0.00 6243 1.68
kroA100 239680 250884 4.67 260922 8.86 250884 4.67 241741 0.86 241741 0.86 241741 0.86
thực 2
lin105 140450 141952 1.07 141952 1.07 141952 1.07 141952 1.07 140542 0.07 140791 0.24
Trung bình 2.47 3.87 2.47 1.20 0.31 0.93
Bộ dữ liệu test 1 8105 8345 2.96 8345 2.96 8453 4.29 8728 7.69 8105 0.00 8105 0.00
test 2 9248 9307 0.64 9347 1.07 9347 1.07 9248 0.00 9248 0.00 9307 0.64
ngẫu nhiên 1
test 3 8584 8929 4.02 8929 4.02 9373 9.19 8929 4.02 8658 0.86 8929 4.02
Trung bình 2.54 2.68 4.85 3.90 0.29 1.55
Bộ dữ liệu test 1 9526 9526 0.00 9526 0.00 9526 0.00 9556 0.31 9556 0.31 9556 0.31
test 2 8827 9012 2.10 9012 2.10 9012 2.10 9012 2.10 8872 0.51 8872 0.51
ngẫu nhiên 2
test 3 9440 9517 0.82 9517 0.82 9656 2.29 9656 2.29 9475 0.37 9464 0.25
Trung bình 0.97 0.97 1.46 1.57 0.40 0.36

Bảng 4. 3 Thực nghiệm lựa chọn tham số kích thước nhóm


NG=5 NG=10 NG=15
Bộ dữ liệu Best sol OPT Aver gap1 Aver gap1 Aver gap1
Sol [%] Sol [%] Sol [%]
eil51 6140 6140 0.00 6165 0.41 6147 0.11
Bộ dữ liệu thực 2 kroA100 239680 241741 0.86 241741 0.86 247498 3.26
Lin105 140450 140542 0.07 141952 1.07 140791 0.24
Trung bình 0.31 0.78 1.21
test 1 8105 8105 0.00 8105 0.00 8421 3.90
Bộ dữ liệu ngẫu nhiên 1 test 2 9248 9248 0.00 9388 1.51 9407 1.72
test 3 8584 8658 0.86 8658 0.86 8658 0.86
Trung bình 0.29 0.79 2.16
test 1 9526 9556 0.31 9556 0.31 9556 0.31
Bộ dữ liệu ngẫu nhiên 2 test 2 8827 8872 0.51 9045 2.47 9045 2.47
test 3 9440 9475 0.37 9642 2.14 9642 2.14
Trung bình 0.40 1.64 1.64

76
Bảng 4. 4 Thực nghiệm lựa chọn tỷ lệ  1

 1 %=20  1 %=30  1 %=40


Bộ dữ liệu Best sol OPT Aver gap1 Aver gap1 Aver gap1
Sol [%] Sol [%] Sol [%]
eil51 6140 6243 1.68 6140 0.00 6140 0.00
Bộ dữ liệu thực 2 kroA100 239680 241741 0.86 241741 0.86 241741 0.86
Lin105 140450 140791 0.24 140542 0.07 141952 1.07
Trung bình 0.93 0.31 0.64
test 1 8105 8105 0.00 8105 0.00 8105 0.00
Bộ dữ liệu ngẫu nhiên 1 test 2 9248 9462 2.31 9248 0.00 9462 2.31
test 3 8584 8658 0.86 8658 0.86 8737 1.78
Trung bình 1.06 0.29 1.37
test 1 9526 9556 0.31 9556 0.31 9533 0.07
Bộ dữ liệu ngẫu nhiên 2 test 2 8827 9045 2.47 8872 0.51 8872 0.51
test 3 9440 9440 0.00 9475 0.37 9440 0.00
Trung bình 0.93 0.40 0.19

Bảng 4. 5 Thực nghiệm xác định giá trị NGD

GA−no−SDT GA−SDT
NGD=10 NGD=20 NGD=30
Bộ dữ liệu Best sol OPT
Aver gap1 Aver gap1 Aver gap1 Aver gap1
Sol [%] Sol [%] Sol [%] Sol [%]
eil51 6140 6549 6.66 6140 0.00 6163 0.37 6163 0.37
Bộ dữ liệu thực 2 kroA100 239680 261117 8.94 241741 0.86 241741 0.86 250149 4.37
Lin105 140450 142441 1.42 140542 0.07 141952 1.07 141952 1.07
Trung bình 5.67 0.31 0.77 1.94
test 1 8105 8394 3.57 8105 0.00 8321 2.67 8426 3.96
Bộ dữ liệu ngẫu nhiên 1 test 2 9248 9407 1.72 9248 0.00 9462 2.31 9462 2.31
test 3 8584 9296 8.29 8658 0.86 8658 0.86 8874 3.38
Trung bình 4.53 0.29 1.95 3.22
test 1 9526 9714 1.97 9556 0.31 9714 1.97 9714 1.97
Bộ dữ liệu ngẫu nhiên 2 test 2 8827 9117 3.29 8872 0.51 8872 0.51 9114 3.25
test 3 9440 9642 2.14 9475 0.37 9642 2.14 9642 2.14
Trung bình 2.47 0.40 1.54 2.45

Bảng 4. 6 Thực nghiệm xác định giá trị NGT


NGT=30 NGT=50 NGT=70
Bộ dữ liệu Best sol OPT Aver gap1 Aver gap1 Aver gap1
Sol [%] Sol [%] Sol [%]
eil51 6140 6302 2.64 6140 0.00 6140 0.00
Bộ dữ liệu thực 2 kroA100 239680 245682 2.50 241741 0.86 241741 0.86
Lin105 140450 141668 0.87 140542 0.07 140542 0.07
Trung bình 2.00 0.31 0.31
test 1 8105 8395 3.58 8105 0.00 8105 0.00
Bộ dữ liệu ngẫu nhiên 1 test 2 9248 9574 3.53 9248 0.00 9248 0.00
test 3 8584 8658 0.86 8658 0.86 8658 0.86
Trung bình 2.66 0.29 0.29
test 1 9526 9656 1.36 9556 0.31 9556 0.31
Bộ dữ liệu ngẫu nhiên 2 test 2 8827 9045 2.47 8872 0.51 8872 0.51
test 3 9440 9440 0.00 9475 0.37 9475 0.37
Trung bình 1.28 0.40 0.40

77
PD×10-2

Thế hệ

Hình 4. 1 Minh họa sự hội tụ của thuật toán GA−SDT và GA−no−SDT tại file test 1 trong bộ
dữ liệu ngẫu nhiên 1 qua các thế hệ

PD×10-2

Thế hệ

Hình 4. 2 Minh họa sự hội tụ của thuật toán GA−SDT và GA−no−SDT tại file test 1 trong bộ
dữ liệu ngẫu nhiên 2 qua các thế hệ

PD×10-2

Thế hệ

Hình 4. 3 Minh họa sự hội tụ của thuật toán GA−SDT và GA−no−SDT tại file KroA100
trong bộ dữ liệu thực 2 qua các thế hệ

78
Thực nghiệm xác định giá trị của tham số NGD: Các tham số cố định: SP=5×n, NG = 5; Pc =
0.7, Pm = 0.2,  1 = 30, và NGT = 50 và tham số thay đổi: NGD = (10, 20, 30). Kết quả thực
nghiệm tại Bảng 4.5 cho thấy NGD = 10, thì thuật toán cho kết quả tốt nhất. Chúng tôi cố
định giá trị tham số này cho các thực nghiệm kế tiếp.

Thực nghiệm xác định giá trị của tham số của NGD: Các tham số cố định: SP=5×n,
NG = 5; Pc = 0.7, Pm = 0.2,  1 = 30, và NGD = 10 và tham số thay đổi: NGT = (30, 50, 70).
Kết quả thực nghiệm tại Bảng 4.6 cho thấy kết quả thuật toán với NGT = 50 và NGT = 70 là
như nhau. Tuy nhiên, NGT = 70, thì thời gian chạy của thuật toán lâu hơn. Bởi vậy, chúng tôi
chọn giá trị cho tham số NGT là 50.

Tại thực nghiệm này, chúng tôi cũng đánh giá hiệu quả của kỹ thuật SDT. Như đã
trình bày ở trên, một trong những vấn đề thường gặp phải của thuật toán di truyền đó là vấn
đề hội tụ sớm đến lời giải cực trị địa phương. Nguyên nhân chính đó là quần thể mất dần đi
sự đa dạng sau một số vòng lặp. Điều này dẫn đến chất lượng lời giải của thuật toán bị giảm.
Kỹ thuật hủy diệt có thể giúp thuật toán tránh được sự hội tụ sớm. Trong thực nghiệm này, ta
đánh giá hiệu quả của kỹ thuật SDT khi được áp dụng vào trong thuật toán di truyền. Để đánh
giá hiệu quả của kỹ thuật SDT, ta xem xét ảnh hưởng của nó đến thuật toán theo khía cạnh
duy trì tính đa dạng trong quần thể. Để đánh giá tính đa dạng trong quần thể, ta sử dụng
phương pháp đo khoảng cách hamming giữa các cá thể trong quần thể [8]. Phương pháp được
thực hiện như sau: Ta so sánh lần lượt từng gen trong các cá thể với từng gen trong cá thể tốt
nhất trong quần thể. Gọi l là tổng số vị trí mà tại vị trí đó hai cá thể có gen khác nhau, thì
D(X, Y) là khoảng cách hamming giữa hai cá thể X, Y được tính như sau:
l n
0 xj  yj
D( X , Y )  ,l  lj,lj  
n j 0 1 xj  yj

Khi đó, độ đa dạng trong quần thể được tính như sau:
D( X , Y )
PD  
SP
Giá trị D càng lớn điều đó cho thấy hai cá thể càng khác nhau và quần thể có giá trị PD càng
lớn thì quần thể đó càng đa dạng. Hình 4.1 đến 4.3 minh họa sự đa dạng của thuật toán GA-
SDT và GA-no-SDT trên ba file dữ liệu. Ta thấy rằng, thuật toán GA-no-SDT hội tụ sớm khi
quần thể mất đi sự đa dạng. Trong khi đó, thuật toán GA-SDT duy trì sự đa dạng trong quần
thể tốt hơn so với thuật toán GA-no-SDT. Kết quả thực nghiệm trong Bảng 4.5 cũng cho thấy
thuật toán GA-SDT đưa ra lời giải với chất lượng tốt hơn.

79
4.1.2.2 Thực nghiệm các file dữ liệu nhỏ

Mỗi file dữ liệu được thực thi 10 lần. Kết quả thực nghiệm được trình bày trong Bảng 4.7 và
4.8 là kết quả trung bình của 10 lần chạy.

Kết quả thực nghiệm trong các Bảng cho thấy so với lời giải tối ưu, gap1[%] đạt được

tại các bộ dữ liệu ngẫu nhiên từ 1 đến 3 và bộ dữ liệu thực 2 là tương đối nhỏ ( gap1[%] cho
tất cả các bộ dữ liệu là 1.63). Điều này chứng tỏ thuật toán GA cho lời giải khá sát với lời giải
tối ưu. Thêm vào đó, thuật toán GA cũng đưa ra lời giải tối ưu tại một số file dữ liệu. Kết quả
thực nghiệm cũng cho thấy chất lượng lời giải của thuật toán GA tốt hơn rất nhiều so với chất
lượng lời giải của các thuật toán gần đúng cận tỷ lệ tại tất cả các file dữ liệu. Tuy nhiên, thời
gian chạy của thuật toán GA không tốt bằng thời gian chạy của các thuật toán AS và MS.

4.1.2.3 Thực nghiệm các file dữ liệu lớn

Mỗi file dữ liệu được thực thi 10 lần. Kết quả thực nghiệm được trình bày từ Bảng 4.9 đến
4.11 là kết quả trung bình của 10 lần chạy. Trong bộ dữ liệu ngẫu nhiên 3, thuật toán AS chỉ
đưa ra kết quả trung bình, bởi vậy từ Bảng 4.9 đến Bảng 4.10, không có kết quả chi tiết của
thuật toán AS. Thêm vào đó, trong bộ dữ liệu thực 1, các thuật toán AS, MS chỉ đưa ra kết
quả thực nghiệm tại một số file dữ liệu, nên ta chỉ so sánh chất lượng lời giải và thời gian
chạy của các thuật toán trên các file dữ liệu đó. Bảng 4.12 mô tả thời gian chạy trung bình
của các thuật toán đối với từng bộ dữ liệu.

Bảng 4.9 đến 4.11 cho thấy thuật toán GA cho kết quả lời giải tốt hơn so với chất
lượng lời giải của các thuật toán gần đúng cận tỷ lệ AA, và SGA tại hầu hết các file dữ liệu.
So với chất lượng lời giải của các thuật toán AS và MS, thì thuật toán GA chưa tốt bằng về
chất lượng lời giải.

Thuật toán AS được thực thi trên máy tính có bộ xử lý 2.4 GHz và 512 MB bộ nhớ
trong, trong khi thuật toán MS và GA được thực thi trên máy tính có cùng cấu hình với Intel
Pentium core i7 2.93 Ghz và 8GB bộ nhớ trong. Do các thuật toán được thực thi trên các máy
tính có cấu hình khác nhau, bởi vậy, khó mà đánh giá một cách chính xác về thời gian chạy
của các thuật toán. Ta so sánh thời gian chạy trung bình của thuật toán GA so với thời gian
chạy trung bình thuật toán AS, MS trong trường hợp các thuật toán cho lời giải tốt nhất. Kết
quả thực nghiệm trong các Bảng 4.12 cho thấy thời gian chạy của thuật toán GA không tốt
bằng thời gian chạy của các thuật toán AS và MS.

80
Bảng 4. 7 Kết quả thực nghiệm các thuật toán cho các bộ dữ liệu nhỏ
SGA GA
Bộ dữ liệu Best sol OPT gap1[%] Best sol Aver Sol STDEV gap1[%] T
(phút)
eil51 6140 2.00 6140 6140 0 0.00 1.25
eil76 5894 17.01 5894 5894 0 0.00 1.30
st70 7801 20.00 7801 7801 0 0.00 1.25
rat195 18058 16.00 18058 18285 0 0.00 1.35
kroA100 239680 23.02 241012 241741 1662 0.56 1.30
Bộ dữ liệu thực 2 kroB100 245999 8.00 247541 248041 249 0.63 1.25
kroC100 1122890 12.02 1145124 1147815 3757 1.98 1.40
berlin52 1372572 23.01 1372572 1372952 1121 0.00 1.45
pr76 1122891 36.02 1123541 1123654 1201 0.06 1.35
tsp225 27523 25.00 27523 27618 299 0.00 1.40
tss225 1138068 23.03 1138068 1138230 4882 0.00 1.35
Lin105 140450 11.01 140450 140542 341 0.00 1.40
Trung bình 18.01 1126 0.27 1.34
test 1 8105 11.01 8105 8105 0 0.00 1.35
test 2 9248 12.02 9248 9248 0 0.00 1.40
test 3 8584 12.00 8630 8658 45 0.54 1.35
test 4 9240 12.03 9263 9267 19 0.25 1.30
Bộ dữ liệu ngẫu test 5 8097 15.00 8097 8097 0 0.00 1.35
nhiên 1 test 6 9490 17.03 9506 9519 44 0.17 1.40
test 7 8450 15.00 8517 8564 99 0.79 1.35
test 8 8426 14.01 8426 8426 0 0.00 1.50
test 9 8987 15.00 9018 9023 41 0.34 1.35
test 10 9705 7.02 9713 9719 13 0.08 1.40
Trung bình 13.01 26.1 0.11 1.37
test 1 9526 17.01 9526 9556 0 0.00 1.35
test 2 8827 13.00 8838 8872 37 0.12 1.25
test 3 9440 14.00 9450 9475 0 0.11 1.30
test 4 8539 16.02 8539 8539 0 0.00 1.35
Bộ dữ liệu ngẫu test 5 8321 20.00 8321 8321 0 0.00 1.35
nhiên 2 test 6 8327 17.02 8434 8457 236 1.28 1.30
test 7 8300 20.01 8300 8302 8 0.02 1.25
test 8 9520 13.00 9520 9520 0 0.00 1.35
test 9 9759 15.02 9769 9792 33 0.10 1.40
test 10 8782 19.00 8785 8813 52 0.03 1.35
Trung bình 16.4 36.6 0.17 1.32

81
Bảng 4. 8 Kết quả thực nghiệm các thuật toán cho bộ dữ liệu ngẫu nhiên 3 (TPR-50-Rx)
SGA GA
File dữ liệu OPT T
gap1[%] Best Sol Aver Sol STDV gap1[%]
(phút)
TRP-50-R1 12198 26.21 12709 12709 0 4.19 1.50
TRP-50-R2 11621 18.12 12845 12921 127 10.53 1.60
TRP-50-R3 12139 14.12 12904 12904 19 6.30 1.75
TRP-50-R4 13071 17.21 13925 13925 0 6.53 1.80
TRP-50-R5 12126 11.21 12726 12726 0 4.95 1.45
TRP-50-R6 12684 11.14 13245 13245 0 4.42 1.55
TRP-50-R7 11176 5.25 11991 11991 0 7.29 1.60
TRP-50-R8 12910 9.41 13558 13754 170 5.02 1.55
TRP-50-R9 13149 17.25 13845 13845 0 5.29 1.65
TRP-50-R10 12892 12.14 13740 13740 0 6.58 1.45
TRP-50-R11 12103 15.12 12565 12565 0 3.82 1.40
TRP-50-R12 10633 23.21 11657 11657 0 9.63 1.45
TRP-50-R13 12115 22.32 12870 12870 0 6.23 1.50
TRP-50-R14 13117 17.46 13659 13721 67 4.13 1.55
TRP-50-R15 11986 14.32 12793 12793 0 6.73 1.60
TRP-50-R16 12138 25.21 12803 12803 0 5.48 1.65
TRP-50-R17 12176 15.25 13387 13387 0 9.95 1.70
TRP-50-R18 13357 12.31 13988 13988 0 4.72 1.75
TRP-50-R19 11430 14.55 11911 12012 107 4.21 1.50
TRP-50-R20 11935 12.42 12409 12409 0 3.97 1.50
Trung bình 15.71 24 6.00 1.58

Bảng 4. 9 Kết quả thực nghiệm các thuật toán cho bộ dữ liệu ngẫu nhiên 3 (TPR-100-Rx)
AS MS GA
File dữ liệu UB gap2 gap2 gap2 T
SGA UB Best Sol Best Sol Aver Sol STDV
[%] [%] [%] (phút)
TRP-100-R1 35334 35690 - - 32779 7.23 35334 35334 0 0.00 3.10
TRP-100-R2 38442 40552 - - 33435 13.02 36773 36773 0 4.34 3.20
TRP-100-R3 37642 36561 - - 32390 13.95 35150 35320 273 6.62 3.55
TRP-100-R4 37508 37612 - - 34733 7.40 37508 37751 392 0.00 3.65
TRP-100-R5 37215 37584 - - 32598 12.41 35254 35254 0 5.27 3.35
TRP-100-R6 40422 38819 - - 34159 15.49 36988 36988 0 8.50 3.25
TRP-100-R7 37367 39609 - - 33375 10.68 36897 36941 43 1.26 3.15
TRP-100-R8 38086 38872 - - 31780 16.56 35408 35510 373 7.03 3.20
TRP-100-R9 36000 39338 - - 34167 5.09 36415 36574 284 1.15 3.40
TRP-100-R10 37761 36750 - - 31605 16.30 34018 34018 0 9.91 3.50
TRP-100-R11 37220 38590 - - 34188 8.15 37006 37006 0 0.57 3.55
TRP-100-R12 34785 43880 - - 32146 7.59 35437 35437 0 1.87 3.25
TRP-100-R13 37863 39914 - - 32604 13.89 35239 35512 396 6.93 3.35
TRP-100-R14 36362 36105 - - 32433 10.81 34869 34869 0 4.11 3.40
TRP-100-R15 39381 43180 - - 32574 17.28 35640 35640 0 9.50 3.50
TRP-100-R16 39823 41722 - - 33566 15.71 37083 37083 0 6.88 3.45
TRP-100-R17 41824 42346 - - 34198 18.23 37058 37421 319 11.40 3.55
TRP-100-R18 39091 37340 - - 31929 18.32 35109 35109 0 10.19 3.60
TRP-100-R19 39941 40158 - - 33463 16.22 36457 36457 0 8.72 3.20
TRP-100-R20 39888 39133 - - 33632 15.68 35998 35998 0 9.75 3.15
Trung bình 11.56 13.0 104 5.7 3.37

82
Bảng 4. 10 Kết quả thực nghiệm các thuật toán cho bộ dữ liệu ngẫu nhiên 3 (TPR-200-Rx)
AS MS GA
File dữ liệu UB gap2 gap2 gap2 T
Best Sol Best Sol Best Sol Aver Sol STDV
[%] [%] [%] (phút)
TRP-200-R1 105044 - - 88787 15.48 102400 102400 0 2.52 6.13
TRP-200-R2 104073 - - 91977 11.62 104174 104174 0 0.10 6.40
TRP-200-R3 111644 - - 92568 17.09 102333 102568 203 8.34 6.27
TRP-200-R4 104956 - - 93174 11.23 102596 103214 450 2.25 6.20
TRP-200-R5 101912 - - 88737 12.93 100161 100161 0 1.72 6.40
TRP-200-R6 103751 - - 91589 11.72 101514 101514 0 2.16 6.33
TRP-200-R7 109810 - - 92754 15.53 102134 103121 0 6.99 6.20
TRP-200-R8 103830 - - 89048 14.24 99845 99845 0 3.84 6.27
TRP-200-R9 100946 - - 86326 14.48 97113 97113 0 3.80 6.20
TRP-200-R10 108061 - - 91552 15.28 101414 102321 1172 6.15 6.13
TRP-200-R11 103297 - - 92655 10.30 103368 103368 0 0.07 6.07
TRP-200-R12 107715 - - 91457 15.09 104090 107541 2034 3.37 6.33
TRP-200-R13 100505 - - 86155 14.28 101366 101366 0 0.86 6.47
TRP-200-R14 107543 - - 91882 14.56 102002 102002 0 5.15 6.33
TRP-200-R15 100196 - - 88912 11.26 101739 104214 2685 1.54 6.20
TRP-200-R16 104462 - - 89311 14.50 100235 100235 0 4.05 6.13
TRP-200-R17 107216 - - 89089 16.91 100672 100672 0 6.10 6.07
TRP-200-R18 108148 - - 93619 13.43 106565 107541 721 1.46 6.53
TRP-200-R19 105716 - - 93369 11.68 104135 104135 0 1.50 6.27
TRP-200-R20 116676 - - 86292 26.04 98771 98771 0 15.35 6.20
Trung bình 11.33 14.38 363 3.87 6.26

83
Bảng 4. 11 Kết quả thực nghiệm các thuật toán cho bộ dữ liệu thực 1

SGA AA AS MS GA
File dữ liệu T
Best Sol Best Sol Best Sol Best Sol Best Sol Aver Sol STDV
(phút)
st70 19553 26384 19553 19215 19893 19982 33 2.12
rat195 - 280900 213371 210191 245412 251241 17648 6.23
kroD100 1102503 1297932 976830 949594 976830 976830 0 3.67
pr226 - 10421449 7226554 7100308 7212541 7325412 121686 6.45
lin105 750883 780662 585823 585823 598375 598375 0 3.74
pr107 1983475 2205490 1983475 1980767 1987110 1987110 0 3.77
lin318 - 7475822 5876537 5560679 5876537 5896521 25799 11.8
pr439 - 24126010 18567170 17688561 18567170 18567170 0 18.5
rat99 60752 75048 56994 54984 58327 58327 0 3.75
att532 - - 18448435 5581240 18448435 20121145 1441872 21.5
berlin52 151929 197137 - - 142512 142512 0 1.61
bier127 5011031 5929120 - - 5011031 5121424 119903 4.25
ch130 398993 455849 - - 366578 378230 6141 5.01
ch150 516567 571369 - - 474075 492174 6471 5.23
d198 - 1380470 - - 1289590 1321474 41162 6.24
eil101 31572 38582 - - 30235 30521 301 3.57
eil51 11021 14683 - - 10281 10525 257 1.84
eil76 19799 26128 - - 18243 18759 204 2.12
gil262 - 393641 - - 327534 341214 18109 9.12
kroA100 1056240 1307340 - - 1025339 1025339 0 3.6
kroA150 2164241 2494782 - - 2118357 2239769 84049 5.12
kroA200 - 3387616 - - 2962453 2980534 19059 6.47
kroB100 1015440 1274207 - - 992121 992121 0 3.56
kroB150 2072589 2376125 - - 1902332 2006308 134232 5.1
kroB200 2981413 3731218 - - 2912154 2912154 0 6.45
kroC100 1025222 1207746 - - 992515 998730 6551 3.51
kroE100 984759 1345314 - - 984759 987621 1006 3.42
pr124 3480681 4778217 - - 3264941 3264941 0 4.12
pr264 - 6075505 - - 4015766 4015766 0 5.02
pr76 4369658 4359810 - - 3543367 3641501 57621 5.12
rd100 377967 458419 - - 359096 359096 0 5.7
ts225 - 17953213 - - 14372227 14417868 73489 8.7
tsp225 - 537080 - - 463666 463666 0 9.4
u159 3169661 3837650 - - 3169661 3227509 93144 6.71

Bảng 4. 12 Mô tả T theo phút đối với các bộ dữ liệu lớn

Bộ dữ liệu AS MA GA
Bộ dữ liệu thực 1 10.7 5.02 8.51
Bộ dữ liệu ngẫu nhiên 3 (TPR-100-Rx) 1.68 0.12 3.37
Bộ dữ liệu ngẫu nhiên 3 (TPR-200-Rx) 66.58 1.20 6.27
Trung bình 26.32 2.10 6.05

84
4.2 Thuật toán di truyền lai ghép đàn kiến

Kết quả thực nghiệm ở mục trước cho thấy thuật toán di truyền đưa ra lời giải với chất lượng
tốt hơn chất lượng lời giải của các thuật toán gần đúng cận tỷ lệ hiện biết. Tuy nhiên, một vấn
đề mà các thuật toán di truyền thường gặp là thuật toán hội tụ sớm sau một số vòng lặp, khi
quần thể mất đi tính đa dạng. Điều này ảnh hưởng đến chất lượng lời giải của thuật toán.
Trong mục trước, ta áp dụng kỹ thuật hủy diệt nhằm duy trì tính đa dạng của quần thể. Tuy
nhiên, việc khởi tạo lại toàn bộ quần thể không có tính định hướng và kế thừa đặc tính tốt từ
các thế hệ trước có thể sẽ đưa thuật toán đến một không gian lời giải mới mà không khai thác
được không gian lời giải tiềm năng đã được khảo sát trước đó. Chính vì vậy mà thuật toán di
truyền đề xuất chưa cân bằng được hai đặc tính quan trọng là đặc tính khai thác và đặc tính khai
phá.

Thuật toán đàn kiến [10] mô phỏng hành vi của các đàn kiến trong thực tế. Khi di
chuyển các con kiến để lại vết mùi trên đường đi giúp cho các con kiến theo sau lần theo vết
mùi đó. Dựa vào nồng độ mùi do các con kiến đi trước để lại, các con kiến theo sau lựa chọn
đi theo đường đi có nồng độ mùi cao hơn. Tuy nhiên, một nghiên cứu về hành vi kiến [45]
chỉ ra rằng có khoảng 20% số lượng kiến không có khả năng sử dụng vết mùi để tìm đường
đi. Mặc dù vậy, chúng lại đóng một vai trò nhất định trong quần thể kiến. Các nhà nghiên cứu
đã tiến hành thực nghiệm và thấy rằng loại kiến dựa theo vết mùi có vai trò mang thức ăn từ
nguồn thức ăn tìm được về tổ. Tuy nhiên, chúng khó có khả năng tìm được nguồn thức ăn
mới. Trong khi đó, loại kiến không có khả năng sử dụng vết mùi lại đóng vai trò như cá thể
tìm nguồn thức ăn mới. Thực nghiệm về hành vi đàn kiến cho thấy, quần thể kiến chứa cả hai
loại kiến có khả năng tìm kiếm nguồn thức ăn hiệu quả hơn so với quần thể kiến chỉ chứa một
loại kiến duy nhất. Trong [45], S. Shimomura cũng đã đề xuất thuật toán đàn kiến với hai loại
kiến. Kết quả thực nghiệm cũng chỉ ra rằng, quần thể kiến chứa cả hai loại kiến hiệu quả hơn
so với quần thể kiến chỉ chứa một loại kiến.

Chúng tôi đề xuất thuật toán kế thừa ưu điểm của thuật toán di truyền và thuật toán
đàn kiến để cân bằng giữa hai đặc tính khai phá (exploration) không gian tìm kiếm lời giải
mới và khai thác (exploitation) không gian lời giải đã có. Thuật toán đàn kiến được sử dụng
để khởi tạo quần thể ban đầu cho thuật toán di truyền. Trong khi đó, thông tin từ thuật toán di
truyền đóng vai trò định hướng đường đi cho đàn kiến ở quần thể kế tiếp. Để có được quần
thể đa dạng, thuật toán luôn duy trì ba loại kiến. Loại kiến thứ nhất sử dụng vết mùi và thông
tin di truyền để tìm đường đi. Trong khi đó, loại kiến thứ hai chỉ sử dụng vết mùi còn loại

85
kiến thứ ba lựa chọn tìm đường đi một cách ngẫu nhiên. Như vậy, có thể xem loại kiến thứ ba
giống như một toán tử đột biến giúp thuật toán thoát khỏi cực trị địa phương.

Để đánh giá hiệu quả của thuật toán đề xuất, chúng tôi tiến hành thực nghiệm thuật
toán trên các bộ dữ liệu. Từ kết quả thực nghiệm, chúng tôi đưa ra những đánh giá và so sánh
hiệu quả của thuật toán với các thuật toán khác.

4.2.1 Lƣợc đồ của thuật toán

Sơ đồ của thuật toán di truyền lai ghép thuật toán đàn kiến (ACO-GA) được trình bày chi tiết
ở Thuật toán 4.5. Sau đây, chúng tôi trình bày chi tiết các bước của thuật toán.

Mã hóa: Mỗi đường đi mà cá thể kiến tạo ra được mã hóa bởi một danh sách có thứ
tự gồm n đỉnh T = (v1, v2, …, vi, …, vn), trong đó vi là đỉnh được đi qua thứ i trong đường đi.
Ta cũng sẽ sử dụng ký hiệu T[i] để chỉ đỉnh thứ i trong danh sách T.

Di chuyển của quần thể kiến: Quần thể kiến sẽ bao gồm Sp cá thể kiến, được đánh số
bởi 1, 2, ..., Sp. Bắt đầu từ cá thể kiến 1, trong quá trình thực hiện thuật toán các cá thể kiến lần
lượt thực hiện di chuyển, cá thể kiến này di chuyển xong mới đến lượt cá thể kiến tiếp theo.

Khởi tạo vết mùi và thông tin di truyền: Gọi τk-1ij và gij là lượng mùi và thông tin di
truyền có trên cạnh (vi, vj) mà kiến thứ k sử dụng để lựa chọn cạnh di chuyển (k=1, 2, …, Sp).
Đối với quần thể kiến đầu tiên của ACO-GA, τ0ij và gij được khởi tạo là τ0 và g0 tương ứng,
còn đối với những quần thể kiến tiếp theo, τ0ij được khởi tạo là tổng lượng mùi mà các cá thể
kiến của quần thể kiến ở bước trước để lại, còn gij là tổng thông tin di truyền từ các cá thể
kiến tốt nhất tìm được bởi thuật toán GA ở các bước trước của thuật toán ACO-GA.

Chọn đỉnh tiếp theo: Giả sử, cá thể kiến thứ k đang ở đỉnh vi và cần chọn đỉnh kế tiếp
từ tập các đỉnh chưa thăm của cá thể kiến đó (ký hiệu tập đỉnh này là Nk) để di chuyển. Thuật
toán ACO-GA duy trì ba loại kiến. Loại kiến đầu tiên sử dụng thông tin về vết mùi và thông
tin về di truyền để lựa chọn đỉnh kế tiếp. Nếu cá thể kiến thứ k thuộc loại này, nó sẽ di
chuyển từ đỉnh vi đến đỉnh vj (vj  Nk) với xác suất:
 g
[ k 1 ij ] [ kij ]  [ gij ]
p 
1
. (4.1)
 [
 g
] [ kij ]  [ gij ]
kij
k 1 ij
v j N k

Loại kiến thứ hai chỉ sử dụng thông tin về vết mùi để lựa chọn đỉnh kế tiếp. Nếu cá thể kiến
thứ k thuộc loại hai, thì nó sẽ di chuyển từ đỉnh vi đến đỉnh vj với xác suất là:

86

[ k 1 ij ] [kij ] 
p 
2
. (4.2)


[ k 1 ij ] [kij ] 
kij

v j N k

Cuối cùng, loại kiến thứ ba không sử dụng bất cứ thông tin nào về mùi, cũng như thông tin di
truyền. Nếu cá thể kiến thứ k thuộc loại này thì xác suất để nó di chuyển từ đỉnh vi đến đỉnh vj
là:
1
3
pkij  . (4.3)
| Nk |

Ở đây βτ, β và βg là các tham số,k ij  1 (  cij ) (ρ là vị trí của cạnh (vi, vj) trong đường đi của

cá thể kiến thứ k). Công thức (4.1) và (4.2) được cải biên từ công thức có trong thuật toán
ACO chuẩn của Marco Dorigo [10].
Số lượng kiến loại một, hai và ba sẽ được xác định một cách ngẫu nhiên với tỷ lệ tương ứng là
50%, 30% và 20% (theo nhận xét đã nêu ở trên, ta giữ 20% số lượng kiến không có khả năng sử
dụng vết mùi để tìm đường đi, còn tỷ lệ 50%, 30% cho hai loại kiến còn lại được xác định từ thực
nghiệm). Để thực hiện điều này, khi cần xác định cá thể kiến hiện tại thuộc loại nào trong ba loại
trên, ta gieo một số ngẫu nhiên rd trong khoảng từ 1 đến 100. Nếu rd ≤ 50 thì cá thể kiến đó gán với
loại đầu tiên. Nếu 50 < rd ≤ 80, thì cá thể kiến đó gán với loại thứ hai và cuối cùng nếu rd > 80, thì
cá thể kiến đó gán với loại thứ ba. Sau khi xác định loại cho cá thể kiến, việc lựa chọn đỉnh kế tiếp
được thực hiện theo phương pháp bánh xe roulette, trong đó đỉnh kế tiếp của cá thể kiến được lựa
chọn ngẫu nhiên theo xác suất: Đỉnh nào có xác suất cao hơn sẽ có khả năng được chọn cao hơn,
nhưng không có nghĩa là các đỉnh có xác suất thấp hơn không bao giờ được chọn mà nó được chọn
với cơ hội thấp hơn. Chi tiết việc lựa chọn đỉnh kế tiếp được trình bày trong Thuật toán 4.6.

Cập nhập thông tin vết mùi: Các cá thể kiến lần lượt (con kiến này đi xong mới đến lượt con
kiến khác) thực hiện việc tìm đường đi và khi di chuyển theo đường đi được chọn sẽ để lại vết mùi
trên các cạnh đã đi qua. Giả sử cá thể kiến thứ k thực hiện việc di chuyển theo đường đi Tk, khi đó
lượng vết mùi mà nó để lại trên các cạnh đi qua được tính bởi công thức:

 / L(Tk ), nếu (vi, vj)  Tk,


 k ij   (4.4)
0, nếu trái lại,
trong đó,  là tham số. Khi đó, sau khi cá thể kiến thứ k đã di chuyển, tổng lượng vết mùi kij có trên mỗi
cạnh (vi, vj) được cập nhật theo Δτkij :
 kij =(1  p) k 1ij  kij , (4.5)

trong đó, tham số p  (0, 1) là xác suất bay hơi của vết mùi.

87
Thuật toán 4.5. Lược đồ thuật toán ACO-GA (Kn, Cij, Sp, τ0, g0)
Đầu vào: Kn, Cij, Sp, τ0, g0 tương ứng là đồ thị, ma trận chi phí, kích thước quần thể, giá trị khởi
tạo vết mùi, thông tin di truyền.
Đầu ra: Cá thể tốt nhất tìm được Gk.
//Khởi tạo thông tin vết mùi và di truyền trên các cạnh
1. P=;//khởi tạo quần thể rỗng
2. for (i = 1; i ≤ n; i++)
3. for (j = 1; j ≤ n; j++)
4. τ[i][j] = τ0; g[i][j] = g0;
5. while (điều kiện dừng của ACO-GA chưa thỏa)
6. k=0;
7. while (k < Sp)
8. rd = random(100);//rd là số ngẫu nhiên  (1, 100)
9. Tk = {v1}; //khởi tạoTk gồm đỉnh xuất phát v1
10. vnext = v1; //khởi tạo đỉnh xuất phát vnext cho kiến
11. while (|Tk| ≤ n)
12. Đặt Nk = {vj | vj  Tk}
13. vnext =roulette_Wheel(vnext, rd, Nk); //Chọn đỉnh kế tiếp nhờ roulette_Wheel
14. Tk = Tk{v1}; //bổ sung đỉnh mới vào Tk
15. end while
16. //Cập nhập thông tin vết mùi theo (4.4), (4.5)
17. for (i = 1; i < n; i++)
18. delta_τ[Tk [i],Tk[i+1]] = / L(Tk);
19. τ[Tk [i],Tk[i+1]] = (1–p)*τ[Tk [i],Tk[i+1]] + delta_τ [Tk [i],Tk[i+1]];
20. end for
21. k++;
22. P=P{Tk};//bổ sung cá thể kiến Tk vào quần thể P
23. end while
24. //Các bước của thuật toán di truyền
25. //Quần thể ban đầu P bao gồm các hành trình tạo được bởi các cá thể kiến
26. G* = cá thể tốt nhất trong quần thể P;
27. while (điều kiện dừng của thuật toán di truyền chưa thỏa)
28. Pad = ; //khởi tạo tập các cá thể con
29. for (i = 1; i ≤ Sp; i++)
30. (TP, TM) = selectionOperator(P); //Lựa chọn cá thể cha TP và cá thể mẹ TM
31. if (rand(1) ≤ Pc) //hàm rand(1) trả lại số ngẫu nhiên  (0, 1)
32. TC = crossoverOperator(TP, TM); //lai ghép cá thể cha mẹ
33. if (random(1) ≤ Pm) //đột biến cá thể con
34. TC = mutationOperator(TC);
35. TC=localSearch(TC); //tìm kiếm địa phương
36. if (L(TC) < L(G*)) G* = TC; //cập nhập cá thể tốt nhất:
37. Bổ sung TC vào Pad;
38. end if //end of if (rand(1) ≤ Pc)
39. end for //end of for (i = 1; i ≤ Sp; i++)
40. P = tập gồm Sp cá thể tốt nhất trong P Pad;
41. //Cập nhập thông tin di truyền theo (4.6), (4.7)
42. for (i = 1; i < n; i++)
43. delta_ g[G*[i],G*[i+1]] =  / L(G*);
44. g[G*[i],G*[i+1]] = g[G*[i],G*[i+1]] + delta_ g[G*[i],G*[i+1]];
45. end for //end of for (i = 1; i < n; i++)
46. end for//end of while GA
47. end while//end of while ACO-GA
48. return (cá thể tốt nhất tìm được bởi ACO-GA)

88
Thuật toán 4.6. roulette_Wheel (vi, rd, Nk)
Đầu vào: vi, rd, Nk tương ứng là đỉnh hiện tại, giá trị số trong khoảng 1 đến 100, tập các đỉnh
chưa thăm trong Tk.
Đầu ra: Đỉnh v được chọn đi kế tiếp vi.
1. sum_Prob = 0;
2. if (rd ≤ 50)
//loại kiến sử dụng vết mùi và thông tin di truyền
3. for vj  Nk
4. sum_Prob = sum_Prob + pow(τ[i,j], βτ)×pow(  [i,j], β)×pow(g[i,j], βg);
//lựa chọn đỉnh kế tiếp theo (4.1)
5. for vj  Nk
6. p[i,j] = pow(τ[i,j], βτ)×pow(  [i,j], β)×pow(g[i,j], βg) / sum_Prob;
7. rd = random(sum_Prob); //0 < rd < sum_Prob
8. for vj  Nk
9. sum_ wheel = sum_wheel + p[i,j];
10. if (sum_wheel > rd) break;
11. end for//end for vj  Nk
12. v = vj;
13. end for//end if (rd ≤ 50)
14. if (50 < rd ≤ 80) //loại kiến chỉ sử dụng vết mùi
15. for vj  Nk
16. sum_Prob = sum_Prob + pow(τ[i,j], βτ) *pow(  [i,j], β);
17. for vj  Nk
18. p[i,j] = pow(τ[i,j],βτ)*pow(  [i,j], β) /sum_Prob;//chọn đỉnh kế tiếp theo (4.2)
19. rd = random(sum_Prob);
20. for vj  Nk
21. sum_wheel = sum_wheel + p[i,j];
22. if (sum_wheel > rd) break;
23. end for//end for vj  Nk
24. v = vj;
25. end if//end if (50 < rd ≤ 80)
26. if (rd > 80)//loại kiến ngẫu nhiên
27. chọn ngẫu nhiên v  Nk; //chọn đỉnh kế tiếp theo (4.3)
28. end if//end if (50 < rd ≤ 80)
29. return v;

Khởi tạo quần thể ban đầu cho thuật toán di truyền: Mỗi đường đi được tạo bởi một
cá thể kiến được xem như một cá thể trong quần thể ban đầu cho thuật toán di truyền. Như
vậy, với Sp cá thể kiến thì quần thể ban đầu P sẽ có Sp cá thể đường đi.

Hàm đánh giá độ thích nghi (ký hiệu là F): Cá thể có độ trễ càng nhỏ thì độ thích
nghi càng lớn. Như vậy, độ trễ của cá thể tỷ lệ nghịch với độ thích nghi của cá thể đó.
1
F
L(T )

89
Toán tử lựa chọn: Một nhóm gồm các cá thể với kích thước cho trước (ký hiệu thông
số này là NG) được lựa chọn ngẫu nhiên từ quần thể. Sau đó, hai cá thể có độ trễ nhỏ nhất
trong nhóm được lựa chọn làm cá thể cha mẹ.

Toán tử lai ghép: Toán tử lai ghép thực hiện việc lai ghép các cá thể cha TP và cá thể
mẹ TM với một xác suất lai ghép (Pc) cho trước. Trong thuật toán di truyền, chúng tôi đã đề
xuất toán tử lai ghép cho bài toán MLP. Trong thuật toán này, chúng tôi sử dụng lại toán tử
lai ghép này. Tuy nhiên, thay vì chỉ lựa chọn đỉnh bổ sung vào cá thể con là đỉnh đi ngay
trước hoặc đỉnh đi sát sau vị trí đỉnh hiện tại, thì chúng tôi lựa chọn đỉnh bổ sung trong dãy
gồm l đỉnh đi trước và l đỉnh đi sau vị trí đỉnh hiện tại, trong đó l là thông số chọn trước. Đỉnh
được lựa chọn bổ sung là đỉnh trong dãy nói trên mà việc bổ sung nó cho ta cá thể con với độ
trễ nhỏ nhất.

Toán tử đột biến: Sau khi thu được cá thể con từ bước lai ghép, ta tiến hành đột biến
cá thể này với xác suất đột biến (Pm) cho trước. Mục đích của toán tử đột biến là tạo sự đa
dạng cho quần thể. Ta sử dụng toán tử đột biến đơn giản sau đây: Chọn ngẫu nhiên hai đỉnh
trong cá thể và thực hiện việc hoán đổi chúng.

Tìm kiếm địa phương: Trong bước này, ta kết hợp thuật toán di truyền với thuật toán
tìm kiếm địa phương. Sau bước đột biến, ta thực hiện tìm kiếm địa phương xuất phát từ cá thể
con cháu theo các thuật toán tìm kiếm địa phương swap-adjacent, swap, 2-opt-edge, và 2-opt-
node (xem [26]). Để giảm độ phức tạp tính toán của các thuật toán, ta sẽ thu hẹp lân cận tìm
kiếm bằng cách cố định ngẫu nhiên một đỉnh và chỉ thực hiện tìm kiếm trong lân cận gồm các
lời giải thu được nhờ phép biến đổi liên quan đến đỉnh này. Nhờ đó, độ phức tạp tính toán của
các thuật toán tìm kiếm địa phương chỉ là O(n).

Điều kiện dừng của thuật toán di truyền: Ta sẽ dừng thuật toán nếu như sau một số
lượng thế hệ định trước (ký hiệu số này là Np) thuật toán không tìm được lời giải tốt hơn.

Cập nhập thông tin di truyền: Gọi G* là cá thể đường đi tốt nhất tìm được bởi thuật
toán di truyền. Khi đó, thông tin di truyền Δg*ij của cá thể này được tính bởi công thức sau:

 / L (G * ), nếu (vi, vj)  G*,


g ij*   (4.6)
0, nếu trái lại.
Thông tin di truyền gij trên mỗi cạnh (vi, vj) được khởi tạo cho quần thể kiến ở bước lặp kế tiếp của
ACO-GA được cập nhập theo công thức:

90
gij : gij  gij* . (4.7)

Điều kiện dừng của thuật toán ACO-GA: Thuật toán ACO-GA dừng nếu như sau m
vòng lặp lời giải tốt nhất không được cải thiện. Khi đó, hành trình tốt nhất tìm được trong quá
trình thực hiện thuật toán sẽ được đưa ra như lời giải cần tìm.

Đánh giá độ phức tạp thời gian lý thuyết của thuật toán ACO-GA: Một vòng lặp của
ACO-GA đòi hỏi thực hiện các công việc sau: 1) Việc khởi tạo thông tin vết mùi và di truyền
đòi hỏi thời gian O(n2); 2) Việc xây dựng quần thể kiến P đòi hỏi thời gian O(|Nk|+n) (trong
đó xây dựng từng cá thể kiến theo phương pháp roulette_Wheel mất thời gian O(|Nk|) và cập
nhập thông tin vết mùi từng cá thể kiến mất thời gian O(n), lưu lý là |Nk| < n); 3) Việc thực
hiện thuật toán di truyền đòi hỏi thời gian O(SP×n2) (bởi vì, thời gian đòi hỏi bởi việc thực
hiện toán tử lựa chọn là O(NG2) (NG < n), toán tử lai ghép: O(n2), toán tử đột biến: O(1),
thuật toán tìm kiếm địa phương: O(n)); 4) cập nhập thông di truyền: O(n). Giả sử, thuật toán
di truyền kết thúc sau k1 vòng lặp, khi đó một vòng lặp của ACO-GA đòi hỏi thời gian
O(k1×SP×n2). Nếu ACO-GA kết thúc sau k2 vòng lặp, thì độ phức tạp tính toán của ACO-GA
là O(k1× k2×SP×n2).

4.2.2 Kết quả thực nghiệm

Thuật toán đề xuất được tiến hành trên máy tính cá nhân với bộ xử lý với Intel Pentium core
i7 2.93 Ghz và 8GB bộ nhớ trong.

Để đánh giá hiệu quả của thuật toán, ba thực nghiệm được tiến hành. Hiệu quả của
việc kết hợp thuật toán di truyền với thuật toán đàn kiến được xem xét trong thực nghiệm đầu
tiên. Dữ liệu trong thực nghiệm đầu tiên bao gồm các file dữ liệu nhỏ trong bộ dữ liệu ngẫu
nhiên từ 1 đến 2 và bộ dữ liệu thực 2. Hai thực nghiệm kế tiếp có vai trò đánh giá hiệu quả
của thuật toán đề xuất. Thực nhiệm thứ hai được tiến hành với các file dữ liệu nhỏ trong bộ
dữ liệu ngẫu nhiên từ 1 đến 3 và bộ dữ liệu thực 2. Trong khi đó, dữ liệu trong thực nghiệm
thứ ba bao gồm các file dữ liệu lớn trong bộ dữ liệu thực 1 và bộ dữ liệu ngẫu nhiên 3. Đối
với các file dữ liệu nhỏ, lời giải tối ưu từ thuật toán đúng cho phép ta đánh giá chính xác hiệu
quả của thuật toán. Đối với các file dữ liệu lớn, khi mà lời giải tối ưu chưa được biết đến,
hiệu quả của các thuật toán chỉ được đánh giá một cách tương đối.

Trong các thực nghiệm, chúng tôi lựa chọn giá trị cho các tham số trong thuật toán
ACO-GA như sau: m = 10, Sp = 300, NG = 5, Pc = 0.7, Pm = 0.2, l = 5, βτ = 1, β = 5, βg = 5,

91
Bảng 4. 13 Kết quả thực nghiệm của các thuật toán
ACO GA ACO-GA
Bộ dữ liệu Best sol OPT Aver gap1 Aver gap1 Aver gap1
Sol [%] Sol [%] Sol [%]
eil51 6140 6140 0.00 6140 0.00 6140 0.00
Bộ dữ liệu thực 2 kroA100 239680 241782 0.88 241741 0.86 239680 0.00
Lin105 140450 140450 0.00 140542 0.07 140450 0.00
Trung bình 0.29 0.31 0.00
test 1 8105 8285 2.22 8105 0.00 8105 0.00
Bộ dữ liệu ngẫu nhiên 1 test 2 9248 9374 1.36 9248 0.00 9248 0.00
test 3 8584 8674 1.05 8658 0.86 8584 0.00
Trung bình 1.54 0.29 0.00
test 1 9526 9615 0.93 9556 0.31 9526 0.00
Bộ dữ liệu ngẫu nhiên 2 test 2 8827 8827 0.00 8872 0.51 8827 0.00
test 3 9440 9540 1.06 9475 0.37 9440 0.00
Trung bình 0.66 0.40 0.00

 = 10, τ0 = 10, g0 = 1, p = 0.3 và Np = 20. Việc xác định các tham số trong thuật toán cũng
được thực hiện tương tự như trong việc xác định tham số trong thuật toán di truyền. Ta gọi
AA, AS, MS lần lượt là thuật toán của Archer et al. [1], Chauhuri et al. [9], A. Salehipour et
al. [40], và M. Silva et al. [43]. Trong các Bảng từ 4.13 đến 4.18, cột OPT, Aver Sol, Best Sol,
lần lượt là lời giải tối ưu, lời giải trung bình và lời giải tốt nhất của thuật toán thu được sau 10
lần chạy; cột gap1[%]và cột gap2[%] được tính như đã mô tả ở mục 1.5; cột STDV là đo độ
lệch chuẩn của độ trễ lời giải sau 10 lần chạy; và cột T là thời gian chạy của các thuật toán
tính theo phút. Trong Bảng 4.18, kết quả thực nghiệm của thuật toán Archer et al. được lấy từ
[1]. Dấu “−” trong mỗi cột nghĩa là không có kết quả thực nghiệm của thuật toán với file dữ
liệu tương ứng. Trong Bảng 4.19, thời gian chạy trung bình của thuật toán AS và MS lấy từ
[40, 43].

4.2.2.1 Thực nghiệm đánh giá hiệu quả của việc lai ghép giữa thuật toán di
truyền và thuật toán đàn kiến

Để đánh giá hiệu quả của việc lai ghép, ta so sánh kết quả thực nghiệm trên một số file dữ
liệu của thuật toán ACO-GA với thuật toán di truyền (GA) và thuật toán đàn kiến (ACO) khi
hai thuật toán này được thực hiện độc lập.

Kết quả thực nghiệm trong Bảng 4.13 cho thấy rằng thuật toán ACO-GA đưa ra kết
quả tốt hơn thuật toán GA và thuật toán ACO tại hầu hết các file dữ liệu thực nghiệm. Như
vậy, thuật toán lai ghép mô phỏng giống quần thể kiến trong thực tế cho thấy hiệu quả hơn
thuật toán di truyền hay thuật toán đàn kiến thuần túy.

92
4.2.2.2 Thực nghiệm cho bộ dữ liệu nhỏ

Mỗi file dữ liệu được thực thi 10 lần. Các kết quả thực nghiệm được trình bày trong Bảng
4.14 và 4.15 là kết quả trung bình của 10 lần chạy thuật toán.

Kết quả thực nghiệm trong Bảng 4.14 và 4.15 chứng tỏ thuật toán ACO−GA hiệu quả
hơn thuật toán GA cả về chất lượng lời giải và thời gian chạy thuật toán. So với lời giải tối ưu
có được từ Bảng 4.14 và 4.15, thuật toán ACO−GA đưa ra được lời giải tối ưu tại tất cả các
file dữ liệu.

4.2.2.3 Thực nghiệm cho bộ dữ liệu lớn

Mỗi file dữ liệu được thực thi 10 lần. Các kết quả thực nghiệm được trình bày trong Bảng
4.16 đến 4.18 là kết quả trung bình của 10 lần chạy. Trong bộ dữ liệu ngẫu nhiên 3, thuật toán
AS chỉ đưa ra kết quả trung bình, bởi vậy từ Bảng 4.16 đến Bảng 4.17, không có kết quả chi
tiết của thuật toán AS. Thêm vào đó, trong bộ dữ liệu thực 1, các thuật toán AS, MS chỉ đưa
ra kết quả thực nghiệm tại một số file dữ liệu nên ta chỉ so sánh chất lượng lời giải và thời
gian chạy của các thuật toán trên các file dữ liệu đó. Bảng 4.19 mô tả thời gian chạy trung
bình của các thuật toán đối với từng bộ dữ liệu.

Trong Bảng 4.16 và Bảng 4.17, thuật toán ACO-GA cho kết quả lời giải tốt hơn thuật
toán GA và thuật toán của AS tại tất cả các file dữ liệu. So với thuật toán M. Silva et al., thuật
toán ACO-GA cho lời giải tốt hơn tại các file dữ liệu TRP-100-R13, KroD100, Pr107, nhưng
chất lượng lời giải không tốt bằng tại các file dữ liệu rat99, att532, TRP-100-R6, TRP-100-
R10, TRP-100-R14, TRP-100-R16, TRP-100-R17. Đối với các file dữ liệu còn lại, thì chất
lượng lời giải của hai thuật toán là tương đương.

Thuật toán AS được thực thi trên máy tính có bộ xử lý 2.4 GHz và 512 MB bộ nhớ
trong, trong khi thuật toán MS và GA được thực thi trên máy tính có cùng cấu hình với Intel
Pentium core i7 2.93 Ghz và 8GB bộ nhớ trong. Do các thuật toán được thực thi trên các máy
tính có cấu hình khác nhau, bởi vậy, khó đánh giá một cách chính xác về thời gian chạy của
các thuật toán. Ta so sánh thời gian chạy trung bình của thuật toán GA so với thời gian chạy
trung bình thuật toán AS, MS trong trường hợp các thuật toán cho lời giải tốt nhất. Kết quả
thực nghiệm trong Bảng 4.19 cho thấy, thời gian chạy của thuật toán ACO-GA là cạnh tranh
với thời gian chạy của thuật toán AS, nhưng không tốt bằng thời gian chạy thuật toán MS.

93
Bảng 4. 14 Kết quả so sánh các thuật toán cho cho các bộ dữ liệu nhỏ
Bộ dữ liệu File dữ OPT GA ACO−GA
liệu
Best Aver T Best Aver T
gap1[%] STDV gap1[%]
Sol Sol (phút) Sol Sol (phút)
eil51 6140 6140 6140 0.00 1.25 6140 6140 0.00 0.00 0.21
eil76 5894 5894 5894 0.00 1.30 5894 5894 0.00 0.00 0.20
st70 7801 7801 7801 0.00 1.25 7801 7801 0.00 0.00 0.20
rat195 18058 18058 18285 0.00 1.35 18058 18058 0.00 0.00 0.19
kroA100 239680 241012 241741 0.56 1.30 239680 239854 0.00 0.00 0.21
kroB100 245999 247541 248041 0.63 1.25 245999 246152 0.00 0.00 0.15
Bộ dữ liệu thực 1 kroC100 1122890 11451241147815 1.98 1.40 1122890 1122890 0.00 0.00 0.14
berlin52 1372572 13725721372952 0.00 1.45 1372572 1372854 0.00 0.00 0.18
pr76 1122891 11235411123654 0.06 1.35 1122891 1122301 0.00 0.00 0.16
tsp225 27523 27523 27618 0.00 1.40 27523 27523 0.00 0.00 0.12
tss225 1138068 11380681138230 0.00 1.35 1138068 1138068 0.00 0.00 0.17
Lin105 140450 140450 140542 0.00 1.40 140450 140450 0.00 0.00 0.18
Trung bình 0.27 1.34 0.00 0.00 0.18
test 1 8105 8105 8105 0.00 1.35 8105 8105 0.00 0.00 0.17
test 2 9248 9248 9248 0.00 1.40 9248 9248 0.00 0.00 0.18
test 3 8584 8630 8658 0.54 1.35 8584 8584 0.00 0.00 0.20
test 4 9240 9263 9267 0.25 1.30 9240 9278 0.00 0.00 0.19
test 5 8097 8097 8097 0.00 1.35 8097 8138 0.00 0.00 0.18
Bộ dữ liệu ngẫu
test 6 9490 9506 9519 0.17 1.40 9490 9490 0.00 0.00 0.17
nhiên 1
test 7 8450 8517 8564 0.79 1.35 8450 8450 0.00 0.00 0.20
test 8 8426 8426 8426 0.00 1.50 8426 8426 0.00 0.00 0.21
test 9 8987 9018 9023 0.34 1.35 8987 8987 0.00 0.00 0.20
test 10 9705 9713 9719 0.08 1.40 9705 9705 0.00 0.00 0.18
Trung bình 0.11 1.37 0.00 0.00 0.19
test 1 9526 9526 9556 0.00 1.35 9526 9545 0.00 0.00 0.19
test 2 8827 8838 8872 0.12 1.25 8827 8827 0.00 0.00 0.17
test 3 9440 9450 9475 0.11 1.30 9440 9440 0.00 0.00 0.18
test 4 8539 8539 8539 0.00 1.35 8539 8562 0.00 0.00 0.16
test 5 8321 8321 8321 0.00 1.35 8321 8321 0.00 0.00 0.17
Bộ dữ liệu ngẫu
test 6 8327 8434 8457 1.28 1.30 8327 8327 0.00 0.00 0.19
nhiên 2
test 7 8300 8300 8300 0.02 1.25 8300 8300 0.00 0.00 0.18
test 8 9520 9520 9520 0.00 1.35 9520 9520 0.00 0.00 0.19
test 9 9759 9769 9792 0.10 1.40 9759 9759 0.00 0.00 0.17
test 10 8782 8785 8813 0.03 1.35 8782 8782 0.00 0.00 0.18
Trung bình 0.17 1.32 0.00 0.00 0.18

94
Bảng 4. 15 Kết quả so sánh các thuật toán cho bộ dữ liệu ngẫu nhiên 3 (TPR-50-Rx)
GA ACO−GA
File dữ liệu OPT T
Best Sol gap1[%] T Best Sol Aver Sol STDV gap1[%]
(phút)
TRP-50-R1 12198 12709 4.19 1.50 12198 12198 0.00 0.00 0.34
TRP-50-R2 11621 12845 10.53 1.60 11621 11621 0.00 0.00 0.32
TRP-50-R3 12139 12904 6.30 1.75 12139 12139 0.00 0.00 0.28
TRP-50-R4 13071 13925 6.53 1.80 13071 13071 0.00 0.00 0.34
TRP-50-R5 12126 12726 4.95 1.45 12126 12126 0.00 0.00 0.37
TRP-50-R6 12684 13245 4.42 1.55 12684 12684 0.00 0.00 0.32
TRP-50-R7 11176 11991 7.29 1.60 11176 11176 0.00 0.00 0.35
TRP-50-R8 12910 13558 5.02 1.55 12910 12910 0.00 0.00 0.36
TRP-50-R9 13149 13845 5.29 1.65 13149 13149 0.00 0.00 0.37
TRP-50-R10 12892 13740 6.58 1.45 12892 12892 0.00 0.00 0.35
TRP-50-R11 12103 12565 3.82 1.40 12103 12103 0.00 0.00 0.36
TRP-50-R12 10633 11657 9.63 1.45 10633 10633 0.00 0.00 0.40
TRP-50-R13 12115 12870 6.23 1.50 12115 12115 0.00 0.00 0.32
TRP-50-R14 13117 13659 4.13 1.55 13117 13117 0.00 0.00 0.37
TRP-50-R15 11986 12793 6.73 1.60 11986 11986 0.00 0.00 0.38
TRP-50-R16 12138 12803 5.48 1.65 12138 12138 0.00 0.00 0.40
TRP-50-R17 12176 13387 9.95 1.70 12176 12176 0.00 0.00 0.37
TRP-50-R18 13357 13988 4.72 1.75 13357 13357 0.00 0.00 0.30
TRP-50-R19 11430 11911 4.21 1.50 11430 11430 0.00 0.00 0.41
TRP-50-R20 11935 12409 3.97 1.50 11935 11935 0.00 0.00 0.36
Trung bình 6.02 1.58 0.00 0.00 0.35

Bảng 4. 16 Kết quả so sánh các thuật toán cho bộ dữ liệu ngẫu nhiên 3 (TPR-100-Rx)
UB AS MS GA ACO−GA
File dữ liệu T
Best Sol gap2[%] Best Sol gap[%]Best Sol gap2[%] T Best Sol Aver Sol STDV gap2[%]
(phút)
TRP-100-R1 35334 - - 32779 7.23 35334 0.00 3.10 32779 32779 0.00 7.23 0.81
TRP-100-R2 38442 - - 33435 13.02 36773 4.34 3.20 33435 33435 0.00 13.02 0.75
TRP-100-R3 37642 - - 32390 13.95 35150 6.62 3.55 32390 32390 0.00 13.95 0.76
TRP-100-R4 37508 - - 34733 7.40 37508 0.00 3.65 34733 34733 0.00 7.40 0.81
TRP-100-R5 37215 - - 32598 12.41 35254 5.27 3.35 32598 32598 0.00 12.41 0.81
TRP-100-R6 40422 - - 34159 15.49 36988 8.50 3.25 34212 34212 0.00 15.36 0.73
TRP-100-R7 37367 - - 33375 10.68 36897 1.26 3.15 33375 33375 0.00 10.68 0.80
TRP-100-R8 38086 - - 31780 16.56 35408 7.03 3.20 31780 31780 0.00 16.56 0.81
TRP-100-R9 36000 - - 34167 5.09 36415 1.15 3.40 34167 34167 0.00 5.09 0.80
TRP-100-R10 37761 - - 31605 16.30 34018 9.91 3.50 31812 31812 0.00 15.75 0.78
TRP-100-R11 37220 - - 34188 8.15 37006 0.57 3.55 34188 35534 0.00 8.15 0.75
TRP-100-R12 34785 - - 32146 7.59 35437 1.87 3.25 32899 32899 0.00 5.42 0.70
TRP-100-R13 37863 - - 32604 13.89 35239 6.93 3.35 31989 31989 0.00 15.51 0.72
TRP-100-R14 36362 - - 32433 10.81 34869 4.11 3.40 33601 33601 0.00 7.59 0.78
TRP-100-R15 39381 - - 32574 17.28 35640 9.50 3.50 32574 32574 0.00 17.28 0.72
TRP-100-R16 39823 - - 33566 15.71 37083 6.88 3.45 34818 34818 0.00 12.57 0.74
TRP-100-R17 41824 - - 34198 18.23 37058 11.40 3.55 36297 36297 0.00 13.21 0.71
TRP-100-R18 39091 - - 31929 18.32 35109 10.19 3.60 31929 31929 0.00 18.32 0.73
TRP-100-R19 39941 - - 33463 16.22 36457 8.72 3.20 33463 33463 0.00 16.22 0.73
TRP-100-R20 39888 - - 33632 15.68 35998 9.75 3.15 33632 33632 0.00 15.68 0.72
Trung bình 11.56 13.00 5.70 3.37 0.00 12.37 0.76

95
Bảng 4. 17 Kết quả so sánh các thuật toán cho bộ dữ liệu ngẫu nhiên 3 (TPR-200-Rx)
UB AS MS GA ACO−GA
File dữ liệu T T
Best Sol gap2[%] Best Sol gap2[%] Best Sol gap2[%] Best Sol Aver Sol STDV gap2[%]
(phút) (phút)
TRP-200-R1 105044 - - 88787 15.48 102400 2.52 6.13 88787 88873 27 15.48 2.58
TRP-200-R2 104073 - - 91977 11.62 104174 0.10 6.40 91977 91991 4 11.62 2.50
TRP-200-R3 111644 - - 92568 17.09 102333 8.34 6.27 92568 92568 0 17.09 2.48
TRP-200-R4 104956 - - 93174 11.23 102596 2.25 6.20 93174 93196 7 11.23 2.53
TRP-200-R5 101912 - - 88737 12.93 100161 1.72 6.40 88737 88925 59 12.93 2.55
TRP-200-R6 103751 - - 91589 11.72 101514 2.16 6.33 91589 91645 18 11.72 2.62
TRP-200-R7 109810 - - 92754 15.53 102134 6.99 6.20 92754 92754 0 15.53 2.67
TRP-200-R8 103830 - - 89048 14.24 99845 3.84 6.27 89048 89066 6 14.24 2.63
TRP-200-R9 100946 - - 86326 14.48 97113 3.80 6.20 86326 86326 0 14.48 2.52
TRP-200-R10 108061 - - 91552 15.28 101414 6.15 6.13 91552 91552 0 15.28 2.60
TRP-200-R11 103297 - - 92655 10.30 103368 0.07 6.07 92655 92689 11 10.30 2.58
TRP-200-R12 107715 - - 91457 15.09 104090 3.37 6.33 91457 91461 1 15.09 2.62
TRP-200-R13 100505 - - 86155 14.28 101366 0.86 6.47 86155 86155 0 14.28 2.70
TRP-200-R14 107543 - - 91882 14.56 102002 5.15 6.33 91882 91882 0 14.56 2.55
TRP-200-R15 100196 - - 88912 11.26 101739 1.54 6.20 88912 88960 15 11.26 2.53
TRP-200-R16 104462 - - 89311 14.50 100235 4.05 6.13 89311 89311 0 14.50 2.73
TRP-200-R17 107216 - - 89089 16.91 100672 6.10 6.07 89089 89103 4 16.91 2.72
TRP-200-R18 108148 - - 93619 13.43 106565 1.46 6.53 93619 93619 0 13.43 2.55
TRP-200-R19 105716 - - 93369 11.68 104135 1.50 6.27 93369 93369 0 11.68 2.48
TRP-200-R20 116676 - - 86292 26.04 98771 15.35 6.20 86292 86292 0 26.04 2.53
Trung bình 11.33 14.38 3.87 6.27 8 14.38 2.58

96
Bảng 4. 18 Kết quả so sánh các thuật toán cho bộ dữ liệu thực 2
AA AS MS GA ACO-GA
File dữ liệu T T
Best Sol Best Sol Best Sol Best Sol Best Sol Aver Sol STDV
(phút) (phút)
st70 26384 19553 19215 19893 2.12 19215 19682 393 0.51
rat195 280900 213371 210191 245412 6.23 210191 212125 1543 2.81
kroD100 1297932 976830 949594 976830 3.67 948325 949451 1915 0.80
pr226 10421449 7226554 7100308 7212541 6.45 7100308 7165565.7 36277 3.12
lin105 780662 585823 585823 598375 3.74 585823 592649 6673 0.98
pr107 2205490 1983475 1980767 1987110 3.77 1973726 1984541 7351 1.10
lin318 7475822 5876537 5560679 5876537 11.8 5560679 5579584 11443 4.51
pr439 24126010 18567170 17688561 18567170 18.5 17688561 17688561 0 11.5
rat99 75048 56994 54984 58327 3.75 57896 57896 0 0.65
att532 - 18448435 5581240 18448435 21.5 18448435 18448435 0 19.5
berlin52 197137 - - 142512 1.61 135559 142154 2468 0.42
bier127 5929120 - - 5011031 4.25 4768611 4768611 0 1.32
ch130 455849 - - 366578 5.01 362432 363661 672 2.21
ch150 571369 - - 474075 5.23 451280 452959 2425 1.32
d198 1380470 - - 1289590 6.24 1204997 1204997 0 2.89
eil101 38582 - - 30235 3.57 29123 29123 0 1.12
eil51 14683 - - 10281 1.84 9952 9952 0 0.32
eil76 26128 - - 18243 2.12 17419 17419 0 0.52
gil262 393641 - - 327534 9.12 325679 325679 0 4.23
kroA100 1307340 - - 1025339 3.60 971982 971982 0 1.20
kroA150 2494782 - - 2118357 5.12 1931392 1931392 0 1.54
kroA200 3387616 - - 2962453 6.47 2845318 2885421 28246 2.75
kroB100 1274207 - - 992121 3.56 990278 990334 179 1.05
kroB150 2376125 - - 1902332 5.10 1800535 1821541 22194 1.22
kroB200 3731218 - - 2912145 6.45 2845318 2962410.7 41142 2.62
kroC100 1207746 - - 992515 3.51 946859 949669 8508 0.98
kroE100 1345314 - - 984759 3.42 955272 975421 17353 1.01
pr124 4778217 - - 3264941 4.12 3106094 3112144 15925 1.21
pr136 8720053 - - 7197617 4.35 6415416 6430724 49831 1.45
pr264 7674241 - - 6187494 5.02 6121700 6121700 0 4.23
pr76 4359810 - - 3543367 5.12 3543367 3543367 0 0.45
rd100 458419 - - 359096 5.7 355985 355985 0 0.85
ts225 17953213 - - 14372227 8.7 13577376 13652145 57374 2.98
tsp225 537080 - - 463666 9.4 401012 401012 0 3.01
u159 3837650 - - 3169661 6.7 3077619 3077619 0 1.59

Bảng 4. 19 Mô tả T theo phút với các bộ dữ liệu lớn

Bộ dữ liệu AS MA GA ACO-GA

Bộ dữ liệu thực 1 10.7 4.54 8.51 4.55


Bộ dữ liệu ngẫu nhiên 3 (TPR-100-Rx) 1.68 0.12 3.37 0.76
Bộ dữ liệu ngẫu nhiên 3 (TPR-200-Rx) 66.58 1.2 6.27 2.85
Trung bình 26.32 1.95 6.05 2.72

97
4.3 Thuật toán lai thuật toán Tabu và thuật toán lân cận biến đổi

Nghiên cứu thực nghiệm cho thấy chất lượng lời giải thu được từ thuật toán ACO-GA tốt
hơn chất lượng lời giải của các thuật toán meta-heuristic hiện biết trên nhiều file dữ liệu. Tuy
nhiên, thời gian chạy của thuật toán còn chưa đáp ứng được các yêu cầu thực tiễn. Lý do đến
từ việc ta phải thực hiện tính toán cho cả một quần thể các cá thể lời giải, trong đó mỗi lời
giải tương ứng với một điểm trong không gian tìm kiếm lời giải của bài toán. Ở mục này,
chúng tôi trình bày thuật toán meta-heuristic TS-VNS lai ghép giữa thuật toán Tabu [20, 46]
và thuật toán lân cận biến đổi (Variable neighborhood search-VNS) [21, 22, 23, 33]. Trong
đó, thuật toán Tabu có vai trò tránh việc duyệt lại những lời giải đã được khảo sát và định
hướng cho thuật toán lân cận biến đổi thoát khỏi cực trị địa phương. Ngược lại, thuật toán lân
cận biến đổi tạo ra các lân cận đa dạng cho thuật toán Tabu. Trong thuật toán, ta chỉ xuất phát
từ một lời giải ban đầu và thực hiện biến đổi nó. Do đó, khối lượng tính toán của thuật toán
đơn lời giải sẽ ít hơn khối lượng tính toán của thuật toán đa lời giải như thuật toán GA và
thuật toán ACO-GA. Hiện nay, các thuật toán sử dụng cách tiếp cận đơn lời giải như thuật
toán TS-VNS đã được đề xuất [40, 43]. Tuy nhiên, các thuật toán này gặp phải vấn đề khi
chúng có thể duyệt lại không gian lời giải đã khảo sát trước đó. Bởi vậy, trong một số trường
hợp, chúng không thoát được vấn đề cực trị địa phương. Trong khi đó, nhờ sử dụng danh
sách tabu, thuật toán TS-VNS tránh việc duyệt lại không gian lời giải đã khảo sát trước đó.
Ngoài ra, chúng tôi cũng trình bày cấu trúc của các lân cận và độ phức tạp thời gian của thuật
toán khảo sát các lân cận này trong VNS. Kết quả nghiên cứu chỉ ra thứ tự thực hiện các
thuật toán lân cận và nhờ thực hiện theo thứ tự này, thuật toán TS-VNS đưa ra kết quả tốt
nhất. Thêm vào đó, độ phức tạp thời gian của việc tính độ trễ một lời giải lân cận là hằng số.

Để đánh giá hiệu quả của thuật toán đề xuất, chúng tôi tiến hành thực nghiệm thuật
toán trên các bộ dữ liệu. Từ kết quả thực nghiệm, chúng tôi đưa ra những đánh giá và so sánh
hiệu quả của thuật toán với các thuật toán khác.

4.3.1 Lƣợc đồ của thuật toán

Từ một lời giải ban đầu, thuật toán tabu lặp đi lặp lại việc tìm kiếm nhằm cải thiện dần lời
giải tốt nhất của bài toán. Tại mỗi bước lặp, thuật toán duyệt trong lân cận của lời giải hiện
tại để chọn ra lời giải tốt nhất và lời giải này thay thế cho lời giải hiện tại ở bước lặp kế tiếp.
Mỗi lời giải trong lân cận của lời giải hiện tại được gọi là một lân cận của lời giải hiện tại.
Việc thực hiện tác động lên lời giải hiện tại để biến nó thành một lân cận được gọi là một

98
bước chuyển (move). Điểm khác biệt căn bản của tìm kiếm tabu so với các thuật toán tìm
kiếm địa phương khác đó là: Tại mỗi bước lặp, để tránh việc duyệt trở lại những lời giải đã
từng được khảo sát, thuật toán tabu sử dụng một danh sách để lưu trữ một số bước chuyển đã
từng được sử dụng (ta gọi là danh sách tabu). Danh sách này sẽ chứa một số bước chuyển
vừa được thực hiện trong một số bước lặp ngay trước đó và các bước chuyển nằm trong danh
sách tabu được gọi là các bước chuyển tabu. Các bước chuyển này sẽ bị cấm sử dụng lại
chừng nào nó còn nằm trong danh sách tabu. Mỗi bước chuyển tabu sẽ nằm trong danh sách
tabu trong khoảng thời gian bước lặp, sau đó, bước chuyển này sẽ được loại khỏi danh sách
tabu và nó có thể lại được sử dụng. Thuật toán lân cận biến đổi là thuật toán meta-heuristic
được ứng dụng rộng rãi trong bài toán tối ưu hóa tổ hợp. Ý tưởng của thuật toán là sử dụng
đồng thời nhiều thuật toán lân cận để tìm kiếm lời giải tốt nhất. Việc tìm kiếm bắt đầu từ
thuật toán lân cận đầu tiên. Nếu tìm được kỉ lục mới thì ta tiếp tục tìm kiếm trong thuật toán
lân cận đó. Ngược lại, nếu không tìm được lời giải tốt hơn kỉ lục hiện có, thì thực hiện việc
tìm kiếm trong thuật toán lân cận kế tiếp.

Chúng tôi trình bày thuật toán meta-heuristic lai ghép giữa thuật toán Tabu và thuật
toán lân cận biến đổi (Variable neighborhood search-VNS). Chi tiết lược đồ thuật toán TS-
VNS xem trong Thuật toán 4.7. Mỗi đường đi được mã hóa bởi một danh sách có thứ tự
gồm n đỉnh T = (v1, v2, …, vi, …, vn), trong đó vi là đỉnh thứ i trong đường đi. Ta cũng sẽ sử
dụng ký hiệu T[i] để chỉ đỉnh thứ i trong danh sách T. Đầu tiên, ta sử dụng thủ tục GRASP
[16] để khởi tạo lời giải ban đầu. Sau đó, thuật toán lặp đi lặp lại việc thực hiện bốn bước cho
đến tận khi điều kiện dừng thỏa mãn. Bước 2 ta áp dụng thuật toán lân cận biến đổi. Trong
bước 3, ta xây dựng một danh sách lời giải ứng viên và nó là đầu vào cho bước tăng cường
(bước 4). Mục đích của bước tăng cường là khai thác không gian lời giải đã có. Cuối cùng,
để khai phá miền không gian lời giải chưa được khảo sát, bước đa dạng hóa (bước 5) được áp
dụng.

Bước 1: Khởi tạo lời giải ban đầu cho thuật toán như trong Thuật toán 4.8. Ban đầu,
với mỗi đỉnh, ta tạo một danh sách ký hiệu là RCL (RCL là viết tắt của Restricted candidate
list) chứa các đỉnh có khoảng cách gần với đỉnh đó nhất. Kích thước của danh sách RCL là
m, và cần được chọn sao cho cân bằng giữa đặc tính ngẫu nhiên và đặc tính tham lam. Nếu
giá trị m càng lớn thì việc khởi tạo thiên về tính ngẫu nhiên càng nhiều, còn nếu giá trị m
càng nhỏ thì việc khởi tạo thiên về tính tham lam nhiều hơn.

99
Bước 2: Ta sử dụng các thuật toán lân cận như remove-insert, swap-adjacent, move-
down, move-up, swap-adjacent, 2-opt, 2-edge-opt [26], move-forward-k-vertices và move-
backward-k-vertices. Các thuật toán này sẽ khảo sát tất cả các lời giải trong lân cận của lời
giải T để tìm ra lời giải tốt hơn. Ta không xem xét 3-opt bởi vì độ phức tạp thời gian (O(n3))
của nó là lớn. Đối với các lân cận này, ngoại trừ remove-insert, ta chỉ ra cách cách tính độ trễ
của một lời giải trong lân cận (hay còn gọi là lời giải lân cận) của lời giải hiện tại với thời
gian O(1). Bây giờ, ta mô tả cấu trúc của các lân cận và độ phức tạp thời gian của thuật toán
khảo sát các lân cận này.

Remove-insert. Lời giải lân cận của lời giải hiện tại T thu được bằng cách di chuyển một
đỉnh đến vị trí cuối cùng trong T. Một cách chính xác, lân cận của lời giải T trong Remove-
insert là N1(T) = {Ti = (v1, v2, …, vi-1, vi+1, …, vn, vi) | i = 2, 3, …, n −1}. Kích thước của
N1(T) rõ ràng là O(n).
Mệnh đề 4.1. Độ phức tạp thời gian của Remove-insert để duyệt N1(T) là O(n2).
Chứng minh. Giả sử lời giải hiện tại T = v1, v2, ..., vi−1, vi, vi+1, ..., vn với độ trễ L(T).
Remove-insert đòi hỏi tính độ trễ của lời giải lân cận Ti = v1, v2, ..., vi−1, vi+1, ..., vn, vi. Ta có:
L(T ) = (n − 1)c(v1, v2) + ... + (n − i + 1)c(vi−1, vi) +(n − i)c(vi, vi+1)
+ (n − i − 1)c(vi+1, vi+2) + ... + (vn−1, vn) , (4.8)

= (n − 1)c(v1, v2) + ... + (n − i + 1)c(vi−1, vi+1) +(n − i)c(vi+1, vi+2) + ... + 2(vn−1, vn)
L (Ti )
+ (vn, vi)
n 1 n 1

= L(T )   ( n  k )c (v , v
k i 1
k k 1 )  ( n  i  1)c (vi 1 , vi 1 )   (n  k  1)c(v , v
k i 1
k k 1 )

 c (vn , vi ) (4.9)

Việc tính L (Ti ) theo (4.9) đòi hỏi thời gian O(n). Do |N1(T)| = O(n), suy ra độ phức tạp thời
gian của Remove-insert để khảo sát tất cả các lời giải trong lân cận N1(T) là O(n2).

Swap adjacent. Để thu được lời giải lân cận của T, ta hoán đổi lần lượt vị trí mỗi cặp đỉnh
kề trong lời giải T. Lân cận của lời giải T trong Swap adjacent là tập N2(T) = {Ti = (v1, v2,
…, vi-2, vi, vi-1, vi+1, …, vn) | i = 3, 4, n-1}. Rõ ràng kích thước của N2(T) là O(n).
Mệnh đề 4.2. Độ phức tạp thời gian của Swap adjacent để duyệt N2(T) là O(n).
Chứng minh. Giả sử, ta có lời giải hiện tại T với độ trễ L(T) được tính theo (4.8). Swap
adjacent phải tính độ trễ của lời giải lân cận Ti = v1, v2, ..., vi−1, vi+1, vi ..., vn. Ta có:

100
Thuật toán 4.7. Lược đồ thuật toán tìm kiếm Tabu
Đầu vào: v1, Kn, L, Ni(T) lần lượt là đỉnh xuất phát, đồ thị đầy đủ, danh sách lời giải tiềm
năng và tập các thuật toán lân cận.
Đầu ra: Lời giải tốt nhất T* trong LT.
1. BEGIN
2. T  GRASP (v1, V); //Bước 1: Khởi tạo một lời giải ban đầu
3. //Bước 2: Thuật toán lân cận biến đổi
4. WHILE điều kiện dừng chưa thỏa mãn do
5. for i =1 to 8 do
T   arg minT Ni (T ) L(T )
6.
7. if (L( T  ) < L(T)) và T  không thuộc danh sách tabu) || (L( T  ) < L( T * )) then
8. T ← T  ; i ← 1;
9. Cập nhập danh sách Tabu;
10. else
11. i++;
12. end if
13. end for
14. //Bước 3: (Tạo danh sách lời giải tiềm năng LT)
15. if (L(T) < (1.05-1.07)×L(T*)) then
16. LT ← LT ∪ {T};
17. if | LT | == 4 then
18. Chuyển sang bước 4;
19. else
20. Quay lại bước 2;
21. //Bước 4: (Tăng cường hóa)
22. for j = 1 → 4 do
23. Với mỗi hành trình LT[j] quay lại bước 1 mà không sử dụng danh sách Tabu;
24. //Bước 5: (Đa dạng hóa)
25. Xóa toàn bộ danh sách tabu;
26. Chọn ngẫu nhiên một lời giải bất kỳ trong LT, giả sử đó là LT[h]
27. Hoán đổi ngẫu nhiên k đỉnh lời giải LT[h];
28. Quay lại bước 2 với lời giải LT[h];
29. endwhile
30. END

Thuật toán 4.8. GRASP (Thủ tục khởi tạo lời giải ban đầu)
Đầu vào: v1, V, và α là đỉnh xuất phát, tập các đỉnh ban đầu, và kích thước của RCL.
Đầu ra: Lời giải ban đầu T.
1. BEGIN
2. x ← v1;
3. WHILE |x| < n
4. Tạo RCL với m đỉnh vi  V gần với vl; // vl là đỉnh cuối trong T;
5. Chọn ngẫu nhiên v  {vi | vi  RCL và v i  T }
6. T = T ∪vi;
7. end while
8. return T;
9. END

101
L (Ti ) = (n − 1)c(v1, v2) + ... + (n − i + 1)c(vi−1, vi+1) +(n − i)c(vi+1, vi)
+ (n − i − 1)c(vi, vi+2) + ... + (vn−1, vn) (4.10)

Từ (4.8) và (4.10), ta có:

L (Ti ) = L(T) − (n − i + 1)c(vi−1, vi) − (n – i– 1)c(vi+1, vi+2) + (n − i + 1)c(vi−1, vi+1)

+ (n – i − 1)c(vi, vi+2) (4.11)

Việc tính L (Ti ) theo (4.11) đòi hỏi thời gian O(1). Suy ra độ phức tạp thời gian của Swap
adjacent để duyệt N2(T) là O(n).

Swap. Để thu được lời giải lân cận của T ta thực hiện hoán đổi lần lượt vị trí mỗi cặp đỉnh
trong nó. Lân cận của lời giải T trong Swap là tập N3(T) = {Tij = (v1, v2, …, vi-1, vj, vi+1, …,
vj-1, vi, vj+1, vn) | i = 2, 3, n − 3; j = i + 3, …, n}. Rõ ràng kích thước của N3(T) là O(n2).
Mệnh đề 4.3. Độ phức tạp thời gian của Swap để duyệt N3(T) là O(n2).
Chứng minh. Giả sử, lời giải hiện tại là T = v1, v2, ..., vi−1, vi, vi+1, ..., vj−1, vj , vj+1, ..., vn (i + 2
< j). Thuật toán Swap cần tính độ trễ của lời giải lân cận Tij = v1, v2, ..., vi−1, vj, vi+1, ..., vj−1,

vi,vj+1, ..., vn. Ta có:


L(T ) = (n − 1)c(v1, v2) + ... + (n − i + 1)c(vi−1, vi) +(n − i)c(vi, vi+1)
+ … + (n – j + 1)c(vj-1, vj) + (n – j) c(vj, vj+1) + ... + (vn−1, vn). (4.12)
L(Tij ) = (n − 1)c(v1, v2) + ... + (n − i + 1)c(vi−1, vj) +(n − i)c(vj, vi+1)
+ … + (n – j + 1)c(vj-1, vi) + (n – j)c(vi, vj+1) + ... + (vn−1, vn). (4.13)

Từ (4.12) và (4.13), ta có:

L(Tij ) = L(T) − (n − i + 1)c(vi−1, vi) − (n − i)c(vi, vi+1)−(n − j + 1)c(vj−1, vj )


− (n − j)c(vj , vj+1) +(n − i + 1)c(vi−1, vj ) + (n − i)c(vj, vi+1)+(n − j + 1)c(vj−1, vi)
+ (n − j)c(vi, vj+1).
(4.14)

Việc tính L(Tij ) theo (4.14) đòi hỏi thời gian O(1). Suy ra, độ phức tạp của Swap để duyệt

N3(T) là O(n2).

2-opt. Việc tạo lời giải lân cận của T được thực hiện nhờ hoán đổi lần lượt các cặp cạnh
trong T. Lân cận của lời giải T trong 2-opt là tập N4(T) = {Tij = (v1, v2, …, vi, vj, vi+2, …, vj-1,
vi+1, vj+1, …, vn) | i = 2, 3, n − 1; j = i + 1, …, n}. Kích thước của N4(T) rõ ràng là O(n2).

102
Mệnh đề 4.4 Độ phức tạp thời gian của 2-opt để duyệt N4(T) là O(n2).
Chứng minh. Giả sử, lời giải hiện tại là T với độ trễ L(T) tính theo (4.12). Thuật toán 2-opt
cần tính độ trễ của lời giải lân cận Tij = v1, v2, ..., vi−1, vi, vj, vi+2, ..., vj−1, vi+1,vj+1, ..., vn. Ta có:

L(Tij ) = (n − 1)c(v1, v2) + ... + (n − i)c(vi, vj) + (n – i – 1)c(vj, vi+2)


+… + (n – j + 1)c(vj-1, vi+1) + (n – j)c(vi+1, vj+1) + ... + (vn−1, vn). (4.15)

Từ (4.12) và (4.15), ta có:

L(Tij ) = L(T) − (n − i)c(vi, vi+1) − (n – i − 1)c(vi+1, vi+2)−(n − j + 1)c(vj−1, vj )


− (n − j)c(vj, vj+1) + (n − i)c(vi, vj ) + (n − i − 1)c(vj, vi+2)
+ (n − j + 1)c(vj−1, vi+1) − (n − j)c(vi+1, vj+1). (4.16)
Việc tính L(Tij ) theo (4.16) đòi hỏi thời gian O(1). Do đó, độ phức tạp của 2-opt để duyệt

N4(T) là O(n).

Move-up (down). Lời giải lân cận của T thu được nhờ di chuyển mỗi đỉnh lên (hoặc xuống)
một vị trí trong lời giải T. Lân cận của Move-up là tập N5(T) = {Ti = (v1, v2, …, vi-2, vi, vi-1,
vi+1, …, vn) | i = 3, 4, n}. Tương tự như vậy, cấu trúc lân cận của Move- down là N6(T) = {Ti
= (v1, v2, …, vi-1, vi+1, vi, vi+2, …, vn) | i = 2, 3, n-1}. Kích thước của N5(T) cũng như N6(T) rõ
ràng là O(n).
Mệnh đề 4.5. Độ phức tạp thời gian của Move-up (down) để duyệt N4(T) là O(n).
Chứng minh. Ta chứng minh Mệnh đề 4.5 cho Move-up. Việc chứng minh cho Move-
down được thực hiện tương tự.
Giả sử, lời giải hiện tại T với độ trễ L(T) tính theo (4.8). Thuật toán cần tính độ trễ của lời
giải lân cận Ti = v1, v2, ..., vi−2, vi, vi-1, vi+1..., vn. Ta có:

L (Ti ) = (n − 1)c(v1, v2) + ... + (n − i + 2)c(vi−2, vi) +(n – i + 1)c(vi, vi-1)


+ (n – i)c(vi-1, vi+1) + ... + (vn−1, vn) (4.17)

Từ (4.8) và (4.17), ta có:

L (Ti ) = L(T) − (n − i + 2)c(vi−2, vi-1) − (n − i)c(vi, vi+1)


+ (n − i + 2)c(vi−2, vi) + (n − i)c(vi-1, vi+1) (4.18)
Việc tính L (Ti ) theo (4.18) đòi hỏi thời gian O(1). Do đó, độ phức tạp thời gian của Move-up
để duyệt N5(T) là O(n).

Move-forward (backward)-k-vertices: Lời giải lân cận của lời giải T trong Move-k-
forward thu được bằng cách di chuyển một dãy k (k = 1, 2, …, l) đỉnh liên tiếp nhau từ vị trí

103
thứ i + 1 sang bên phải vị trí thứ j của T. Move-k-backward thực hiện tương tự, sự khác biệt
duy nhất là thay vì dịch sang bên phải thì chúng tôi dịch sang bên trái. Lân cận của lời giải T
trong Move-forward-k-vertices là tập N7(T) = {Tijk = (v1, v2, …, vi, vi+k+1, vi+k+2, …, vj, vi+1,
vi+2, …, vi+k, vj+1, …, vn) | i = 2, 3, …, n−l−1 và i+l < j ≤ n}. Kích thước của N7(T) là O(n2).
Trong khi đó, lân cận của lời giải T trong Move-backward-k-vertices là tập N8(T) = {Tijk =
(v1, v2, …, vi, vi+k+1, vi+k+2, …, vi+1, vi+2, vi+3, …, vi+k, vj, vj+1, …, vn) | i = 2, 3, …, n−l−1 và i+l
< j ≤ n}. Kích thước của N8(T) là O(n2).

Mệnh đề 4.6. Độ phức tạp thời gian của Move-forward (backward)-k-vertices để duyệt
N8(T) là O(n2×l).
Chứng minh. Chúng tôi chứng minh Mệnh đề 4.6 cho move-forward-k-vertices. Việc
chứng minh cho move-backward-k-vertices được thực hiện tương tự.
Giả sử, lời giải hiện tại L = v1, v2, ..., vi, vi+1, vi+2, ..., vi+k−1, vi+k, vi+k+1, vi+k+2, ..., vj, vj+1, ..., vn,
vi. Ta cần tính độ trễ của lời giải lân cận Tijl = v1, v2, ..., vi, vi+k+1, vi+k+2, ..., vj, vi+1, vi+2, ..., vi+k,

vj+1, ..., vn. Ta có:


i  k 1
L(Tijk ) = L(T )  ( j  i  k )  c(vh , vh 1 )  c(vi , vi 1 )  c(v j , v j 1 )  (n  i  k )c(vi  k , vi  k 1 )
h  i 1
j 1
k 
h  i  k 1
c (vh , vh 1 )  (n  i )c (vi , vi  k 1 )  (n  j )c (vi  k , v j 1 )  (n  j  k )c (v j , vi 1 )

(4.19)
Việc tính L(Tijk ) theo (4.19) đòi hỏi thời gian O(l). Suy ra, độ phức tạp thời gian của move-

forward-k-vertices để duyệt N7(T) là O(n2×l).

Thứ tự thực hiện các thuật toán lân cận trong VNS được xác định dựa trên kích thước
không gian lân cận (là kích thước của các tập |Ni(T)| (i=1, …, 8)) mà các thuật toán này sẽ
duyệt. Thuật toán có kích thước không gian lân cận cần duyệt nhỏ sẽ được thực hiện trước.
Khi không thể cải thiện được lời giải tốt nhất thì thuật toán có kích thước không gian lân cận
lớn hơn sẽ được sử dụng. Đối chiếu với phần mô tả của các cấu trúc lân cận thì chúng ta xác
định thứ tự thực hiện các thuật toán lân cận trong VNS sẽ là: move (down)-up, swap
adjacent, remove-insert, swap, 2-opt, và move-k-vertices-forward (backward). Tại mỗi bước
thực hiện thuật toán lân cận, một bước chuyển (move) sẽ được chọn nếu nó cải thiện được lời
giải hiện tại và không nằm trong danh sách tabu hoặc nếu nằm trong danh sách tabu nhưng
cải thiện được lời giải tốt nhất hiện có. Do sự khác biệt về cấu trúc lân cận của từng thuật
toán lân cận, bởi vậy, hai danh sách tabu được xây dựng. Bước chuyển được thực hiện trong
remove-insert, swap-adjacent, hoặc move-up (down) được lưu trữ trong danh sách tabu 1.

104
Trong khi đó, bước chuyển tương ứng với bước chuyển được thực hiện trong 2-opt và 2-
edge-opt được lưu trữ trong danh sách tabu 2. Ta không sử dụng danh sách tabu cho các
move-forward-k-vertices và move-backward-k-vertices. Khi mỗi loại bước chuyển được thực
hiện thì danh sách tabu tương ứng sẽ được cập nhập. Ta khởi tạo kích thước các danh sách
tabu (tabu tenure) ngẫu nhiên giữa 10 và 20.

Bước 3: Tại bước này, ta xây dựng danh sách các lời giải tiềm năng LT. Nếu tổng độ
trễ của lời giải hiện tại nằm trong khoảng tử 5-7% tổng độ trễ của lời giải tốt nhất thì nó được
bổ sung vào danh sách LT. Khi kích thước của danh sách LT bằng 5, thì thuật toán chuyển
sang bước 3, ngược lại, ta quay trở về bước 2. Ta chọn kích thước của LT là 5 nhằm đảm bảo
sự cân bằng giữa tính khai thác (exploitation) không gian tìm kiếm lời giải đã có và tính khai
phá (exploration) không gian tìm kiếm lời giải mới. Nếu kích thước của LT là nhỏ thì bước
tăng cường hóa và đa dạng hóa được thực hiện nhiều lần. Điều đó có thể dẫn thuật toán tới
một không gian tìm kiếm lời giải mới mà bỏ qua không gian tìm kiếm lời giải tốt đang được
khai thác. Ngược lại, nếu giá trị LT là lớn, thì bước tăng cường hóa và đa dạng hóa ít được
thực thi và thuật toán dễ rơi vào cực trị địa phương.

Bước 4: Khi kích thước danh sách lời giải tiềm năng là 5, bước tăng cường hóa được
thực hiện. Vai trò của bước tăng cường là khai thác vùng không gian lời giải đang khảo sát.
Mỗi lời giải trong danh sách LT được đưa vào thuật toán VNS mà không có sự giới hạn nào
về bước chuyển tabu.

Bước 5: Đầu tiên, các danh sách tabu được xóa. Sau đó, bước đa dạng được thực hiện
bằng cách hoán đổi ngẫu nhiên vị trí của p đỉnh trong mỗi lời giải thuộc danh sách LT và
quay trở lại bước 2.

Cuối cùng, ta thảo luận điều kiện dừng thuật toán. Thuật toán sẽ dừng nếu sau một
vài vòng lặp (ký hiệu: NL), lời giải tốt nhất không được cải thiện.

Bây giờ, ta đánh giá độ phức tạp thời gian của thuật toán TS-VNS. Ta thấy rằng phần
lớn thời gian thực hiện TS-VNS là để thực hiện VNS. Trong VNS, thì thuật toán move-
forward (backward)-k-vertices có độ phức tạp thời gian lớn nhất là O(n2×l). Giả sử, k1 là số
lần thực hiện move-forward (backward)-k-vertices cho đến khi TS-VNS kết thúc, thì độ
phức tạp thời gian của thuật toán TS-VNS là O(k1×n2×l).

105
4.3.2 Kết quả thực nghiệm

Tất cả thực nghiệm được tiến hành trên máy tính cá nhân với Intel Pentium core i7 2.93 Ghz
và 8GB bộ nhớ trong.

Để đánh giá hiệu quả của thuật toán, hai thực nghiệm được tiến hành. Dữ liệu trong
thực nghiệm đầu tiên bao gồm các file dữ liệu nhỏ trong bộ dữ liệu ngẫu nhiên từ 1 đến 3 và
bộ dữ liệu thực 2. Thực nhiệm thứ hai được tiến hành với các file dữ liệu lớn trong bộ dữ liệu
thực 1 và bộ dữ liệu ngẫu nhiên 3. Đối với các file dữ liệu nhỏ, lời giải tối ưu từ thuật toán
đúng cho phép ta đánh giá chính xác hiệu quả của thuật toán. Đối với các file dữ liệu lớn, khi
mà lời giải tối ưu chưa được biết đến, hiệu quả của thuật toán chỉ được đánh giá một cách
tương đối. Trong thực nghiệm thứ hai, ta chọn lời giải của thuật toán lân cận gần nhất trong
[40] như là lời giải cơ sở để đánh giá hiệu quả của các thuật toán.

Các tham số trong thuật toán được khởi tạo: α = 10, k = 10, m = 10 và NL = 150, p = 5
(các ký hiệu đã giải thích ở trên). Việc xác định các tham số trong thuật toán cũng được thực
hiện tương tự như trong việc xác định tham số trong thuật toán di truyền. Ta gọi AA, AS, MS
lần lượt là thuật toán của Archer et al. [1], A. Salehipour et al. [40], M. Silva et al. [43].
Trong các Bảng từ 4.20 đến 4.25, cột OPT, Aver Sol, Best Sol, lần lượt là độ trễ tối ưu, độ trễ
trung bình và độ trễ tốt nhất thu được sau 10 lần chạy; cột gap1[%]và cột gap2[%] được tính
như đã mô tả ở mục 1.5; cột STDV là đo độ lệch chuẩn của độ trễ lời giải sau 10 lần chạy; và
cột T là thời gian chạy của các thuật toán tính theo phút. Trong Bảng 4.25, kết quả thực
nghiệm của thuật toán Archer et al. được lấy từ [1]. Dấu “−” trong mỗi cột nghĩa là không có
kết quả thực nghiệm của thuật toán với file dữ liệu tương ứng. Trong Bảng 4.27, thời gian
chạy trung bình của thuật toán AS và MS được lấy từ [40, 43].

4.3.2.1 Thực nghiệm các file dữ liệu nhỏ

Các file dữ liệu được thực thi 10 lần và kết quả thực nghiệm được trình bày trong Bảng 4.20
và 4.21 là kết quả trung bình của 10 lần chạy.

Kết quả thực nghiệm trong Bảng 4.20 và 4.21 cho thấy thuật toán TS-VNS tốt hơn
thuật toán GA cả về thời gian chạy và chất lượng lời giải. So với thuật toán ACO-GA, thuật
toán TS-VNS tốt hơn về thời gian chạy. Thêm vào đó, thuật toán TS-VNS đưa ra lời giải tối
ưu tại tất cả các file dữ liệu.

106
4.3.2.2 Thực nghiệm các file dữ liệu lớn

Các file dữ liệu được thực thi 10 lần và kết quả thực nghiệm được trình bày từ Bảng 4.22 đến
4.25 là kết quả trung bình của 10 lần chạy. Hình 4.4 minh họa hành trình MLP tốt nhất hiện
biết của một số file dữ liệu thực nghiệm.

Từ Bảng 4.22 đến 4.24 cho thấy thuật toán TS-VNS cho kết quả lời giải tốt hơn thuật
toán GA và thuật toán A. Salehipour et al. tại tất cả các file dữ liệu. So với thuật toán ACO-
GA, thuật toán TS-VNS đưa ra lời giải tốt hơn tại một số file dữ liệu. Ngược lại, trong một số
file dữ liệu khác thì thuật toán ACO-GA lại có lời giải tốt hơn. Kết quả thực nghiệm trong
các Bảng từ 4.22 đến 4.25 chỉ ra rằng so với thuật toán M. Silva et al., thuật toán TS-VNS
cho lời giải tốt hơn tại các file dữ liệu TRP-100-R13, TRP-100-R20, KroD100, Pr107, nhưng
chất lượng lời giải không tốt bằng tại các file dữ liệu rat99, att532, TRP-100-R8, TRP-100-
R10, TRP-100-R12, TRP-500-R1, TRP-500-R3, TRP-500-R9, TRP-500-R14, TRP-500-R18.
Đối với các file dữ liệu còn lại, thì chất lượng lời giải của hai thuật toán là tương đương. Tuy
nhiên, kết quả thực nghiệm trong Bảng 4.26 cho thấy độ lệch chuẩn trung bình về độ trễ lời
giải của thuật toán ACO-GA nhỏ hơn so với thuật toán TS-VNS và thuật toán GA.

Thuật toán AS được thực thi trên máy tính có bộ xử lý 2.4 GHz và 512 MB bộ nhớ
trong, trong khi thuật toán MS và GA được thực thi trên máy tính có cấu hình Intel Pentium
core i7 2.93 Ghz và 8GB bộ nhớ trong. Do các thuật toán được thực thi trên các máy tính có
cấu hình khác nhau, bởi vậy, khó đánh giá một cách chính xác về thời gian chạy của các thuật
toán. Trong Bảng 4.27, thời gian chạy của thuật toán TS-VNS tốt hơn so với thời gian chạy
của thuật toán AS, GA, ACO-GA nhưng lớn hơn một chút so với thời gian chạy thuật toán
của MS.

Do số lượng file dữ liệu thực nghiệm là lớn, bởi vậy, chúng tôi chỉ minh họa hành
trình MLP tốt nhất hiện biết của một số file dữ liệu thực nghiệm (Từ trái qua phải và từ trên
xuống dưới lần lượt là st70, pr107, rat195, TRP-100-R1, TRP-200-R1, TRP-500-R1).

107
Hình 4. 4. Minh họa hành trình MLP tốt nhất hiện biết trên một số file dữ liệu

108
Bảng 4. 20 Kết quả thực nghiệm các thuật toán cho các bộ dữ liệu nhỏ
Bộ dữ liệu GA ACO-GA TS-VNS
File dữ liệu OPT T
Best Sol T Best Sol T Best Sol Aver Sol STDV gap1[%]
(phút)
eil51 6140 6140 1.25 6140 0.21 6140 6140 0.00 0.00 0.02
eil76 5894 5894 1.30 5894 0.20 5894 5894 0.00 0.00 0.02
st70 7801 7801 1.25 7801 0.20 7801 7801 0.00 0.00 0.02
rat195 18058 18058 1.35 18058 0.19 18058 18058 0.00 0.00 0.03
kroA100 239680 241012 1.30 239680 0.21 239680 239854 0.00 0.00 0.02
kroB100 245999 247541 1.25 245999 0.15 245999 24612 0.00 0.00 0.03
Bộ dữ liệu thực 2
kroC100 1122890 1145124 1.40 1122890 0.14 1122890 1122890 0.00 0.00 0.02
berlin52 1372572 1372572 1.45 1372572 0.18 1372572 1372854 0.00 0.00 0.03
pr76 1122891 1123541 1.35 1122891 0.16 1122891 1122301 0.00 0.00 0.02
tsp225 27523 27523 1.40 27523 0.12 27523 27523 0.00 0.00 0.03
tss225 1138068 1138068 1.35 1138068 0.17 1138068 1138068 0.00 0.00 0.02
lin105 140450 140450 1.40 140450 0.18 140450 140450 0.00 0.00 0.02
Trung bình 1.34 0.18 0.00 0.00 0.02
test 1 8105 8105 1.35 8105 0.17 8105 8105 0.00 0.00 0.03
test 2 9248 9248 1.40 9248 0.18 9248 9248 0.00 0.00 0.03
test 3 8584 8630 1.35 8584 0.20 8584 8584 0.00 0.00 0.02
test 4 9240 9263 1.30 9240 0.19 9240 9278 0.00 0.00 0.02
test 5 8097 8097 1.35 8097 0.18 8097 8138 0.00 0.00 0.03
Bộ dữ liệu ngẫu
test 6 9490 9506 1.40 9490 0.17 9490 9490 0.00 0.00 0.03
nhiên 1
test 7 8450 8517 1.35 8450 0.20 8450 8450 0.00 0.00 0.02
test 8 8426 8426 1.50 8426 0.21 8426 8426 0.00 0.00 0.02
test 9 8987 9018 1.35 8987 0.20 8987 8987 0.00 0.00 0.02
test 10 9705 9713 1.40 9705 0.18 9705 9705 0.00 0.00 0.02
Trung bình 1.37 0.19 0.00 0.00 0.02
test 1 9526 9526 1.35 9526 0.19 9526 9545 0.00 0.00 0.02
test 2 8827 8838 1.25 8827 0.17 8827 8827 0.00 0.00 0.02
test 3 9440 9450 1.30 9440 0.18 9440 9440 0.00 0.00 0.03
test 4 8539 8539 1.35 8539 0.16 8539 8562 0.00 0.00 0.03
test 5 8321 8321 1.35 8321 0.17 8321 8321 0.00 0.00 0.03
Bộ dữ liệu ngẫu test 6 8327 8434 1.30 8327 0.19 8327 8327 0.00 0.00 0.02
nhiên 2
test 7 8300 8300 1.25 8300 0.18 8300 8300 0.00 0.00 0.02
test 8 9520 9520 1.35 9520 0.19 9520 9520 0.00 0.00 0.02
test 9 9759 9769 1.40 9759 0.17 9759 9759 0.00 0.00 0.03
test 10 8782 8785 1.35 8782 0.18 8782 8782 0.00 0.00 0.03
Trung bình 1.32 0.18 0.00 0.00 0.03

109
Bảng 4. 21 Kết quả thực nghiệm các thuật toán cho bộ dữ liệu ngẫu nhiên 3 (TPR-50-Rx)
OPT GA ACO−GA TS-VNS
File dữ liệu Best Best Best Aver T
gap1[%] T gap1[%] T STDV gap1[%]
Sol Sol Sol Sol (phút)
TRP-50-R1 12198 12709 4.19 1.50 12198 0.00 0.34 12198 12198 0.00 0.00 0.02
TRP-50-R2 11621 12845 10.53 1.60 11621 0.00 0.32 11621 11674 0.00 0.00 0.02
TRP-50-R3 12139 12904 6.30 1.75 12139 0.00 0.28 12139 12139 0.00 0.00 0.02
TRP-50-R4 13071 13925 6.53 1.80 13071 0.00 0.34 13071 13071 0.00 0.00 0.03
TRP-50-R5 12126 12726 4.95 1.45 12270 0.00 0.37 12126 12284 0.00 0.00 0.02
TRP-50-R6 12684 13245 4.42 1.55 12684 0.00 0.32 12684 12684 0.00 0.00 0.03
TRP-50-R7 11176 11991 7.29 1.60 11176 0.00 0.35 11176 11176 0.00 0.00 0.02
TRP-50-R8 12910 13558 5.02 1.55 12910 0.00 0.36 12910 12945 0.00 0.00 0.03
TRP-50-R9 13149 13845 5.29 1.65 13149 0.00 0.37 13149 13149 0.00 0.00 0.02
TRP-50-R10 12892 13740 6.58 1.45 12892 0.00 0.35 12892 12892 0.00 0.00 0.03
TRP-50-R11 12103 12565 3.82 1.40 12103 0.00 0.36 12103 12181 0.00 0.00 0.02
TRP-50-R12 10633 11657 9.63 1.45 10633 0.00 0.40 10633 10633 0.00 0.00 0.02
TRP-50-R13 12115 12870 6.23 1.50 12115 0.00 0.32 12115 12115 0.00 0.00 0.02
TRP-50-R14 13117 13659 4.13 1.55 13117 0.00 0.37 13117 13117 0.00 0.00 0.02
TRP-50-R15 11986 12793 6.73 1.60 11986 0.00 0.38 11986 11986 0.00 0.00 0.02
TRP-50-R16 12138 12803 5.48 1.65 12138 0.00 0.40 12138 12138 0.00 0.00 0.03
TRP-50-R17 12176 13387 9.95 1.70 12176 0.00 0.37 12176 12176 0.00 0.00 0.02
TRP-50-R18 13357 13988 4.72 1.75 13357 0.00 0.30 13357 13357 0.00 0.00 0.03
TRP-50-R19 11430 11911 4.21 1.50 11430 0.00 0.41 11430 11430 0.00 0.00 0.02
TRP-50-R20 11935 12409 3.97 1.50 11935 0.00 0.36 11935 11935 0.00 0.00 0.03
Trung bình 6.02 1.58 0.00 0.35 0.00 0.00 0.02

Bảng 4. 22 Kết quả thực nghiệm các thuật toán cho bộ dữ liệu ngẫu nhiên 3 (TPR-100-Rx)
AS MS GA ACO−GA TS-VNS
File dữ liệu UB Best gap2 Best gap2 Best gap2 Best gap2 Best Aver gap2 T
STDV
Sol [%] Sol [%] Sol [%] Sol [%] Sol Sol [%] (phút)
TRP-100-R1 35334 - - 32779 7.2335334 0.00 32779 7.23 32779 32779 0.00 7.23 0.18
TRP-100-R2 38442 - - 33435 13.0236773 4.34 33435 13.02 34178 34178 0.00 11.09 0.18
TRP-100-R3 37642 - - 32390 13.9535150 6.62 32390 13.95 32390 32390 0.00 13.95 0.22
TRP-100-R4 37508 - - 34733 7.4037508 0.00 34733 7.40 35208 35208 0.00 6.13 0.20
TRP-100-R5 37215 - - 32598 12.4135254 5.27 32598 12.41 32598 32598 0.00 12.41 0.18
TRP-100-R6 40422 - - 34159 15.4936988 8.50 34212 15.36 34159 34159 0.00 15.49 0.18
TRP-100-R7 37367 - - 33375 10.6836897 1.26 33375 10.68 33375 33375 0.00 10.68 0.20
TRP-100-R8 38086 - - 31780 16.5635408 7.03 31780 16.56 32479 32479 0.00 14.72 0.20
TRP-100-R9 36000 - - 34167 5.0936415 1.15 34167 5.09 34167 34167 0.00 5.09 0.18
TRP-100-R10 37761 - - 31605 16.3034018 9.91 31812 15.75 31842 31862 0.00 15.67 0.17
TRP-100-R11 37220 - - 34188 8.1537006 0.57 34188 8.15 34188 34188 0.00 8.15 0.18
TRP-100-R12 34785 - - 32146 7.5935437 1.87 32899 5.42 32708 32708 0.00 5.97 0.20
TRP-100-R13 37863 - - 32604 13.8935239 6.93 31989 15.51 31930 31930 0.00 15.67 0.22
TRP-100-R14 36362 - - 32433 10.8134869 4.11 33601 7.59 32433 32433 0.00 10.81 0.18
TRP-100-R15 39381 - - 32574 17.2835640 9.50 32574 17.28 32574 32574 0.00 17.28 0.20
TRP-100-R16 39823 - - 33566 15.7137083 6.88 34818 12.57 33566 33566 0.00 15.71 0.18
TRP-100-R17 41824 - - 34198 18.2337058 11.40 36297 13.21 34198 34198 0.00 18.23 0.17
TRP-100-R18 39091 - - 31929 18.3235109 10.19 31929 18.32 31929 31929 0.00 18.32 0.20
TRP-100-R19 39941 - - 33463 16.2236457 8.72 33463 16.22 33463 33463 0.00 16.22 0.18
TRP-100-R20 39888 - - 33632 15.6835998 9.75 33632 15.68 33363 33363 0.00 16.36 0.20
Trung bình 11.56 13.00 5.7 12.37 0.00 12.76 0.19

110
Bảng 4. 23 Kết quả thực nghiệm các thuật toán cho bộ dữ liệu ngẫu nhiên 3 (TPR-200-Rx)
UB AS MS GA ACO−GA TS-VNS
File dữ liệu Best gap2 Best gap2 Best gap2 Best gap2 Best Aver gap2 T
STDV
Sol [%] Sol [%] Sol [%] Sol [%] Sol Sol [%] (phút)
TRP-200-R1 105044 - - 88787 15.48 102400 2.52 88787 15.48 88787 90132 1114 15.48 1.77
TRP-200-R2 104073 - - 91977 11.62 104174 0.10 91977 11.62 91977 92334 391 11.62 1.63
TRP-200-R3 111644 - - 92568 17.09 102333 8.34 92568 17.09 92568 93053 458 17.09 1.7
TRP-200-R4 104956 - - 93174 11.23 102596 2.25 93174 11.23 93174 93174 0 11.23 1.82
TRP-200-R5 101912 - - 88737 12.93 100161 1.72 88737 12.93 88737 88737 0 12.93 1.67
TRP-200-R6 103751 - - 91589 11.72 101514 2.16 91589 11.72 91589 92183 511 11.72 1.55
TRP-200-R7 109810 - - 92754 15.53 102134 6.99 92754 15.53 92754 93208 160 15.53 1.68
TRP-200-R8 103830 - - 89048 14.24 99845 3.84 89048 14.24 89048 89048 0 14.24 1.6
TRP-200-R9 100946 - - 86326 14.48 97113 3.80 86326 14.48 86326 86326 0 14.48 1.67
TRP-200-R10 108061 - - 91552 15.28 101414 6.15 91552 15.28 91552 91976 376 15.28 1.68
TRP-200-R11 103297 - - 92655 10.3 103368 0.07 92655 10.3 92655 93102 641 10.3 1.77
TRP-200-R12 107715 - - 91457 15.09 104090 3.37 91457 15.09 91457 91457 0 15.09 1.75
TRP-200-R13 100505 - - 86155 14.28 101366 0.86 86155 14.28 86155 87002 198 14.28 1.7
TRP-200-R14 107543 - - 91882 14.56 102002 5.15 91882 14.56 91882 91882 0 14.56 1.62
TRP-200-R15 100196 - - 88912 11.26 101739 1.54 88912 11.26 88912 88912 0 11.26 1.67
TRP-200-R16 104462 - - 89311 14.5 100235 4.05 89311 14.5 89311 90145 1252 14.5 1.62
TRP-200-R17 107216 - - 89089 16.91 100672 6.10 89089 16.91 89089 89089 0 16.91 1.6
TRP-200-R18 108148 - - 93619 13.43 106565 1.46 93619 13.43 93619 93619 0 13.43 1.65
TRP-200-R19 105716 - - 93369 11.68 104135 1.50 93369 11.68 93369 93369 0 11.68 1.57
TRP-200-R20 116676 - - 86292 26.04 98771 15.35 86292 26.04 86292 86292 0 26.04 1.58
Trung bình 11.33 14.38 3.87 14.38 255 14.38 1.66

Bảng 4. 24 Kết quả thực nghiệm các thuật toán cho bộ dữ liệu ngẫu nhiên 3 (TPR-500-Rx)
UB AS MS TS-VNS
File dữ liệu Best gap2 Best gap2 Best Aver gap2 T
STDV
Sol [%] Sol [%] Sol Sol [%] (phút)
TRP-500-R1 2192688 - - 1841386 16.02 1841970 1862146 7155 15.99 29.2
TRP-500-R2 2176449 - - 1816568 16.54 1816568 1862142 20648 16.54 30.3
TRP-500-R3 2261125 - - 1833044 18.93 1833090 1852124 6991 18.93 32.5
TRP-500-R4 2088773 - - 1809266 13.38 1809266 1832145 13199 13.38 33.1
TRP-500-R5 2216937 - - 1823975 17.73 1823975 1832599 3855 17.73 30.5
TRP-500-R6 2137187 - - 1786620 16.40 1786620 1812145 18295 16.40 31.5
TRP-500-R7 2212936 - - 1847999 16.49 1847999 1874521 14702 16.49 34.2
TRP-500-R8 2132165 - - 1820846 14.60 1820846 1845621 13702 14.60 33.2
TRP-500-R9 2141458 - - 1733819 19.04 1734125 1762125 10089 19.02 31.6
TRP-500-R10 2163387 - - 1762741 18.52 1762741 1785421 9659 18.52 29.8
TRP-500-R11 2288538 - - 1797881 21.44 1797881 1812142 6804 21.44 35.1
TRP-500-R12 2081530 - - 1774452 14.75 1774452 1792145 6830 14.75 31.6
TRP-500-R13 2080370 - - 1873699 9.93 1873699 1892148 10060 9.93 32.4
TRP-500-R14 2051683 - - 1799171 12.31 1799281 1812449 4640 12.30 30.6
TRP-500-R15 2035804 - - 1791145 12.02 1791145 1801212 8982 12.02 33.6
TRP-500-R16 2142426 - - 1810188 15.51 1810188 1832145 11621 15.51 32.4
TRP-500-R17 2117999 - - 1825748 13.80 1825748 1842145 8889 13.80 30.8
TRP-500-R18 2159400 - - 1826263 15.43 1826547 1846542 15553 15.41 30.9
TRP-500-R19 2009335 - - 1779248 11.45 1779248 1791245 8606 11.45 31.5
TRP-500-R20 2155026 - - 1820813 15.51 1820813 1845124 14364 15.51 32.7
Trung bình 8.11 15.490 10732 15.486 31.8

111
Bảng 4. 25 Kết quả thực nghiệm các thuật toán cho bộ dữ liệu thực 1

AA AS MS GA ACO-GA TS-VNS
File dữ
liệu Best Best Best Best T Best T Best Aver T
STDV
Sol Sol Sol Sol (phút) Sol (phút) Sol Sol (phút)
st70 26384 19553 19215 19893 2.12 19215 0.51 19215 19215 0 0.12
rat195 280900 213371 210191 245412 6.23 210191 2.81 210191 218427 4383 1.55
kroD100 1297932 976830 949594 976830 3.67 948325 0.8 942173 951214 1915 0.22
pr226 10421449 7226554 7100308 7212541 6.45 7100308 3.12 7226554 7226554 0 2.93
lin105 780662 585823 585823 598375 3.74 585823 0.98 585823 585823 0 0.25
pr107 2205490 1983475 1980767 1987110 3.77 1973726 1.1 1973726 2012144 74308 0.33
lin318 7475822 5876537 5560679 5876537 11.8 5560679 4.51 5560679 5560679 0 3.1
pr439 24126010 18567170 17688561 18567170 18.5 17688561 11.5 17688561 17688561 0 10.4
att532 - 18448435 5581240 18448435 3.75 18448435 19.5 18448435 18448435 0 22.3
rat99 75048 56994 54984 58327 21.5 57896 0.65 55655 55655 0 0.23
berlin52 197137 - - 142512 1.61 135559 0.42 139219 139219 0 0.08
bier127 5929120 - - 5011031 4.25 4768611 1.32 4623808 4854211 101614 0.45
ch130 455849 - - 366578 5.01 362432 2.21 359952 361252 1962 0.48
ch150 571369 - - 474075 5.23 451280 1.32 450619 452324 5162 0.68
d198 1380470 - - 1289590 6.24 1204997 2.89 1212847 1212847 0 1.75
eil101 38582 - - 30235 3.57 29123 1.12 29353 29435 248 0.22
eil51 14683 - - 10281 1.84 9952 0.32 9934 9934 0 0.03
eil76 26128 - - 18243 2.12 17419 0.52 17419 17419 0 0.1
gil262 393641 - - 327534 9.12 325679 4.23 298673 298673 0 2.87
kroA100 1307340 - - 1025339 3.6 971982 1.2 971617 971617 0 0.22
kroA150 2494782 - - 2118357 5.12 1931392 1.54 1931392 1931392 0 0.73
kroA200 3387616 - - 2962453 6.47 2845318 2.75 2732712 2732712 0 1.8
kroB100 1274207 - - 992121 3.56 990278 1.05 976196 981456 15925 0.23
kroB150 2376125 - - 1902332 5.1 1800535 1.22 1793204 1793204 0 0.72
kroB200 3731218 - - 2912145 6.45 2845318 2.62 2774780 2795421 66901 1.73
kroC100 1207746 - - 992515 3.51 946859 0.98 956032 956032 0 0.22
kroE100 1345314 - - 984759 3.42 955272 1.01 960578 962138 3549 0.23
pr124 4778217 - - 3264941 4.12 3106094 1.21 3093849 3125214 33059 1.02
pr136 8720053 - - 7197617 4.35 6415416 1.45 6344024 6356214 34486 1.22
pr264 7674241 - - 6187494 5.02 6121700 4.23 6068884 6121452 0 3.53
pr76 4359810 - - 3543367 5.12 3543367 0.45 3549225 3549225 0 0.1
rd100 458419 - - 359096 5.7 355985 0.85 355985 355985 0 0.25
ts225 17953213 - - 14372227 8.7 13577376 2.9813577376 13577376 0 2.23
tsp225 537080 - - 463666 9.4 401012 3.01 401012 401012 0 2.43
u159 3837650 - - 3169661 6.7 3077619 1.59 3060816 3060816 0 0.85

112
Bảng 4. 26 So sánh độ lệch chuẩn độ trễ lời giải trung bình của các thuật toán

Bộ dữ liệu GA ACO-GA TS-VNS


Bộ dữ liệu thực 2 1126 0 0
Bộ dữ liệu thực 1 66728 8912 9815
Bộ dữ liệu ngẫu nhiên 1 26 0 0
Bộ dữ liệu ngẫu nhiên 2 450 0 0
Bộ dữ liệu ngẫu nhiên 3(TPR-50-Rx) 0 0 0

Bộ dữ liệu ngẫu nhiên 3(TPR-100-Rx) 104 0 0

Bộ dữ liệu ngẫu nhiên 3(TPR-200-Rx) 363 8 255

Bộ dữ liệu ngẫu nhiên 3(TPR-500-Rx) - - 10732

Bảng 4. 27 Mô tả T theo phút với các bộ dữ liệu lớn

Bộ dữ liệu AS MA GA ACO-GA TS-VNS


Bộ dữ liệu thực 1 10.70 4.54 8.51 4.55 4.15
Bộ dữ liệu ngẫu nhiên 3 (TPR-100-Rx) 1.68 0.12 3.37 0.76 0.19
Bộ dữ liệu ngẫu nhiên 3 (TPR-200-Rx) 66.58 1.20 6.27 2.85 1.66
Bộ dữ liệu ngẫu nhiên 3 (TPR-500-Rx) 173 26.7 - - 30.8
Trung bình 63.0 8.14 - - 9.20

113
4.4 Kết luận chƣơng 4

Trong chương này, chúng tôi phát triển ba thuật toán theo hướng tiếp cận meta-heuristic.
Chúng tôi đề xuất thuật toán dựa trên lược đồ của thuật toán di truyền để giải bài toán MLP
và một số kỹ thuật mới được tích hợp vào từng bước của thuật toán. Sau đó, chúng tôi đề xuất
hai thuật toán meta-heuristic lai là: Thuật toán (ACO-GA) lai ghép giữa thuật toán di truyền
(GA) và thuật toán đàn kiến (ACO); và thuật toán TS-VNS lai ghép giữa thuật toán Tabu
(TS) và thuật toán lân cận biến đổi (VNS). Kết quả thực nghiệm cho thấy:
 Đối với file dữ liệu nhỏ: Thuật toán GA có chất lượng lời giải sát với lời giải tối
ưu. Đặc biệt, thuật toán đưa ra lời giải tối ưu tại một vài file dữ liệu. Ngoài ra, chất
lượng lời giải thu được từ thuật toán GA tốt hơn chất lượng lời giải của các thuật
toán gần đúng cận tỷ lệ hiện biết tại hầu hết các file dữ liệu. Thuật toán ACO-GA
và TS-VNS tốt hơn thuật toán GA cả về chất lượng lời giải và thời gian chạy khi cả
hai thuật toán đều đưa ra lời giải tối ưu tại tất cả các file dữ liệu trong khoảng thời
gian nhỏ. Trong đó, thời gian chạy của thuật toán TS-VNS tốt hơn thời gian chạy
của thuật toán ACO-GA.
 Đối với file dữ liệu lớn: Thuật toán GA vẫn cho chất lượng lời giải tốt hơn chất
lượng lời giải của các thuật toán gần đúng cận tỷ lệ tại phần lớn các file dữ liệu.
Thuật toán ACO-GA và TS-VNS tốt hơn thuật toán GA cả về chất lượng lời giải
và thời gian chạy tại tất cả các file dữ liệu. Ngoài ra, cả hai thuật toán đưa ra kỉ lục
mới so với các thuật toán meta-heuristic tốt nhất hiện biết trên các file dữ liệu
TRP-100-R13, TRP-100-R20, KroD100, Pr107. Về cơ bản, hai thuật toán ACO-
GA và TS-VNS là cạnh tranh về chất lượng lời giải. Thời gian chạy của thuật toán
ACO-GA không tốt bằng thời gian chạy của thuật toán TS-VNS, tuy nhiên, độ lệch
chuẩn về chất lượng lời giải lại nhỏ hơn so với thuật toán TS-VNS.

Các kết quả chính được công bố trong các công trình [1, 2, 6, 7] thuộc danh mục các
công trình công bố được sử dụng trong luận án.

114
KẾT LUẬN
Đối với một bài toán NP-khó như bài toán MLP, hiện tại có ba hướng tiếp cận chính để phát
triển thuật toán giải: 1) hướng tiếp cận đúng, 2) hướng tiếp cận gần đúng cận tỷ lệ, 3) hướng
tiếp cận meta-heuristic. Đóng góp của chúng tôi trong luận án là đề xuất các thuật toán giải
bai toán MLP theo cả ba hướng tiếp cận:

Trong hướng tiếp cận đúng, chúng tôi đề xuất thuật toán đúng dựa trên phương pháp
nhánh cận giải bài toán MLP. Kết quả thực nghiệm cho thấy, thuật toán đề xuất giải được bài
toán MLP lên đến 40 đỉnh. Chúng tôi sử dụng thuật toán đúng để thu được lời giải tối ưu bài
toán MLP cho các bộ dữ liệu kích thước nhỏ. Nhờ có lời giải tối ưu, chúng tôi có thể đánh giá
một cách chính xác hiệu quả của các thuật toán giải gần đúng sau này.

Trong cách tiếp cận gần đúng cận tỷ lệ, một số thuật toán gần đúng cận tỷ lệ giải bài
toán MLP đã được công bố. Tuy nhiên, hiệu quả của các thuật toán này chỉ được đánh giá
trên khía cạnh lý thuyết. Chúng không chỉ ra được cận tỷ lệ, thời gian chạy trong thực tế và
thiếu sự đánh giá và so sánh hiệu quả của các thuật toán từ thực nghiệm. Thêm vào đó, chất
lượng của cận dưới thì lại không được đề cập. Trong một cách tiếp cận để khắc phục vấn đề
trên, chúng tôi tiến hành thực nghiệm để đánh giá và so sánh hiệu quả của các thuật toán trên
ba khía cạnh cận tỷ lệ, thời gian chạy và chất lượng của cận dưới. Kết quả thực nghiệm cho
thấy rằng cận tỷ lệ tốt nhất thu được theo hướng tiếp cận này vẫn còn là quá lớn. Từ đó,
chúng tôi đề xuất thuật toán dựa trên phương pháp subgradient để phát triển cận tỷ lệ cho bài
toán MLP. Để chứng tỏ hiệu quả của thuật toán, chúng tôi tiến hành thực nghiệm thuật toán
đề xuất trên các bộ dữ liệu. Kết quả thực nghiệm cũng cho thấy, thuật toán dựa trên phương
pháp subgradient đưa ra cận tỷ lệ tốt hơn so với các thuật toán gần đúng cận tỷ lệ tốt nhất
hiện biết.

Trong hướng tiếp cận meta-heuristic, chúng tôi phát triển ba thuật toán giải bài toán
MLP. Chúng tôi đề xuất thuật toán di truyền để giải bài toán MLP. Chúng tôi tiến hành thực
nghiệm thuật toán đề xuất trên các bộ dữ liệu. Kết quả thực nghiệm chỉ ra rằng, thuật toán đề
xuất đưa ra lời giải với cận tỷ lệ tốt hơn các thuật toán gần đúng cận tỷ lệ hiện biết ở tại hầu
hết tất cả các file dữ liệu. Tuy nhiên, một vấn đề mà các thuật toán di truyền thường gặp là
thuật toán hội tụ sớm sau một số vòng lặp, khi quần thể mất đi tính đa dạng. Để duy trì tính đa
dạng, chúng tôi áp dụng kỹ thuật hủy diệt. Tuy nhiên, việc khởi tạo lại toàn bộ quần thể không
có tính định hướng và kế thừa đặc tính tốt từ các thế hệ trước có thể sẽ đưa thuật toán đến một

115
không gian lời giải mới mà không khai thác được không gian lời giải tiềm năng đã được khảo
sát trước đó. Chính vì vậy mà thuật toán di truyền đề xuất chưa cân bằng được hai đặc tính
quan trọng là đặc tính khai thác và đặc tính khai phá. Để khắc phục tình trạng này, chúng tôi
đề xuất thuật toán ACO-GA kế thừa ưu điểm của thuật toán di truyền và thuật toán đàn kiến
để cân bằng giữa hai đặc tính khai phá không gian tìm kiếm lời giải mới và khai thác không
gian lời giải đã có. Cụ thể, thuật toán đàn kiến đóng vai trò khởi tạo quần thể đa dạng cho
thuật toán di truyền bằng việc duy trì ba loại kiến như đã trình bày ở chương 4, ngược lại,
thông tin di truyền từ thuật toán di truyền đóng vai trò định hướng cho đàn kiến đến không
gian lời giải tiềm năng trong lần khởi tạo quần thể kế tiếp. Thuật toán được thực nghiệm trên
các bộ dữ liệu chuẩn để so sánh hiệu quả với các thuật toán hiện biết. Đối với bộ dữ liệu ngẫu
nhiên, thuật toán đề xuất cho lời giải tốt hơn các thuật toán tốt nhất hiện biết trên nhiều bộ dữ
liệu. Đối với bộ dữ liệu thực, thuật toán luôn đưa ra lời giải tốt hơn hoặc không thua kém các
thuật toán meta-heuristic tốt nhất. Tuy nhiên, thời gian chạy của thuật toán còn lớn. Lý do
đến từ việc ta phải thực hiện tính toán cho cả một quần thể các cá thể lời giải. Thuật toán
meta-heuristic TS-VNS lai ghép giữa thuật toán Tabu và thuật toán lân cận biến đổi. Trong
đó, thuật toán Tabu có vai trò tránh việc duyệt lại những lời giải đã được khảo sát và định
hướng cho thuật toán lân cận biến đổi thoát khỏi cực trị địa phương. Ngược lại, thuật toán lân
cận biến đổi tạo ra các lân cận đa dạng cho thuật toán Tabu. Trong thuật toán, ta chỉ xuất phát
từ một lời giải ban đầu và thực hiện biến đổi nó. Do đó, khối lượng tính toán của thuật toán
đơn lời giải sẽ ít hơn khối lượng tính toán của thuật toán đa lời giải như thuật toán ACO-GA.
Hiện nay, các thuật toán sử dụng cách tiếp cận đơn lời giải như thuật toán TS-VNS đã được
đề xuất [40, 43]. Tuy nhiên, các thuật toán này gặp phải vấn đề khi chúng có thể duyệt lại
không gian lời giải đã khảo sát trước đó. Bởi vậy, trong một số trường hợp, chúng không
thoát được vấn đề cực trị địa phương. Trong khi đó, nhờ sử dụng danh sách tabu, thuật toán
TS-VNS tránh việc duyệt lại không gian lời giải đã khảo sát trước đó. Ngoài ra, chúng tôi
cũng trình bày cấu trúc của các lân cận và độ phức tạp thời gian của thuật toán khảo sát các
lân cận này trong VNS. Kết quả nghiên cứu chỉ ra thứ tự thực hiện các thuật toán lân cận và
nhờ thực hiện theo thứ tự này, thuật toán TS-VNS đưa ra kết quả tốt nhất. Thêm vào đó, độ
phức tạp thời gian của việc tính độ trễ của một lời giải lân cận là hằng số. Để đánh giá hiệu
quả của thuật toán, chúng tôi tiến hành thực nghiệm thuật toán trên các bộ dữ liệu chuẩn. Kết
quả thực nghiệm cho thấy, chất lượng lời giải thu được là cạnh tranh với các thuật toán meta-
heuristic hiện biết trên nhiều bộ dữ liệu, đồng thời đưa ra một số kỷ lục tại một số file dữ
liệu. Thêm vào đó, thời gian chạy thuật toán được cải thiện rõ rệt so với các thuật toán còn
lại. Chúng tôi tổng hợp lại các thuật toán đề xuất trong Bảng 5.1.

116
Bảng 5. 1 Tổng hợp các thuật toán đề xuất
File dữ liệu Tên bộ dữ liệu Các thuật toán đề xuất

Bộ dữ liệu thực 2  Hướng tiếp cận đúng:


(40 đỉnh) Giải một cách chính xác bài toán MLP lên đến 40 đỉnh và hiệu
quả hơn thuật toán đúng của Wu et al. [50] trên một số file dữ
Bộ dữ liệu ngẫu liệu. Lời giải tối ưu từ thuật toán đúng là cơ sở giúp đánh giá
nhiên 1 hiệu quả của các thuật toán khác một cách chính xác.
(40 đỉnh)
 Hướng tiếp cận gần đúng cận tỷ lệ:
Bộ dữ liệu ngẫu Đưa ra cận tỷ lệ nhỏ hơn so với các thuật toán gần đúng cận tỷ
File dữ liệu nhiên 2 lệ hiện biết trên hầu hết các file dữ liệu. Chất lượng lời giải thu
nhỏ (40 đỉnh) được rất sát so với lời giải tối ưu.

 Hướng tiếp cận meta-heuristic:


Thuật toán di truyền cho lời giải với chất lượng tốt hơn các
thuật toán gần đúng cận tỷ lệ tốt nhất tại các file dữ liệu. Ngoài
Bộ dữ liệu ngẫu
ra, thuật toán đưa ra lời giải tối ưu tại một số file dữ liệu.
nhiên 3
Thuật toán ACO-GA và TS-VNS tốt hơn thuật toán GA cả về
(50 đỉnh)
chất lượng lời giải và thời gian chạy tại tất cả các file dữ liệu.
Ngoài ra, hai thuật toán cũng đưa ra lời giải tối ưu tại tất cả các
file dữ liệu.

Bộ dữ liệu thực 1  Hướng tiếp cận đúng:


Thuật toán đúng không áp dụng được trong trường hợp này.

 Hướng tiếp cận gần đúng cận tỷ lệ:


Đưa ra cận tỷ lệ nhỏ hơn so với các thuật toán gần đúng cận tỷ
lệ hiện biết trên hầu hết các file dữ liệu. Tuy nhiên, thời gian
chạy của thuật toán hướng tiếp cận này là lớn đối với các file
dữ liệu có kích thước từ 200 đinh trở lên.

 Hướng tiếp cận meta-heuristic:


Thuật toán GA vẫn đưa ra lời giải với chất lượng tốt hơn các
File dữ liệu Bộ dữ liệu ngẫu
thuật toán gần đúng cận tỷ lệ tốt nhất tại phần lớn các file dữ
lớn nhiên 3
liệu thực nghiệm.
(từ 100 đến 500
Thuật toán ACO-GA và TS-VNS tốt hơn thuật toán GA cả về
đỉnh)
chất lượng lời giải và thời gian chạy tại tất cả các file dữ liệu.
Ngoài ra, hai thuật toán đưa ra kỉ lục mới so với các thuật toán
meta-heuristic tốt nhất hiện biết trên một số file dữ liệu TRP-
100-R13, TRP-100-R20, KroD100, Pr107. Về cơ bản, hai thuật
toán là cạnh tranh về chất lượng lời giải. Thời gian chạy của
thuật toán ACO-GA không tốt bằng thời gian chạy của thuật
toán TS-VNS, tuy nhiên, độ lệch chuẩn về chất lượng lời giải
lại nhỏ hơn so với thuật toán TS-VNS.

117
DANH MỤC CÁC CÔNG TRÌNH
CÔNG BỐ ĐƢỢC SỬ DỤNG TRONG LUẬN ÁN

1. H.B. Ban, N.D. Nghia, Genetic algorithm for solving the Minimum Latency Problem, J.
Science and Technology Technical Universities, pp. 1-7, 2009 (in Vietnamese).
2. H.B. Ban, N.D. Nghia, Improved genetic algorithm for the Minimum Latency Problem,
Proc. SOICT, 2010, pp. 9-15.
3. H.B. Ban, N.D. Nghia, An Experimental Study about Efficiency of the Approximation
Algorithms for the Minimum Latency Problem, Proc. RIVF, pp 1-4, 2012.
4. H.B. Ban, K. Nguyen, M.C. Ngo, and N.D. Nghia, An efficient exact algorithm for the
Minimum Latency Problem, J. Progress of Informatics, No.10, pp. 1-8, National
Institute of Informatics, Japan, 2013.
5. H.B. Ban, N.D. Nghia, A hybrid algorithm combining genetic algorithm with ant
colony algorithm for the Minimum Latency Problem, J. Computer Science and
Cybernetics, T.29, S. 3, 2013, pp. 287-298 (in Vietnamese).
6. H.B. Ban, N.D. Nghia, A Subgradient Method to Improve Approximation Ratio in the
Minimum Latency Problem, Proc. KSE, pp. 339-350, 2013.
7. H.B. Ban, N.D. Nghia, A Meta-Heuristic Algorithm Combining between Tabu and
Variable Neighborhood Search for the Minimum Latency Problem, Proc. RIVF,
pp.192-197, 2013.

118
TÀI LIỆU THAM KHẢO

1. A. Archer, A. Levin and D. Williamson, A Faster, Better Approximation Algorithm for


the Minimum Latency Problem, J. SIAM, Vol. 37, No. 1, 2007, pp. 1472-1498.
2. G. Ausiello, Complexity and Approximability Properties: Combinatorial Optimization
Problems and Their Approximability Properties, Springer publisher, 1999.
3. S. Arora, and G. Karakostas, Approximation schemes for minimum latency problems,
SIAM Journal on Computing, Vol.32, No. 2, 1999, pp. 688-693.
4. F. Afrati, S. Cosmadakis, C. Papadimitriou, G. Papageorgiou and N. Papakostantinou,
The complexity of the traveling repairman problem, J. ITA, Vol.20, No. 1, 1986, pp.
79-87.
5. T. Back, D. B. Fogel and Z. Michalewicz, Handbook of Evolutionary Computation,
Oxford University Press, New York, 1997.
6. A. Blum, P. Chalasani, D. Coppersmith, W. Pulleyblank, P. Raghavan, M. Sudan, The
minimum latency problem, Proc. ACM STOC, 1994, pp.163-171.
7. R. Bellman, Dynamic Programming, Dover Publications Inc., 2003.
8. P. Chang, W. Huang, C. Ting, Dynamic diversity control in genetic algorithm for
mining unsearched solution space in TSP problems, Expert Syst. Appl. Vol. 37, No.3,
2010, pp. 1863-1878.
9. K. Chaudhuri, B. Goldfrey, S. Rao, and K. Talwar, Path, Tree and minimum latency
tour, Proc. FOCS, 2003, pp. 36-45.
10. M. Dorigo and T. Stutzle, Ant Colony Optimization, Bradford Books, London, 2004.
11. T. Feo and M. Resende, Greedy randomized adaptive search procedures, J. Global Opt.,
1995, pp. 109-133.
12. M. Fischetti, G. Laporte, Martello S, The delivery man problem and cumulative
matroids, J. Operational Research, Vol. 41, No. 6, 1993, pp. 1055–1064.
13. B. Freisleben and P. Merz, A Genetic Local Search Algorithm for Solving Symmetric
and Asymmetric Traveling Salesman Problems, Proc. Evolution Computation, pp. 616-
621, 1996.
14. A. Garcia, P. Jodr and J. Tejel, A note on the traveling repairmen problem, J. Networks,
Vol.40, No.1, 2002, pp. 2731-2745.
15. N. Garg, Saving an Epsilon: A 2-approximation for the k−MST Problem in Graphs,
Proc. STOC, 2005, pp. 396-402.

119
16. K. George, J. Bard, A GRASP for the vehicle routing problem with time windows.
INFORMS J. Comput,Vol. 7, No. 1, 1995, pp. 10–23.
17. M. Goemans and D. Williamson, A General Approximation Technique for Constrained
Forest Problems, J. SIAM. Comput, Vol. 24. No. 2, , 1995, pp. 296-317
18. M. Goemans and J. Kleinberg, An improved approximation ratio for the minimum
latency problem, Proc. SIAM SODA, 1996, pp. 152-158.
19. T. Gonzalez, Handbook of Approximation Algorithms and Metaheuristics, Chapman
and Hall/CRC, 2007.
20. F. Glover and M. Laguna, Tabu Search, Kluwer Academic Publisher, Boston, MA,
1997.
21. P. Hansen, N . Mladenovic, An introduction to variable neighborhood search. Proc.
Metaheuristics, 1999, pp. 433-458.
22. P. Hansen, N . Mladenovic, Industrial applications of the variable neighbourhood search
metaheuristic, Vol. 4, Publisher Springer , USA, pp 261-273.
23. P. Hansen, N . Mladenovic, Variable neighbourhood search: principles and applications,
J. Operational Research, Vol. 130, 2001, pp. 449–467.
24. H. Hasegawa, Optimization of GROUP Behavior, Japan Ethological Society
Newsletter, No. 43, 2004, pp. 22–23.
25. M. Held and R. M. Karp, The travelling salesman problem and minimum spanning tree:
part II, J. Mathematical Programming, Vol.1, 1971, pp. 5-25.
26. D. S. Johnson and L. A. McGeoch, The traveling salesman problem: A case study in
local optimization in Local Search in Combinatorial Optimization, E. Aarts and J. K.
Lenstra, eds, Wiley, pp. 215–310.
27. E. Koutsoupias, C.H. Papadimitriou, M. Yannakakis, Searching a Fixed graph, ICALP,
1996, pp. 280-289.
28. A. Lucena, Time-dependent traveling salesman problem - the deliveryman case, J.
Networks, Vol. 20, No. 6, 1900, pp. 753-763.
29. G. L. Nemhauser and L. A. Wolsey, Interger and Combinatorial Optimization, Wiley-
Interscience, 1998.
30. I. Méndez-Díaz, P. Zabala, A. Lucena, A new formulation for the Traveling
Deliveryman Problem, J. Discrete Appl Math, Vol. 156, No, 17, 2008, pp. 3223–3237.
31. E. Minieka, The delivery man problem on a tree network, J. AOR, Vol.18, No.1, 1989,
pp. 261-266.
32. M. Mitchel, An Introduction to Genetic Algorithms, Cambridge Publisher, 1998.

120
33. N. Mladenovic, P. Hansen, Variable neighborhood search, J. Operations Research,
vol.24, No. 11, 1997, pp.1097-1100.
34. T. Motzkin and I. J. Schoenberg, The relaxation method for linear inequalities, J.
Mathematics, 1954, pp. 393-404.
35. B.T. Polyak, Minimization of unsmooth functionals, U.S.S.R. Computational
Mathematics and Mathematical Physis, Vol. 9, No3, 1969, pp.14-29.
36. J. Picard and M. Queyranne, The time-dependent traveling salesman problem and its
application to the tardiness problem in one-machine scheduling, J. Operations Research,
Vol. 26, No. 1, 1978, pp. 86-110.
37. D. J. Rosenkrantz, R. E. Stearns, and P. M. Lewis, An analysis of several heuristics for
the traveling salesman problem, SIAM J. Comput, No. 6, 1977, pp.563-581.
38. F. Rossi, P. Van Beek, and T. Walsh, Eds. Handbook of Constraint Programming,
Elsevier, 2006.
39. M. Rocha and J. Neves, Preventing Premature Convergence to Local Optima in Genetic
Algorithms via Random Offspring Generation, Proc. IEA/AIE-99, 1999. Pp. 127-136
40. A. Salehipour, K. Sorensen, P. Goos, and O.Braysy, Efficient GRASP+VND and
GRASP+VNS metaheuristics for the traveling repairman problem, J. Operations
Research, Vol 9. No. 2, 2011, pp. 189–209.
41. S. Sahni, and T. Gonzalez, P-complete approximation problem, J.ACM, Vol. 23, No.3,
1976, pp. 555-565.s
42. D. Simchi-Levi, O. Berman, Minimizing the total flow time of n jobs on a network, J.
IIE Trans, Vol. 23, No.3, 1991, pp. 236–244.
43. M. Silva, A. Subramanian, T. Vidal, and L. Ochi, A simple and effective metaheuristic
for the Minimum Latency Problem, J. Operations Research, Vol 221, No. 3, 2012, pp.
13–520.
44. R. Sitters, The minimum latency problem is NP-hard for weighted trees, Proc. IPCO,
2002, pp. 230-239.
45. S. Shimomuray, M. Sugimotoy, T. Haraguchiy, H. Matsushitaz and Y. Nishioy, Ant
Colony Optimization with Intelligent and Dull Ants, Proc. NOLTA, 2010, pp. 504-507.
46. J. Smith, J. Cochran, Introduction to Tabu Search, John Wiley & Sons, Inc, 2011.
47. V. Vazirani, Approximation Algorithms, Springer publisher, 2001.
48. D. Williamson and D. Shmoys, The Design of Approximation Algorithms Cambridge
University Press publisher, NY, USA, 2011.

121
49. B.Y. Wu, Polynomial time algorithms for some minimum latency problems, Inform.
Proc. Letters, Vol. 75, No. 5, 2000, pp. 225-229.
50. B.Y. Wu, Z.N. Huang and F.J. Zhan, Exact algorithms for the minimum latency
problem, Journal on Inf. Process. Lett., Vol. 92, No. 6, 2004, pp. 303-309.
51. http://www.iwr.uniheidelberg.de/groups/comopt/software/TSPLIB95.

122

You might also like