Tìm kiếm Tabu được đề xuất bởi Fred W. Glover năm 1986[3]. Nội dung của phương pháp này như sau:
Trong quá trình tìm kiếm trong không gian lời giải bằng cách di chuyển từ một lời giải s tại bước lặp t về một lời giải tốt nhất s’ trong tập con của miền lân cận của lời giải s. Vì lời giải s’ không nhất thiết cải thiện chi phí so với lời giải s, một cơ chế được đặt ra để ngăn chặn quá trình khỏi lặp vòng trên một chuỗi các lời giải. Một cách để tránh sự lặp vòng là cấm quá trình tìm kiếm quay về những lời giải đã gặp rồi, nhưng làm như vậy đòi hỏi phải lưu trữ khá nhiều thông tin. Thay vì làm thế, chỉ một vài thuộc tính của những lời giải đã gặp sẽ được lưu trong danh sách (được gọi là danh sách Tabu hay Tabu list) và bất kỳ lời giải nào sở hữu những thuộc tính này sẽ không được xét đến trong T lần lặp. Cơ chế này thường được gọi là bộ nhớ ngắn hạn và T được gọi là kỳ hạn tabu.
Tìm kiếm Tabu được phát triển thành nhiều dạng cải tiến như tìm kiếm tabu thích nghi (reactive tabu search [13]) và tìm kiếm tabu với hai danh sách tabu: bộ nhớ ngắn hạn và bộ nhớ dài hạn.
4.1.4 Ví dụ
Trong luận văn này, chúng tôi sẽ trình bay quá trình giải bài toán N-Queen (n = 8) theo mô hình tìm kiếm cục bộ (CBLS).
Bài toán N-Queen có thể mô hình hóa như sau:
Tập n biến quyết định X = {X0, X1..,Xn-1} Trong đó Xi là số dòng của con hậu đứng ở cột thứ i.
Miền giá trị D= {D0, D1.., Dn-1} Trong đó Di = {0, 1, 2,.., n-1} là miền giá trị của Xi.
Ràng buộc:
Chương 4: Tìm kiếm cục bộ dựa trên ràng buộc
o Xi + i ≠ Xj + j với mọi i ≠ j (các con hậu không cùng trên một đường chéo)
o Xi - i ≠ Xj - j với mọi i ≠ j (các con hậu không cùng trên một đường chéo) Một lời giải là một phép gán các giá trị S = {X0 = x0, X1 = x1,.., Xn-1 = xn-1} thỏa mãn tất cả các ràng buộc. Tập các lời giải lân cận của lời giải S là các lời giải S’ = {y0, y1.., ..yn-1} sao cho:
xi ≠ yi với 1 giá trị i duy nhất
xj = yj với mọi giá trị j ≠ i
Như vậy trong bài toán này, chỉ có duy nhất một loại bước di chuyển là gán lại 1 giá trị của phần tử Xi trong tập X. Lời giải được khởi tạo ngẫu nhiên, thuật toán dừng lại khi không còn vi phạm.
Lời giải tiếp theo được chọn ra trong các lời giải lân cận bằng thuật toán tìm kiếm tham lam:
Con hậu ở cột i mà đang bị khống chế nhiều nhất
Gán lại giá trị Xi làm giảm phạm vi nhiều nhất Dưới đây là mình họa quá trình tìm kiếm trong CBLS:
Chương 4: Tìm kiếm cục bộ dựa trên ràng buộc
Figure 6: N-queen bước 1
Figure 7: N-queen bước 2
Figure 8: N-queen bước 3
Bƣớc 1: Ta thấy con hậu ở cột 3 vi phạm nhiều nhất vì thế chọn X3 làm biến cần thay đổi
Di chuyển X3 theo các hàng, thấy chỉ có hàng thứ 7 và thứ 5 là làm giảm vi phạm của lời giải đi 1. Chọn ngẫu nhiên hàng 5 làm lời giải tiếp theo : X3 = 5
Bƣớc 2: Xét tiếp lời giải sau bước 1, ta thấy quân hậu ở cột 1, 2,3 đều có vi phạm là 2. Ta chọn quân hậu ở cột 1 làm biến cần thay đổi.
Quân hậu X1 di chuyển về hàng 6 và hàng 0 là tốt nhất. Ở đây chọn ngẫu nhiên là hàng 6. X1 = 6
Bƣớc 3: Các quân hậu ở cột 0, 1, 2, 3, 5, 6 có số vi phạm là như nhau. Chọn quân hậu ở cột 5 để thay đổi.
Quân hậu cột 5 di chuyển từ hàng 6 sang hàng 3 là tốt nhất. Chọn X5 = 3.
Chương 4: Tìm kiếm cục bộ dựa trên ràng buộc
Figure 9: N-queen bước 4
Figure 10: N-queen bước 5
Figure 11: N-queen bước 6
Bƣớc 4: Quân hậu ở cột 3 vi phạm nhiều ràng buộc nhất. Chọn X3 là biến cần thay đổi Di chuyển X3 về hàng 6 hoặc hàng 7 là tốt nhất. Ở đây chọn ngẫu nhiên hàng 7. X3 = 7
Bƣớc 5: Các quân hậu ở cột 0, 1, 3, 6 vi phạm nhiều nhất. Chọn ngẫu nhiên quân hậu ở cột 1 làm quân hâu cần di chuyển.
Di chuyển quân hậu cột 1 từ hàng 0 lên hàng 6 là tốt nhất vì thế gán X1 = 6
Bƣớc 6:Các quân hậu ở cột 3, 6 vi phạm nhiều nhất. Chọn ngẫu nhiêu quân hậu cột 6 làm mục tiêu thay đôi.
Di chuyển về hàng 5 là tốt nhất vì thế bước này gán X6 = 5
Chương 4: Tìm kiếm cục bộ dựa trên ràng buộc
Figure 12: N-queen bước 7
4.2 Thƣ viện JOpenCBLS
Thư viện JOpenCBLS (Java Open Constraint Based Local Searching) là thư viện tìm kiếm cục bộ dựa trên ràng buộc hỗ trợ ngôn ngữ lập trình Java cho phép mô hình hóa và giải các bài toán tối ưu tổ hợp. Thư viện này được phát triển bởi nhóm nghiên cứu “Thuật toán và tối ưu” tại viện Công nghệ thông tin và truyển thông, trường đại học Bách Khoa Hà Nội. Thư viện gồm hệ thống các API cho phép mô hình hóa và giải các bài toán tối ưu tổ hợp khác nhau bằng hướng tiếp cận tìm kiếm cục bộ .
4.2.1 Variables
4.2.1.1 Kiểu biến nguyên VarIntLS
Thư viện hỗ trợ khai báo các biến nguyên VarIntLS(ls, min, max)
VarIntLS(LocalSearchManager ls, int minValue, int maxValue)
Hàm khởi tạo
LocalSearchManager: đối tượng quản lý các biến, hàm, ràng buộc của bài toán
minValue: giá trị nhỏ nhất của biến
maxValue: giá trị lớn nhất của biến
setValuePropagate(int v) Set giá trị v cho biến VarIntLS
4.2.2 Functions
4.2.2.1 IFunction
Thư viện JOpenCBLS cung cấp sẵn một interface IFunction :
Bƣớc 7:
Không còn vi phạm, lời giải bài toán đã được thỏa mãn
Chương 4: Tìm kiếm cục bộ dựa trên ràng buộc
Trong đó:
getMinValue() Return giá trị nhỏ nhất của hàm
getMaxValue() Return giá trị lớn nhất
getValue() Return giá trị hiện tại của hàm
getAssignDelta(VarIntLS x, int val)
Return giá trị chênh lệch giữa giá trị của hàm khi gán biến x = val và giá trị của hàm tại thời điểm hiện tại
getSwapDelta(VarIntLS x, VarIntLS y)
Return giá trị chênh lệch của hàm nếu đổi giá trị 2 biến x và y
4.2.2.2 Một số function hay dùng
Thư viện JOpenCBLS cung cấp một số function hay sử dụng trong quá trình mô tả và tìm kiếm lời giải.
FuncPlus: phép cộng 2 function, 2 biến, function với biến hoặc với số nguyên
FuncPlus(IFunction f1, IFunction f2) f1 + f2 FuncPlus(IFunction f1, VarIntLS x) f1 + x FuncPlus(IFunction f1, int v) f1 + v FuncPlus(VarIntLS x, VarIntLS y) x + y FuncPlus(VarIntLS x, int v) x + v
FunctMinus: tương tự như FuncPlus, FuncMinus là phép trừ 2 function, 2 biến, function với biến, hoặc với số nguyên
FuncMinus(IFunction f1, IFunction f2) f1 - f2 FuncMinus(IFunction f1, VarIntLS x) f1 - x FuncMinus (IFunction f1, int v) f1 - v FuncMinus(VarIntLS x,
Chương 4: Tìm kiếm cục bộ dựa trên ràng buộc
VarIntLS y)
FuncMinus(VarIntLS x, int v)
x - v
ConditionSum: Trả về tổng trọng lượng của các phần tử trong mảng f, có giá trị bằng val, trọng số lưu giữ trong mảng w.
ConditionSum(IFunction[] f, IFunction[] w, IFunction val ∑ [ ] [ ] ConditionSum(VarIntLS [] f,
VarIntLS [] w, int val) ∑ [ ] [ ]
Sum: trả về tổng giá trị của 1 mảng (có thể là biến, hàm) có thể cả trọng số.
Sum(VarIntLS[] x, IConstant[]c) ∑ [ ] [ ] Sum(IFunction[] f) ∑ [ ] Sum(VarIntLS[] x) ∑ [ ] Occurrence: trả về số phần tử trong mảng x có giá trị bẳng val
Occurrence(VarIntLS[] x, int val)
Trả về số phần tử của mảng x bằng giá trị val
Sum(IFunction[] x, int val) Sum(IFunction[]x, IFunction val)
Occurrence(VarIntLS[] x, VarIntLS val)
Max, Min: trả về giá trị lớn nhất và giá trị nhỏ nhất trong mảng
max(VarIntLS[] x) Giá trị lớn nhất trong mảng x
max(IFunction[]x)
min(VarIntLS[] x) Giá trị nhỏ nhất trong mảng x
Chương 4: Tìm kiếm cục bộ dựa trên ràng buộc
4.2.3 Constraint
4.2.3.1 IConstraint
JOpenCBLS cung cấp giao diện IConstraint
Trong đó
violations Trả về số lượng các vi phạm ràng buộc
Violations(VarIntLS x) Trả về số lượng các vi phạm ràng buộc của biến x
getAssignDelta(VarIntLS x, int val)
Trả về chênh lệch các vi phạm ràng buộc khi gán biến x bởi giá trị val
getSwapDelta(VarIntLS x, VarIntLS y)
Return giá trị chênh lệch của hàm nếu đổi giá trị 2 biến x và y
4.2.3.2 Một số ràng buộc
JOpenCBLS đã cài đặt sẵn một số ràng buộc, người dùng có thể sử dụng trong quá trình mô hình hóa bài toán.
IsEqual(x,y): Thể hiện ràng buộc x=y trong đó x,y có thể là biến, hàm hoặc hằng số
NotEqual(x,y): Thể hiện ràng buộc x ≠ y trong đó x,y có thể là biến, hàm hoặc hằng số
LessOrEqual(x,y): Thể hiện ràng buộc x ≤ y trong đó x,y có thể là biến, hàm hoặc hằng số
Implicate(Constraint c1, Constraint c2): thể hiện ràng buộc c1 c2
AllDifferent([]x): Thể hiện mọi giá trị trong mảng biến hoặc mảng hàm x khác nhau
Ngoài ra JOpenCBLS cũng hỗ trợ người dùng tự định nghĩa một số hàm và ràng buộc riêng cho phù hợp với điều kiện bài toán.
4.2.4 Module tìm kiếm
Thư viện cung cấp các công cụ tìm kiếm tổng quát bao gồm:
Chương 4: Tìm kiếm cục bộ dựa trên ràng buộc
o selectMostViolatedVariable(): Trả về biến vi phạm nhiều ràng buộc nhất
o selelectMostPromissingValue(VarIntLS x) trả về giá trị tiềm năng nhất cảu biến x
MultiStageGreedySearch(Iconstraint S, int maxTime,
int maxStep, Boolean verbose): Tìm kiếm tham lam, thực hiện lạp lại 2 công việc lựa chọn biến vi phạm nhiều nhất bằng
selectMostViolatedVariable() và gán giá trị tiềm năng nhất cho biến bằng selelectMostPromissingValue()
Trong đó:
o S: Hệ thống ràng buộc
o maxTime, maxStep: Thời gian và số bước tối đa của quá trình tìm kiếm
o verbose: Tham số in ra hệ thống
TabuSearch(): Khởi tạo đối tượng tìm kiếm có sử dụng mảng Tabu để cấm các bước di chuyển lặp lại liên tục:
o Search(IConstraint S, tabulen, maxTime, maxStep, maxStable): Tìm lời giải với phạm vi nhỏ nhất. Trong đó:
Tabulen: độ dài mỗi lượt cấm trong mảng tabu
maxStep, maxTime: thời gian và số bước tối đa của quá trình tìm kiếm
maxStable: số bước tìm kiếm đối đa không cải thiện được của lời giải trước khi reset
o SearchMaintainConstraint(IFunction f, IConstraint S, int tabulen, int maxTime, int maxStep, int maxStable): Tìm lời giải cho hàm mục tiêu f nhỏ nhất trong phạm vi ràng buộc S.
Chương 5: Giải bài toán sắp xếp lịch bảo vệ cao học
Chƣơng 5. GIẢI BÀI TOÁN XẾP LỊCH BẢO VỆ CAO HỌC
Chương 5 của luận văn giới thiệu về bài toán sắp xếp lịch bảo vệ cao học. Trong chương này sẽ giải quyết bài toán bằng 2 phương pháp: quy hoạch ràng buộc với thư viện Choco và tìm kiếm cục bộ dựa trên ràng buộc với thư viện JOpenCBLS.
5.1 Phát biểu bài toán
Bài toán sắp xếp lịch bảo vệ cao học có mục tiêu là quản lý thông tin đào tạo và hỗ trợ việc sắp xếp lịch bảo vệ cao học. Thông thường, mỗi học viên cao học đến kỳ bảo vệ sẽ được thành lập một hội đồng bao gồm 5 thành viên:
Phản biện 1: giảng viên ngoài trường
Phản biện 2: giảng viên trong trường
Chủ tịch: giảng viên trong trường
Thư ký: giảng viên trong trường
Ủy viên: giảng viên ngoài trường
Việc xếp lịch bảo vệ cao học bao gồm việc gán cho mỗi học viên:
5 thành viên trong hội đồng
Kíp thời gian sẽ diễn ra buổi bảo vệ
Phòng nơi diễn ra buổi bảo vệ Thỏa mãn các ràng buộc sau đây:
2 hội đồng có chung giảng viên thì phải được xếp ở 2 kíp bảo vệ khác nhau
2 hội đồng được xếp vào cùng 1 kíp thì sẽ phải được xếp vào 2 phòng khác nhau
2 hội đồng được xếp vào cùng 1 phòng thì sẽ phải được xếp vào 2 kíp bảo vệ khác nhau
và các tiêu chí tối ưu:
Phản biện 1 và phản biện 2 phải phù hợp nhất với hướng đề tài luận văn của học viên trong hội đồng mà họ tham gia vào
Ngoài ra có thể có các tiêu chí khác như :
Sự di chuyển phòng của các giảng viên là tối thiểu
Sự liên tục của các kíp của các hội đồng mà mỗi giảng viên tham gia vào phải được đảm bảo nhất có thể được
Mức độ cân bằng nhau giữa số hội đồng mà từng giảng viên tham gia vào là tối đa
5 thành viên trong hội đồng không được trùng với giảng viên hướng dẫn
Tổng quát, bài toán sắp xếp lịch bảo vệ cao học được đặt ra như sau: Cho nStudent học viên
Chương 5: Giải bài toán sắp xếp lịch bảo vệ cao học
cho nStudent học viên bảo vệ sao cho:
Số hội đồng bảo vệ: nSlot
Số phòng bảo vệ: nRoom
Mỗi hội đồng có nProfessorPerStudent giảng viên.
2 hội đồng có chung giảng viên thì phải được xếp ở 2 kíp bảo vệ khác nhau
2 hội đồng được xếp vào cùng 1 kíp thì sẽ phải được xếp vào 2 phòng khác nhau
2 hội đồng được xếp vào cùng 1 phòng thì sẽ phải được xếp vào 2 kíp bảo vệ khác nhau
Phản biện 1 và phản biện 2 phải phù hợp nhất với hướng đề tài luận văn của học viên trong hội đồng mà họ tham gia vào
Một kết quả đúng của bài toán là một cách sắp xếp mỗi học viên vào hội đồng bảo vệ với các giảng viên, số phòng, số kíp sao cho thỏa mãn mọi ràng buộc.
5.2 Mô hình toán học của bài toán
Bài toán sắp xếp lịch bảo vệ được trình bày dưới mô hình toán học:
5.2.1 Đầu vào của bài toán
Danh sách các giảng viên: Từ 0 đến nProfessor -1
Danh sách các học viên: Từ 0 đến nStudent – 1
Danh sách các room: từ 0 đến nRoom -1
Danh sách các kíp: từ 0 đến nSlot – 1
Mức độ phù hợp Mi,j: thể hiện mức độ phù hợp về chuyên môn của giảng viên j với đề tài của học viên i.
5.2.2 Tập biến
XPi,j: biểu diễn giảng viên thứ j trong hội đồng của học viên i
o 0 ≤ i < nStudent
o 0 ≤ j < nProfessorPerStudent
o XPi,1: là giảng viên phản biện 1 trong hội đồng học viên i
o XPi,2: là giảng viên phản biện 2 trong hội đồng của học viên i
XRi: biểu diễn phòng của học viên i
XSi: biểu diễn kíp của học viên i
5.2.3 Miền xác định của các biến
0 ≤ XPi,j < nProfessor
0 ≤ XRi < nRoom
0 ≤ XSi < nSlot
5.2.4 Tập hợp các ràng buộc
Các giảng viên trong 1 hội đồng của một học viên là khác nhau: XPi,j ≠ XPi,k với mọi j ≠ k
Chương 5: Giải bài toán sắp xếp lịch bảo vệ cao học
XPi,j = XPk,l XSi ≠ XSk
Hai hội đồng cùng phòng thì ở 2 kíp khác nhau XRi = XRj XSi ≠ XSj
Hai hội đồng cùng kíp thì khác phòng XSi = XSj XRi ≠ XRj
5.2.5 Hàm mục tiêu
Trong luận văn này, chỉ xét hàm mục tiêu mức độ phù hợp về chuyên môn của phản biện 1 và phản biện 2 đối với hướng nghiên cứu của các học viên là tốt nhất.
∑
5.3 Cài đặt giải thuật tìm kiếm với thƣ viện Choco
Giải thuật tìm kiếm dựa trên quy hoạch ràng buộc được cài đặt trong class Schedule.
5.3.1 Đọc dữ liệu đầu vào
Hàm khởi tạo:
public Schedule(int n, int s, int r, int p) { numStudent = n;
numSlot = s; numRoom = r; numProfessor = p; }
Đọc mức độ phù hợp của học viên với từng giảng viên: Mức độ phù hợp từng học viên với giảng viên được biểu diễn trong một mảng 2 chiều, đọc từ file trong đó costArr[i][j] thể hiện mức độ phù hợp của học viên I với giảng viên j.
Hàm đọc mức độ phù hợp của từng học viên với giảng viên được đọc trước khi tiến hành xử lý. Trong chương trình được khởi tạo từ file cost.txt.
5.3.2 Khai báo biến
Danh sách các giảng viên trong hội đồng của từng học viên được khai báo