Thích ngh

Một phần của tài liệu Ứng dụng giải thuật di truyền trong bài toán lập thời khóa biểu (Trang 30)

Đây là phần giải quyết các yêu cầu đưa ra cho bài toán, chủ yếu vẫn xem xét trên các thành phần ràng buộc. Tương ứng với mỗi loại ràng buộc chúng ta sẽ gán cho chúng một giá trị thích nghi nào đó, mà một khi cá thể đi qua, các ràng buộc được lắp đặt vào, và sẽ cho ra giá trị thích nghi cụ thể cho cá thể đó, kết thúc công việc tính độ thích nghi

Bây giờ chúng ta cần phải ấn định một giá trị thích hợp cho các nhiễm sắc thể. Ta sẽ áp dụng các yêu cầu tối thiểu cho lịch học của một lớp (không có gì lạ, ví dụ, chúng ta công nhận rằng giảng viên có thể đứng lớp bất cứ lúc nào).Cách làm như sau:

• Mỗi lớp học có thể có từ 0 đến 5 vị trí.

• Nếu lớp học sử dụng phòng trống, ta gia tăng score của nó.

bool ro = false;

for( int i = dur - 1; i >= 0; i-- ) {

if( _slots[ p + i ].size() > 1 ) { ro = true; break; } } if( !ro ) score++; _criteria[ ci + 0 ] = !ro;

• Nếu các lớp học đòi hỏi phải có máy tính trong phòng học, ta tăng score của nó. Nhưng nếu lớp học không cần máy tính, chúng ta cũng tăng score của nó bằng mọi cách.

_criteria[ ci + 2 ] = !cc->IsLabRequired() || ( cc->IsLabRequired() && r->IsLab() );

if( _criteria[ ci + 2 ] ) score++;

• Nếu lớp học ở phòng có đủ chỗ ngồi, ta tăng score của nó.

_criteria[ ci + 1 ] = r->GetNumberOfSeats()>cc>GetNumberOfSeats(); if( _criteria[ ci + 1 ] )

score++;

• Nếu giảng viên hiện có thể lên lớp ( không có lớp học khác) tại thời điểm đó, chúng ta tăng score của lớp lên một lần nữa.

• Và tiêu chí cuối cùng chúng ta cần kiểm tra là liệu nhóm sinh viên của lớp có phải học ở một lớp nào khác tại cùng một thời điểm không, và nếu không chúng ta tăng score của lớp đó.

for( int i = numberOfRooms, t = day * daySize + time; i > 0; i--,t += DAY_HOURS )

{

for( int i = dur - 1; i >= 0; i-- ) {

const list<CourseClass*>& cl =_slots[ t + i ]; for( list<CourseClass*>::const_iterator it =cl.begin(); it != cl.end(); it++ )

{

if( cc != *it ) {

if( !po && cc>ProfessorOverlaps(**it ) ) po = true;

if( !go && cc->GroupsOverlap( **it ) ) go = true; if( po && go ) goto total_overlap; } } } } total_overlap: if( !po ) score++; _criteria[ ci + 3 ] = !po;

if( !go ) score++; _criteria[ ci + 4 ] = !go; • Tổng số của lịch là tổng hợp tất cả các mặt của lớp học. _fitness = (float)score / Configuration::GetInstance().GetNumberOfCourseClasses() * DAYS_NUM ); 4.6 Chương trình thực nghiệm

Kết quả và demo chạy thử nghiệm chương trình lập lịch thời khoá biểu bằng giải thuật di truyền.

Chương trình demo bao gồm phần cơ sở dữ liệu tạo ra 2 phòng( room 1 và room 2) với tên giáo viên, tên môn học, tên phòng học, số giờ học ( quy định là 2h), lớp học với các thuộc tính được lập trình sẵn. Chương trình sẽ dừng khi hàm Fitness có giá trị bằng 1.00000

Một phần của tài liệu Ứng dụng giải thuật di truyền trong bài toán lập thời khóa biểu (Trang 30)