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