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

Một phần của tài liệu Luận án tiến sĩ tin học phát triển thuật toán đúng đưa ra lời giải tối ưu cho bài toán MLP (Trang 106)

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

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

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 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ậnTi = v1, v2, ..., vi−1, vi+1, ..., vn, vi. Ta có: ) (T L = (n − 1)c(v1, v2) + ... + (ni + 1)c(vi−1, vi) +(ni)c(vi, vi+1) + (ni − 1)c(vi+1, vi+2) + ... + (vn−1, vn) , (4.8) và ( )i L T = (n − 1)c(v1, v2) + ... + (ni + 1)c(vi−1, vi+1) +(ni)c(vi+1, vi+2)+ ... + 2(vn−1, vn) + (vn, vi) = 1 1 1 1 1 1 1 1 ( ) n ( ) ( ,k k ) ( 1) ( i , i ) n ( 1) ( ,k k ) k i k i L Tn k c v vn i c vv  n k c v v                ( , )n i c v v  (4.9)

Việc tính L T( )i 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ó:

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. TGRASP (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

6. arg min ( ) ( )

i

T N T

T   L T

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. LTLT∪ {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. xv1;

3. WHILE |x| < n

4. Tạo RCL vớim đỉnh viV gần với vl; // vl là đỉnh cuối trong T; 5. Chọn ngẫu nhiên v{vi|viRCLviT}

6. T = Tvi; 7. end while

8. return T;

( )i L T = (n − 1)c(v1, v2) + ... + (ni + 1)c(vi−1, vi+1) +(ni)c(vi+1, vi) + (ni − 1)c(vi, vi+2) + ... + (vn−1, vn) (4.10) Từ (4.8) và (4.10), ta có: ( )i L T = L(T) − (ni + 1)c(vi−1, vi) − (ni– 1)c(vi+1, vi+2) + (ni + 1)c(vi−1, vi+1) + (ni − 1)c(vi, vi+2) (4.11) Việc tính L T( )i 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ó: ) (T L = (n − 1)c(v1, v2) + ... + (ni + 1)c(vi−1, vi) +(ni)c(vi, vi+1) + … + (nj + 1)c(vj-1, vj) + (nj) c(vj, vj+1) + ... + (vn−1, vn). (4.12) ( )ij L T = (n − 1)c(v1, v2) + ... + (ni + 1)c(vi−1, vj) +(ni)c(vj, vi+1) + … + (nj + 1)c(vj-1, vi) + (nj)c(vi, vj+1) + ... + (vn−1, vn). (4.13) Từ (4.12) và (4.13), ta có: ( )ij L T = L(T) − (ni + 1)c(vi−1, vi) − (ni)c(vi, vi+1)−(nj + 1)c(vj−1, vj ) − (nj)c(vj , vj+1) +(ni + 1)c(vi−1, vj ) + (ni)c(vj, vi+1)+(nj + 1)c(vj−1, vi) + (nj)c(vi, vj+1). (4.14) Việc tính L T( )ij 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).

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ó: ( )ij L T = (n − 1)c(v1, v2) + ... + (ni)c(vi, vj) + (ni – 1)c(vj, vi+2) +… + (nj + 1)c(vj-1, vi+1) + (nj)c(vi+1, vj+1) + ... + (vn−1, vn). (4.15) Từ (4.12) và (4.15), ta có: ( )ij L T = L(T) − (ni)c(vi, vi+1) − (ni − 1)c(vi+1, vi+2)−(nj + 1)c(vj−1, vj ) − (nj)c(vj, vj+1) + (ni)c(vi, vj ) + (ni − 1)c(vj, vi+2) + (nj + 1)c(vj−1, vi+1) − (nj)c(vi+1, vj+1). (4.16) Việc tính L T( )ij 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- downN6(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ó: ( )i L T = (n − 1)c(v1, v2) + ... + (ni + 2)c(vi−2, vi) +(ni + 1)c(vi, vi-1) + (ni)c(vi-1, vi+1) + ... + (vn−1, vn) (4.17) Từ (4.8) và (4.17), ta có: ( )i L T = L(T) − (ni + 2)c(vi−2, vi-1) − (ni)c(vi, vi+1) + (ni + 2)c(vi−2, vi) + (ni)c(vi-1, vi+1) (4.18) Việc tính L T( )i 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 dichuyển một dãy k (k = 1, 2, …, l) đỉnh liên tiếp nhau từ vị trí 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, …, nl−1 và i+l < jn}. 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-verticeslà 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, …, nl−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(nl).

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ó: ( ijk) L T = 1 1 1 1 1 1 1 1 1 1 1 1 ( ) ( ) ( , ) ( , ) ( , ) ( ) ( , ) ( , ) ( ) ( , ) ( ) ( , ) ( ) ( , ) i k h h i i j j i k i k h i j h h i i k i k j j i h i k L T j i k c v v c v v c v v n i k c v v k c v v n i c v v n j c v v n j k c v v                                       (4.19) Việc tính L T( ijk)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. 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

Một phần của tài liệu Luận án tiến sĩ tin học phát triển thuật toán đúng đưa ra lời giải tối ưu cho bài toán MLP (Trang 106)

Tải bản đầy đủ (PDF)

(130 trang)