Hàm mục tiêu

Một phần của tài liệu Giải bài toán xếp lịch bảo vệ thạc sỹ bằng các kỹ thuật tối ưu dựa trên ràng buộc (Trang 55)

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 trong mảng x_p:

IntegerVariable[][] x_p = new IntegerVariable[n][NUM_PRO_PER_STUDENT];

Trong đó:

 x_p[i][j] là giảng viên thứ j trong hội đồng của học viên i

 x_p[i][1]: là phản biện 1 của học viên i

 x_p[i][2]: là phản biện 2 của học viên i

 Danh sách các kíp của các học viên được khai báo trong mảng x_s.

Chương 5: Giải bài toán sắp xếp lịch bảo vệ cao học

 x_s[i]: là kíp của học viên thứ i.

 Danh sách các phòng của từng thí sinh được khai báo trong bảng x_r

IntegerVariable[] x_r = new IntegerVariable[n]; //

Trong đó:

 x_r[i]: là phòng của học viên thứ i.

5.3.3 Miền giá trị của các biến

 Miền giá trị của x_p: Giả sử danh sách các giảng viên là từ 0 đến p_1, khi đó ta có miền giá trị của x_p: 0 ≤ x_p[i][j] ≤ p – 1

 Miền giá trị của x_s: giả sử danh sách các kíp từ 0 đến s-1, khi đó ta có miền giá trị của x_s: 0 ≤ x_s[i] ≤ s – 1

 Miền giá trị của x_r: 0 ≤ x_r[i] ≤ r – 1

 Trong Choco, khai báo miền giá trị của các biến thông qua phương thức makeIntVar: (adsbygoogle = window.adsbygoogle || []).push({});

for(int i = 0; i < n; i++) {

for (int j =0; j < NUM_PRO_PER_STUDENT; j++) {

x_p[i][j] = Choco.makeIntVar("x_p" + i + "_" + j, 0 , p - 1); }

x_s[i] = Choco.makeIntVar("x_s" + i, 0 , s-1); x_r[i] = Choco.makeIntVar("x_s" + i, 0 , r-1); }

5.3.4 Khai báo các ràng buộc

5.3.4.1 Các giảng viên trong hội đồng của một học viên là khác nhau

 x_p[i][j] ≠ x_p[i][k] với mọi i, j, k trong đó j ≠ k

 Choco cung cấp ràng buộc neq để khai báo điều kiện khác nhau:

for (int i = 0; i < n; i++) {

for (int j = 0; j < NUM_PRO_PER_STUDENT; j++) {

for (int k = j+1; k < NUM_PRO_PER_STUDENT; k++) { m.addConstraint(Choco.neq(x_p[i][j],x_p[i][k])); }

} }

5.3.4.2 Nếu hai học viên có cùng giảng viên trong hội đồng thi phải khác kíp

 Nếu x_p[i][j] = x_p[k][l] thì x_s[i] ≠ x_s[k]

 Sử dụng ràng buộc implies trong Choco để biểu diễn ràng buộc trên

for(int i = 0; i < n-1; i++) {

for(int j = i+1; j < n; j++){

for (int p1=0; p1<NUM_PRO_PER_STUDENT; p1++) {

for (int p2=0; p2 < NUM_PRO_PER_STUDENT; p2++) { m.addConstraint(

Choco.implies(

Choco.eq(x_p[i][p1], x_p[i][p2]), Choco.neq(x_s[i], x_s[j])));

Chương 5: Giải bài toán sắp xếp lịch bảo vệ cao học

} }

} }

5.3.4.3 Hai học viên có cùng kíp bảo vệ thì khác phòng với nhau

 Mô tả: Nếu x_s[i] = x_s[j] thì x_r[i] ≠ x_r[j]

 Sử dụng ràng buộc implies trong Choco để mô hình hóa ràng buộc trên:

for(int i = 0; i < n-1; i++) {

for(int j = i + 1; j < n; j++){

m.addConstraint(Choco.implies(Choco.eq(x_s[i], x_s[j]), Choco.neq(x_r[i], x_r[j]))); } (adsbygoogle = window.adsbygoogle || []).push({});

}

5.3.5 Mô hình hóa hàm mục tiêu

 Mức độ phù hợp của học viên i và giảng viên j được thể hiện bời cost[i][j].

 Mục tiêu bài toán là mức độ phù hợp phản biện 1 và phản biện 2 với học viên là lớn nhất có thể biểu diễn thành ∑ [ ][ [ ][ ]] [ ][ [ ][ ]]

 Trong choco sử dụng ràng buộc nth để truy cập giá trị các biến.

IntegerVariable[] cost0=new IntegerVariable[n]; IntegerVariable[] cost1=new IntegerVariable[n];

for(int i = 0; i < n; i++) {

cost0[i]=Choco.makeIntVar("cost0 " + i, 0, sumCost); cost1[i]=Choco.makeIntVar("cost1 " + i, 0, sumCost); }

for(int i = 0; i < n; i++) {

IntegerVariable index=Choco.makeIntVar("Index"+ i , i, i);

m.addConstraint(Choco.nth(index, x_p[i][0], costArr, cost0[i])); m.addConstraint(Choco.nth(index, x_p[i][1], costArr, cost1[i])); }

// Bien objective cua bai toan

IntegerVariable total=Choco.makeIntVar("total ", 0, sumCost, Options.V_OBJECTIVE);

m.addConstraint(Choco.eq(total, Choco.plus(Choco.sum(cost1),Choco.sum(cost0))));

Hàm mục tiêu được khai báo trong biến total với option V_OBJECTIVE.

5.3.6 Modun tìm kiếm

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 (adsbygoogle = window.adsbygoogle || []).push({});

 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 { (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

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. (adsbygoogle = window.adsbygoogle || []).push({});

 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/

Một phần của tài liệu Giải bài toán xếp lịch bảo vệ thạc sỹ bằng các kỹ thuật tối ưu dựa trên ràng buộc (Trang 55)