Phương pháp Tìm kiếm lân cận [16] (hay còn gọi là Tìm kiếm cục bộ, Local Search) là phương pháp heuristic thường được áp dụng để tìm phương án tối ưu hoặc cận tối ưu trong một không gian tìm kiếm mà khoảng cách giữa hai phương án bất kỳ đã được định nghĩa, tức là đã có một phép đo khoảng cách giữa hai phương án. Dựa trên đại lượng khoảng cách đó, khái niệm vùng lân cận sẽ được xác định. Ý tưởng chung của phương pháp Tìm kiếm lân cận là thực hiện vòng lặp gồm các bước sau:
1. Khởi tạo phương án ban đầu (theo kiểu ngẫu nhiên hoặc bằng một kỹ thuật nào đó).
2. Áp dụng một phép biến đổi cho phương án hiện có để thu được một tập phương án lân cận, đây là những phương án có khoảng cách (được xác định theo một độ đo xác định trước) tới phương án ban đầu nhỏ hơn hoặc bằng một ngưỡng quy định.
3. Lựa chọn phương án tốt nhất trong tập phương án lân cận, gán giá trị này cho phương án hiện có rồi quay trở lại đầu vòng lặp (bước 2).
Vòng lặp trên được thực hiện cho tới khi tìm được phương án đủ tốt để thỏa mãn điều kiện dừng.
Phương pháp Tìm kiếm lân cận đã được các nhóm nghiên cứu tích hợp vào PSO để cải thiện chất lượng của cá thể tại mỗi vòng đời [3],[19]. Trong không gian tìm kiếm, các phương án không hoàn toàn độc lập mà thường có mối quan hệ, mối quan hệ đó chi phối nhiều đặc tính của chúng. Chẳng hạn như trong bài toán Scheduling thì hai lịch biểu càng có nhiều thành phần trùng nhau thì giá trị makespan của chúng càng có khả năng gần nhau. Dựa vào quy luật tự nhiên này, các nhà nghiên cứu đã đề xuất nhiều kiểu lân cận (topology) khác nhau
như kiểu Ring, kiểu Von Neuman. Mỗi topology đó mô tả một cách xác định thứ tự giữa các phương án trong tập lân cận. Hình sau là một số kiểu lân cận được mô tả trong [3].
Hình 1.7. Kiểu lân cận Ring (a) và Von Neumann (b)
Sau khi đã xác định được thứ tự giữa các phương án lân cận, phương án
xik+1 ở vòng đời tiếp theo sẽ được xác định là:
xik+1 = xik + vik (1.12)
với vector dịch chuyển được định nghĩa bằng công thức:
vik+1 = ×vik + c1 rand1× (pbesti - xik) + c2rand2× (lbesti - xik)
Công thức này tương tự như công thức gốc của PSO được xây dựng bởi Kennedy và Eberhart, chỉ thay phương án tốt nhất của quần thể gbesti bằng
phương án tốt nhất lbesti trong tập lân cận của phương án đang xét xik.
Trong bài báo [CT2] đã xây dựng thuật toán L-PSO áp dụng phương pháp Tìm kiếm lân cận, tuy nhiên bài toán đặt ra trong [CT2] không phải là đối tượng nghiên cứu của luận án này, vì vậy phần phát biểu bài toán và phần thực nghiệm không được giới thiệu ở đây, mà chỉ trình bày việc tích hợp phương pháp lân
N k k-1 k+1 1 ... 3 2 4 k k+1 k-1 m m+1 m-1 k k+1 k-1 n n+1 n-1 (a) (b)
cận tích hợp trong thuật toán PSO. Trong [CT2], áp dụng phương pháp lân cận Ring với vùng lân cận có phạm vi k = 2, nghĩa là phương án đang xét xi sẽ có
tập lân cận bao gồm 2 phần tử là left (xi) và right (xi). Thuật toán đề xuất L-
PSO được mô tả trong [CT2] như sau:
Algorithm LPSO()
Input: T,S,dữ liệu công việc W[1×M],P[1×N],B[N×N],D[M×M],
hằng số K, độ lệch , số lượng cá thể của quần thể NoP
Output: phương án gần đúng tốt nhất gbest
Begin
1. For i=1 to NoP do
2. xi= random vectors; vi= random vectors; // Khởi tạo
giá trị ngẫu nhiên cho vector vị trí và vector dịch
chuyển của cá thể i
3. end for
4. t= 0; // Khởi tạo bước lặp
5. While (the deviation of gbest > ) Do
6. for i=1 to NoP do
7. Compute new position xi // Tính vector vị trí xi
theo công thức (1.12) 8. end for
9. for i=1 to NoP do
10. Update pbesti; // Cập nhật pbesti
11. end for
12. Update gbest; // Cập nhật gbesti
13. for i=1 to NoP do
14. lbesti = Ring(xi) ; // Cập nhật lbesti
15. end for
16. for i=1 to NoP do
17. Update vik and compute xi ; // Cập nhật vector
dịch chuyển vik và xi 19. end for
20. t++ ;
21. if (the deviation of gbest ≤ after K generations)
// nếu sau K thế hệ mà độ lệch giữa các gbest
không vượt quá
then gbest= Variable_Neighborhood_Searching (gbest);
23. End while;
24. Return gbest;
End Function
tính bởi hàm Ring() như sau:
Function Ring(xi)
Input: phương án đang xét xi
Output: x trong đó Fitness(x) = min{Fitness(xi),
Fitness(Left(xi)), Fitness(Right(xi))}
Hàm tìm kiếm lân cận Variable_Neighborhood_Searching(), hạt nhân của thuật toán LPSO được mô tả như sau:
Function Variable_Neighborhood_Searching ( )
Input: vector vị trí xi
Output: vector vị trí xk có Fitness(xk) < Fitness(xi) Begin
1. t = 0; // Khởi tạo bước lặp
2. while (Fitness(xk) > Fitness (xi) and (t <
Max_Iteration))
3. r = random [1,M]; // Khởi tạo giá trị r ngẫu
nhiên trong đoạn [1, M] 4. xi = RotateRight(xi, r);
5. rand1 = [1,M]; rand2 = [1,M]; // Khởi tạo ngẫu nhiên rand1, rand2 [1,M]
6. xk = Exchange (xi, rand1, rand2); 7. if Fitness(xk) < Fitness(xi) then 8. return xk 9. else 10. return xi; 12. end if 11. t = t+1; 12. end while End.
Hình 1.8. Hàm RotateRight (a) và hàm Exchange (b)
trong đó hàm RotateRight() và hàm Exchange() được thiết kế để giúp tạo ra cá thể đột biến cho quần thể hiện tại.
Hàm RotateRight sẽ tịnh tiến toàn bộ các phần tử của phương án về bên phải, còn hàm Exchange sẽ hoán đổi hai phần tử của phương án như hình 1.8.
(b) (a)
3 1 2 3 1 3 1 2 3 1