Chúng tôi thực hiện tìm kiếm thông qua module tìm kiếm Solver của thư viện Choco. Quá trình thực hiện tìm kiếm được thực hiện qua các 2 bước:
Đọc mô hình
Chương 5: Giải bài toán sắp xếp lịch bảo vệ cao học
CPSolver solver = new CPSolver(); solver.read(m);
solver.setTimeLimit(time*1000);
solver.maximize(solver.getVar(total),true);
5.4 Cài đặt giải thuật tìm kiếm dựa trên tìm kiếm cục bộ với thƣ viện JOpenCBLS
5.4.1 Khai báo các biến
Chương trình cũng khai báo các biến x_p, x_s, x_r tương ứng với các giảm khảo trong hội đồng của học viên i, kíp và phòng của học viên i
Các biến trên được khai báo dạng VarIntLS
VarIntLS[][] x_p = new VarIntLS[numStudent][NUM_PRO_PER_STUDENT]; VarIntLS[] x_s = new VarIntLS[numStudent]; // kip cua sv [0;s]
VarIntLS[] x_r = new VarIntLS[numStudent]; //rom cua sv [0;r]
5.4.2 Miền giá trị
Các biến được khai báo miền giá trị bằng hàm tạo VarIntLs
Các biến được gán giá trị ban đầu một cách ngẫu nhiên.
LocalSearchManager ls = new LocalSearchManager(); ConstraintSystem s = new ConstraintSystem(ls); java.util.Random R = new java.util.Random();
for (int i =0; i < numStudent; i++) {
for (int j =0; j < NUM_PRO_PER_STUDENT; j++) {
x_p[i][j] = new VarIntLS(ls, 0, numProfessor-1);
// gan gia tri random
x_p[i][j].setValue(R.nextInt(numProfessor)); }
x_s[i] = new VarIntLS(ls, 0, numSlot-1); x_s[i].setValue(R.nextInt(numSlot)); x_r[i] = new VarIntLS(ls, 0, numRoom-1); x_r[i].setValue(R.nextInt(numRoom)); }
5.4.3 Khai báo ràng buộc
5.4.3.1 Các giảng viên trong hội đồng của mỗi học viên phải khác nhau
JOpenCBLS hỗ trợ khai báo các ràng buộc thông qua phương thức post của
ConstraintSystem.Trong chương trình sử dụng ràng buộc AllDifferent để biểu diễn các giảng viên trong hội đồng của mối học viên là khác nhau.
for (int i =0; i < numStudent; i++) { s.post(new AllDifferent(x_p[i])); }
Chương 5: Giải bài toán sắp xếp lịch bảo vệ cao học
5.4.3.2 Hai học viên có có cùng giảng viên trong hội đồng thì phải khác kíp
JOpenCBLS hỗ trợ khai báo quan hệ Implicate giữa các ràng buộc. Ràng buộc hai học viên cùng giảng viên trong hội đồng thì phải khác kíp được mô hình hóa trong JOpenCBLS như sau:
for(int i = 0; i < numStudent-1; i++) {
for(int j = i+1; j < numStudent; j++){
for (int p1=0; p1<NUM_PRO_PER_STUDENT; p1++) {
for (int p2=0; p2 < NUM_PRO_PER_STUDENT; p2++) {
s.post(new Implicate(new IsEqual(x_p[i][p1], x_p[j][p2]), new NotEqual(x_s[i], x_s[j])));
} } } }
5.4.3.3 Hai học viên cùng kíp thì phải khác phòng
JOpenCBLS hỗ trợ xây dựng ràng buộc A B thông qua ràng buộc “implicate”. Chương trình khai báo ràng buộc hai học viên cùng kíp thì phải khác phòng như sau:
for(int i = 0; i < numStudent-1; i++) { for(int j = i+1; j < numStudent; j++){
s.post(new Implicate(new IsEqual(x_s[i], x_s[j]), new NotEqual(x_r[i], x_r[j])));
} }
5.4.3.4 Mô hình hóa hàm mục tiêu
Chúng tôi thiết kế và xây dựng lớp Match mô hình hóa hàm mục tiêu của bài toán và tích hợp vào thư viện.
public class Match extends AbstractInvariant implements IFunction {
private VarIntLS[] _x; // stored the variables
private int[][] _m;
private LocalSearchManager _ls; // local search manager
private int _n1; // number of students
private int _n2; // number of professors per student
private HashMap<VarIntLS, Integer> _map; // stored key-mapping of var
private VarIntLS[][] _x_p; // input variables
//implementation
… }
Chương 5: Giải bài toán sắp xếp lịch bảo vệ cao học
Trong class Match implement các phương thức sau: a. Post
Phương thức post được gọi trong quá trình tìm kiếm, được sử dụng để lưu lại giá trị tạm thời của các biến trong bước tìm kiếm.
void post() {
_x=new VarIntLS[_n1*_n2];
for(int i=0;i<_x_p.length;i++) {
for(int j=0;j<_x_p[0].length;j++) {
int k=_x_p[0].length*i+j;
_x[k]=_x_p[i][j]; }
}
_map=new HashMap<VarIntLS, Integer>();
for(int i = 0;i < _x.length; i++) {
_map.put(_x[i],i); }
_ls.post(this); }
b. Constructor
Hàm tạo có nhiệm vụ khởi tạo các thuộc tính của class và gọi method post
public Match(VarIntLS[][] x_p,int [][] m) {
_x_p = x_p; _m=m; _n1=x_p.length; _n2=x_p[0].length; _ls=x_p[0][0].getLocalSearchManager(); post(); } c. getAssignDelta
Phương thức getAssignDelta override từ IFunction có tác dụng implement lại cách tính chênh lệch về giá trị của hàm mục tiêu của bài toán với giá trị cũ khi gán giá trị một biến bằng một giá trị cụ thể.
@Override
public int getAssignDelta(VarIntLS x, int val) {
if(_map.get(x) == null)
return 0;
int nv = 0;
int k = _map.get(x);
Chương 5: Giải bài toán sắp xếp lịch bảo vệ cao học
int i = (k - j) / _x_p[0].length;
if( j == 0 || j == 1) {
nv=_m[i][val] - _m[i][_x_p[i][j].getValue()]; } else { nv=0; } return nv; } d. propagateInt
Phương thức propagateInt tính lại giá trị của hàm mục tiêu khi gán một biến bởi giá trị val.
@Override
public void propagateInt(VarIntLS x, int val) {
if(_map.get(x) == null)
return;
int nv = 0;
int k = _map.get(x);
int j = k % (_x_p[0].length);
int i = (k - j ) / 5;
if(j == 0 || j == 1) {
nv = _m[i][val] - _m[i][_x_p[i][j].getOldValue()]; } _value=_value+nv; } e. initPropagate
Phương thức initPropagate được Override để implement lại cách tính hàm mục tiêu.
@Override
public void initPropagate() {
int nv = 0;
for(int i = 0; i < _n; i++) {
nv = nv + _m[i][_x_p[i][0].getValue()] + _m[i][_x_p[i][1].getValue()]; } _value=nv; } f. getValue
Phương thức getValue được override, return về giá trị của hàm mục tiêu đã được lưu sẵn trong thuộc tính _value.
Chương 5: Giải bài toán sắp xếp lịch bảo vệ cao học
Override
public int getValue() {
// RETURN THE SPECIFY VALUE STORED IN _VALUE
return _value; }
5.4.4 Mô đun tìm kiếm
Chúng tôi thử nghiệm dựa trên mô đun tìm kiếm Tabu search của thư viện để giải bài toán đặt ra.
localsearch.search.TabuSearch ts=new localsearch.search.TabuSearch(); ts.search(s, 20, 3600,1000000,100);
// search tim max
ts.searchMaintainConstraints(m, s, 20,100,1000000,100);
5.5 Thử nghiệm và đánh giá
5.5.1 Dữ liệu thử nghiệm
Chúng tôi thử nghiệm 2 mô hình bài toán với thư viện Choco và JOpenCBLS trên một số bộ dữ liệu thật của viện Công Nghệ Thông Tin và Truyền Thông, trường Đại Học Bách Khoa Hà Nội và một số bộ dữ liệu được sinh ngẫu nhiên. Thời gian chạy tối đa của Choco là 1 giờ. Thời gian chạy tối đa của JOpenCBLS là 1 giờ. Các thử nghiệm được tiến hành trên máy CPU Intel Core i3 2.4GHz, Ram 2GB.
5.5.2 Kết quả thử nghiệm
Các kết quả được trình bày trên bảng 4 và 5. Kết quả cho thấy khi thực hiện với mô hình sử dụng thư viện Choco, có ưu điểm là chương trình luôn cho kết quả tối ưu. Nhưng với lượng dữ liệu đầu vào lớn, các ràng buộc chặt chẽ thư viện không tìm được lời giải bài toán trong thời gian cho phép. Khi thực hiện với mô hình sử dụng thư viện JOpenCBLS, cho kết quả thỏa mãn càng ràng buộc và hàm mục tiêu tốt trong thời gian ngắn.
Số lượng học viên
Số lượng giảng viên Thời gian chạy bằng Choco (s) Kết quả khi chạy bằng Choco 2 7 151 25 3 10 312 48 4 10 1575 62 9 13 1650 26 10 15 3600 chưa ra kết quả 17 23 3600 chưa ra kết quả 19 27 3600 chưa ra kết quả
Table 4: Kết quả thử nghiệm với mô hình sử dụng thư viện Choco
Số lượng học viên
Số lượng giảng viên Thời gian chạy (s)
Kết quả tốt nhất khi thực hiện chạy 10 lần với JOpenCBLS
Chương 5: Giải bài toán sắp xếp lịch bảo vệ cao học 3 10 2 48 5 10 42 62 9 13 24 26 17 23 53 40 19 27 253 233 30 50 417 74 30 70 357 540
Chương 6: Kết luận
Chƣơng 6. KẾT LUẬN
a. Kết luận
Mục tiêu của luận văn là giải bài toán sắp xếp lịch bảo vệ cao học bằng phương pháp quy hoạch ràng buộc và tìm kiếm cục bộ dựa trên ràng buộc.
Các kết quả đạt được của luận văn
Tìm hiểu bài toán sắp xếp lịch bảo vệ cao học
Tìm hiểu về bài toán thỏa mãn ràng buộc và phương pháp quy hoạch ràng buộc.
Tìm hiểu thư viện Choco.
Mô hình hóa và giải bài toán sắp xếp lịch bảo vệ cao học với thư viện Choco.
Mô hình hóa và giải bài toán sắp xếp lịch bảo vệ cao học với thư viện JOpenCBLS.
Khi cài đặt, giải quyết bài toán với thư viện Choco cho lời giải chính xác với dữ liệu đầu vào đơn giản. Khi dữ liệu lớn (số lượng học viện lớn, số lượng giảng viên lớn), chương trình mất nhiều thời gian để tìm ra lời giải. Thời gian cần thiết để tìm ra lời giải tăng lên nhanh chóng.
Khi cài đặt và giải quyết bài toán với thư viện JOpenCBLS, cho kết quả tương đối tốt, đã tìm ra lời giải mà tất cả các ràng buộc đều thỏa mãn và độ thích hợp giữa giảng viên phản biện và học viên chấp nhận được. Khi chạy lại nhiều lần, tăng thời gian chạy trên tabu search khiến cho kết quả tốt hơn. Hướng tiếp cận này cho phép mở rộng số lượng học viên, cho phép thay đổi bổ sung các ràng buộc khác và cho kết quả tương đối tốt trong thời gian chấp nhận được.
b. Hƣớng phát triển
Mặc dù dã hoàn thành nhiệm vụ của luận văn nhưng chương trình vẫn còn rất nhiều điều đáng quan tâm, chỉnh sửa và phát triển:
Tìm hiểu và xây dựng các chiến lược tìm kiếm mới hiệu quả hơn
Mở rộng các ràng buộc
Xây dựng cơ chế tính toán mức độ phù hợp của từng giảng viên với sinh viên.
Tài liệu tham khảo
[1] Burk, EK., P. De Causmaecker, and G. Vanden Berghe. A Hybrid Tabu Search Algorithm for the Nurse Rostering Problem, in Simulated Evolution and Leaning, Selected Pappers from the 2nd Asia-Pacific conference on Simulated Evolution and Leaning, SEAL 98, Springer Lecture Not in Artificial Itelligence Volume 1585. B. McKay, et al., Editors 19999: Springer.187-194
[2] Chris Groer, Bruce Goldern and Edward Wasil. “A library of local search heuristics for the vehicle routing problem”. Math. Prog. Comp. vol. 2, pages 79-101, 2011
[3] Fred Glover (1986). "Future Paths for Integer Programming and Links to Artificial Intelligence".
[4] F.Rosi, P.VanBeek and T.Walsh. Handbook of Contraint Programming Elsevier, 2006.
[5] Joseph Y-T. Leung. Handbook of Scheduling. Chapman & Hall/crc computer and information science series, 2000.
[6] Lopez-Ortizetal. 2003. A fast and simple algorithm for bounds consistency of the alldierent constraint.
[7] Michael Marte. Models and Algorithms for School Timetabling – A Constraint Programming Approach. PhD thesis, 2002.
[8] M. D. Moffitt and M. E. Pollack. Optimal rectangle packing: A meta-CSP approach. In Proceedins of the 16th International Conferenceon Automated Planning and Scheduling, 2006.
[9] M. Dincbas, H. Simonis, and P. Van Hentenryck. Solving the Car Sequencing Problem in Cóntraint Logic Programming. In Eurropean Conference on Artificial Intelligence (ECAI-88, 1988).
[10] M. Dinbas, H Simonis, and P. Van Hentenryck. Solving the Car Sequencing Problem in Constraint Logic Programming. In European Conference on Artificial Intelligence ECAI-88, 1988
[11] Pascal Van Hentenryck and Laurent Michel. Constraint based Local Search. The MIT Press 2005.
[13] R. Battiti and G. Tecchiolli, "The reactive tabu search", ORSA Journal on Computing, 1994.
[15] Choco http://choco-solver.org/
[14]. Employee Shift Scheduling Benchmark Data Sets,
http://www.cs.nott.ac.uk/~tec/NRP
[16] Gecode http://www.gecode.org/