Hai học viên cùng kíp thì phải khác phòng

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 59 - 62)

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; }

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 59 - 62)

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

(66 trang)