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ả gap gap3, 4đối với các bộ dữ liệu lớn
Bộ dữ liệu SGA
3
gap [%] gap4[%]
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
Bộ dữ liệu KA SGA
1
T 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
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 tốn có kích thước từ 200 đỉnh trở lên, trong khi đó, thời gian chạy của thuật tố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 tố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 tố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 tốn MLP, thì ta mong chờ thu được thuật tốn với cận tỷ lệ nhỏ hơn cho bài tố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.
CHƢƠNG 4
CÁC THUẬT TỐN META-HEURISTIC
Các thuật tố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 tốn meta-heuristic là những thuật tốn có độ phức tạp tính tốn thường là khơng q lớn. Tuy nhiên, chất lượng lời giải tìm được bởi các thuật tố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 tố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 tố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 tố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 tố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.
4.1. Thuật toán di truyền 4.1.1 Lƣợc đồ của thuật toán 4.1.1 Lƣợc đồ của thuật toán
Lược đồ tổng qt của thuật tố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 tố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 tốn:
Kết hợp thuật tốn di truyền với thuật tốn tìm kiếm địa phương.
Đề xuất tố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 tố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ơn1, 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.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 tố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 tồ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
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 = TCv1};//cá thể ln 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 = TCv}; 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 tốn tử lai ghép được trình bày trong Thuật tố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,
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. Hố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 tốn tử đột biến được trình bày tại Thuật tốn 4.4.
Thuật tố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
tốn tìm kiếm địa phương đã được trình bày trong [13]. Ý tưởng là, vai trị của thuật tố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 tố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 tố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).
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 tốn di truyền đó là vấn đề hội tụ sớm đến lời giải cực trị địa phương. Ngun 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 tố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à