Tải bản đầy đủ (.docx) (15 trang)

báo cáo môn trí tuê nhân tạo xây dựng giải thuật giải quyết bài toán lập lịch cho trường học

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (178.7 KB, 15 trang )

Viện Công nghệ thông tin và truyền thông
Đại Học Bách Khoa Hà Nội
Bài Tập Lớn
Lập lịch giảng dạy trong trường học
Môn học: Trí tuệ nhân tạo
Giáo viên hướng dẫn: Phạm Văn Hải
Nhóm sinh viên thực hiện: Nhóm 11
Nguyễn Quang Quân MSSV: 20102043
Phạm Hoàng Đạt MSSV: 20101358
Phạm Công Hiếu MSSV: 20101523
Đặng Văn Long MSSV: 20101793
Lê Văn Thọ MSSV: 20102256
Hà Nội 8/2013
1
MỤC LỤC
MỤC LỤC…………………………………………………………………… 2
Lời mở đầu…………………………………………………………………… 3
I. Đặt vấn đề……………………………………………………………………4
II. Mô tả bài toán lập thời khóa biểu…………………………………………4
a. Các thông tin của bài toán………………………………………… 4
b. Các rang buộc của bài toán………………………………………….5
III. Mô hình bài toán………………………………………………………….5
IV. Thiết kế thuật giải…………………………………………………………7
V. Chương trình demo………………………………………………………10
VI. Vấn đề…………………………………………………………………….11
Tài liệu tham khảo……………………………………………………………12
2
Lời mở đầu
Bất kỳ trường học nào cũng cần thiết phải lập ra một thời khóa biểu
giảng dạy cho các thầy cô lên lớp, để làm sao phải phù hợp với chương trình
đào tạo mà chính phủ, bộ giáo dục đã đề ra cũng như với chuyên môn của mối


thầy cô.
Bài toán lập thời khóa biểu trong trường học là một trường hợp riêng
của bài toán lập lịch được xếp vào hàng các bài toán khó chưa có được một
giải thuật tối ưu để giải quyết. Trong quá trình học tập môn “Trí tuệ nhân
tạo”, chúng em thấy có một cách tiếp cận khá mới mẻ, thú vị dể giải quyết bài
toán này, đó là lập trình thỏa mãn ràng buộc. Vậy nên nhóm chúng em đã
quyết định lựa chọn đề tài này!
Do còn hạn chế về tri thức cũng như kĩ năng lập trình nên bài tập lớn
vẫn còn một số sai sót. Vì vậy chúng em mong thầy và các bạn góp ý thêm để
chương trình được hoàn thiện hơn. Chúng em xin chân thành cảm ơn!
3
I. Đặt vấn đề
Sắp xếp thời khóa biểu tại các trường học là bài toán phải luôn được
thực hiện trước khi học kỳ mới bắt đầu. Trước khi bắt đầu học kỳ mới, nội
dung các môn học và giáo viên phụ trách môn học của từng lớp được xác
định thông qua buổi họp chuyên môn của các bộ môn, kết quả các buổi họp
này sẽ được gửi lên cho ban giám hiệu nhà trường và ban giám hiệu sẽ chịu
trách nhiệm lập lịch giảng dạy cho toàn trường dựa trên số liệu ở trên.
Đây là một bài toán mang tính thực tiễn cao nhưng lại rất khó để giải
quyết. Nhất là trong những năm mà công nghệ thông tin chưa phát triển thì
những người làm công việc quản lý của từng trường sẽ phải tốn rất nhiều
thời gian và công sức để lập ra được thời khóa biểu giảng dạy cho trường
của mình. Họ phải mất hàng tuần làm việc vất vả mới có thể hoàn thành được
môt cái thời khóa biểu làm việc trong một tuần cho các thầy cô trong. Tuy
nhiên cũng chưa chắc chắn sẽ đảm bảo được tính hợp lý!
Và ngày nay, khi mà công nghệ thông tin phát triển một cách chóng
mặt. Ta hoàn toàn có thể thiết kế một chương trình chuyên biệt để giải quyết
bài toán lập thời khóa biểu một cách đơn giản và dễ dàng hơn.
Để đơn giản bài toán đặt ra, chúng em chỉ lập thời khoá biểu trên một
tuần dựa trên dữ liệu có sẵn. Các môn học có số đơn vị học trình cao (>4)

không được xét đến trong chương trình này.
4
II. Mô tả bài toán lập thời khóa biểu.
a. Các thông tin của bài toán.
• Danh sách giáo viên gồm: mã số, tên, số giờ dạy tối đa.
• Danh sách các phòng học gồm: mã phòng, tên phòng.
• Danh sách các môn học: mã môn học, tên môn học, số tiết trong tuần.
b. Các ràng buộc của bài toán.
o Ràng buộc về ngày học: Một tuần có 5 ngày đi học quy định từ
thứ 2 đến thứ 6. Thứ 7 và chủ nhật là ngày nghỉ cho nên
chương trình không xếp lịch học vào các ngày thứ 7 và chủ nhật.
o Ràng buộc về giáo viên: Lịch giảng dạy của mỗi giáo viên không
bị chồng chéo lên nhau. Tức là tại một thời điểm, giáo viên chỉ
đảm nhiệm giảng dạy một lớp học.
o Ràng buộc về số tiết tối đa trong tuần của giáo viên: Số tiết dạy
của giáo viên không được vượt quá số tiết tối đa trong tuần của
giáo viên đó.
o Ràng buộc về số tiết/buổi: Số tiết học trong một buổi không quá
6 tiết/buổi.
o Ràng buộc về lớp học: Mỗi phòng học tại một thời điểm chỉ có
một lớp học.
Mục tiêu:
Tìm ra được một thời khóa biểu phù hợp, thỏa mãn tất cả các rang
buộc đã nêu ở trên.
5
III. Mô hình bài toán.
- Các chỉ số:
g: chỉ số giáo viên.
t: chỉ số ngày
p: chỉ số phòng

- Các tham số:
Tgv: tổng số giáo viên
Tphong: tổng số phong
Tmon: tổng số môn
- Các biến ràng buộc:
+ Mảng day, hour, room chứa các biến ràng buộc về ngày giảng dạy,
giờ bắt đầu và phòng học của các buổi học.
day[] có giá trị 2 ≤ day ≤ 6;
hour[] có giá trị 0 ≤ hour ≤ 5;
room[] có giá trị 0 ≤ room ≤ Tphong
+ Mảng duration chứa biến về thời gian kéo dài của buổi học (hay là
bằng với số tiết/tuần của môn học đó).
+ Mảng teacher chứa các biến ràng buộc về ngày giảng dạy, giờ bắt
đầu và phòng học của các buổi học.
+ Mảng gvtd[] chứa số lượng tiết tối đa của giáo viên.
- Biểu diễn ràng buộc:
+ Ràng buộc về giáo viên: Lịch giảng dạy của mỗi giáo viên không bị
chồng chéo lên nhau. Tức là tại một thời điểm, giáo viên chỉ đảm nhiệm
giảng dạy một lớp học.
6
(day[i] == day[j]) && (((hour[j]+duration[j]) > hour[i]) || ( hour[i] +
duration[i]) > hour[j])) && (teacher[i] == teacher[j])
+ Ràng buộc về số tiết tối đa trong tuần của giáo viên: Số tiết dạy của
giáo viên không được vượt quá số tiết tối đa trong tuần của giáo viên
đó.
for (int j = 0; j<i;j++){
if(teacher[i] == teacher[j]){
dem = dem+duration[j];
}
}

dem < gvtd[teacher[i]]
+ Ràng buộc về số tiết/buổi: Số tiết học trong một buổi không quá 6
tiết/buổi.
hour[i] + duration[i]) > 6
+ Ràng buộc về lớp học: Mỗi phòng học tại một thời điểm chỉ có một lớp
học.
((room[i] == room[j]) && (day[i] == day[j])) && (((hour[j]+duration[j])
> hour[i]) || ( hour[i] + duration[i]) > hour[j]))
IV. Thiết kế thuật giải
1. Thuật toán quay lui (backtracking)
Giải thuật tìm kiếm quay lui (backtracking)
- Gán giá trị lần lượt cho các biến – việc gán giá trị của biến này chỉ
được làm sau khi hoàn thành gán giá trị cho biến khác.
- Sau mỗi phép gán kiểm tra các ràng buộc có được thoả mãn bởi tất cả
các biến đã được gán giá trị cho tới thời điểm hiện tại – Quay lui nếu
có lỗi (không thoả mãn ràng buộc).
Nhược điểm của thuật toán quay lui:
7
- Lặp đi lặp lại lỗi: Bỏ qua các lý do của mâu thuẫn
- Lặp lại các kiểm tra ràng buộc không cần thiết
- Phát hiện muộn các mâu thuẫn (vi phạm ràng buộc)
Ưu tiên biến:
Việc ưu tiên biến nhằm cải thiện hiệu quả của thuật toán
- duration vì liên quan đến nhiều ràng buộc nhất
- day và teacher
- room
Code (java):
- Hàm chính
public void XepLich(int i){ //i là số thứ tự môn đang xét
if(i == Tmon){

XuatDuLieu();
} else {
A: for(int n=0;n < 3;n++){ // duration
for(int t=2;t<=6;t++){ // day
for(int g=0;g<Tgv;g++){ // teacher
for(int p = 0; p < Tphong ;p++){ // room
if(kt(i,p,t,tietbd[n],g)){
// lưu giá trị
day[i] = t;
hour[i] = tietbd[n];
room[i] = p;
teacher[i] = g;
XepLich(i+1); // hàm đệ quy
break A;
}
}
8
}
}
}
}
}
- Hàm kiểm tra:
public boolean kt(int i, int p, int t, int bd, int g){
if((bd+duration[i])>6){//Ràng buộc về số tiết/buổi
return false;
}
int dem = 0;
for (int j = 0; j<i;j++){
//Ràng buộc về giáo viên

if((t == day[j])&&((hour[j]+duration[j])>bd)&&(g==teacher[j])) {
return false;
}
//Ràng buộc về lớp học
if(((p == room[j])&&(t == day[j]))&&((hour[j]+duration[j])>bd)) {
return false;
}
if(g==teacher[j]){
dem = dem+duration[j];
}
}
if(dem>gvtd[g]){
//Ràng buộc về số tiết tối đa trong tuần của giáo viên
return false;
}
return true;
}
Cây lời giải:
9
2. Thuật toán kiểm tra tiến (Forward Checking)
Thuật toán kiểm tra tiến (Forward Checking):
Mục đích của thuật toán kiểm tra tiến là để tránh các thất bại bằng
kiểm tra trước các ràng buộc.
Kiểm tra tiến đảm bảo sự phù hợp giữa biến đang được xét gán giá trị
và các biến khác có liên quan (ràng buộc) trực tiếp với nó.
Ý tưởng:
• Ở mỗi bước gán giá trị, theo dõi các giá trị hợp lệ (có thể được
gán) đối với các biến chưa được gán giá trị.
• Loại bỏ (dừng) hướng tìm kiếm hiện tại khi có bất kỳ một biến
(chưa được gán giá trị) nào đó không còn giá trị hợp lệ.

Vì tính chất của bài toán, hàm kiểm tra các biến chưa được gán sẽ quy
về việc kiểm tra biến có thời gian học trong tuần lớn nhất, vì nếu biến này còn
giá trị hợp lệ thì các biến khác cũng sẽ còn giá trị hợp lệ.
Code (java):
- Hàm chính:
public void FC(int i, boolean B[][][][]){
boolean A[][][][] = new boolean[7][7][Tphong][Tgv];//Miền giá trị hợp lệ
if(i == 0) {
//Khởi tạo miền giá trị ban đầu
for(int n=0;n < 5;n++){ //tiết bắt đầu
10
for(int t=2;t<=6;t++){ //thứ
for(int g=0;g<Tgv;g++){ //giáo viên
for(int p = 0; p < Tphong ;p++){ //phòng
A[t][n][p][g] = true;
}
}
}
}
} else A=B; //Giữ lại miền giá trị của lời giải trước đó
if(i == Tmon){
XuatDuLieu();
} else {
C: for(int n=0;n < (6-duration[i]);n++){ //Ràng buộc về số tiết/buổi
for(int t=2;t<=6;t++){ //thu
for(int g=0;g<Tgv;g++){ //giao vien
for(int p = 0; p < Tphong ;p++){ //phong
if(!A[t][n][p][g]) continue; // loai bo gia tri ko hop le
if(CheckForward(i, A)) {
for(int j=n;j<n+duration[i];j++){

A[t][j][p][g] = false;
for(int k=0;k<Tgv;k++){//Ràng buộc về lớp học
A[t][j][p][k] = false;
}
for(int m=0;m<Tphong;m++){//Ràng buộc về giáo viên
A[t][j][m][g] = false;
}
}
11
day[i] = t;
hour[i] = n;
room[i] = p;
teacher[i] = g;
FC(i+1,A);
break C;
}
}
}
}
}
}
}
- Hàm kiểm tra tiến
boolean CheckForward(int i, boolean A[][][][]) {
int maxD = 0;
for(int j=i+1;j<Tmon;j++){
if(duration[j]>duration[maxD]) maxD = j;
}
//kiem tra voi mon co so tiet trong tuan lon nhat
//neu mon nay con xep dc cho thi cac mon khac cung xep dc

for(int p=0; p<Tphong ;p++){
for(int t=2;t<=6;t++){
for(int n=0;n < 6;n++){
for(int g=0;g<Tgv;g++){
if(A[t][n][p][g] && ((n+duration[maxD])<6)) return true;
}
}
}
}
int tgv[] = null;
tgv = gvtd;
for (int g = 0; g<Tgv;g++){
for (int j = 0; j<i;j++){
if(g==teacher[j]){
tgv[g] = tgv[g]-duration[j];
}
}
12
if(tgv[g]>=duration[maxD]) return true;
}
return false;
}
V. Chương trình demo
Giao diện chính:
Ngôn ngữ và công cụ lập trình:
- Java
- NetBeans IDE
- SQLite
Các chức năng:
- Tạo thời khoá biểu bằng thuật toán backtracking và forward-checking.

- Xem các môn học, giáo viên, danh sách phòng.
- Chỉnh sửa CSDL
- Thoát chương trình.
13
VI. Vấn đề.
*) Các khó khăn trong quá trình thực hiện:
- Thiết kế, tổ chức chương trình.
- Kết nối đến cơ sở dữ liệu
*) Dự tính ban đầu của nhóm là sử dụng cả thuật toán di truyền để giải bài
toán này nhưng do gặp phải khó khăn nên nhóm đã quyết định sử dụng dừng
lại ở hai thuật toán back tracking và forward checking.
Bên cạnh đó thì chương trình này vẫn chưa phân chia tốt độ ưu tiên
giữa việc thứ tự gán giá trị cho các biến, thứ tự giá trị được gán với mỗi biến.
*) Trong thời gian tới, nhóm sẽ nghiên cứu thêm về việc sử dụng giải thuật di
truyền với nhiều ràng buộc hơn kết hợp với các tri thức bổ sung cụ thể của
bài toán để giải bài toán tối ưu hơn. Bổ sung thêm các chức năng tạo các cơ
sơ dữ liệu về giáo viên, phòng học, lớp học…
Tài liệu tham khảo
14
1. Slide “Trí tuệ nhân tạo” – Phạm Văn Hải, Viện Công nghệ thông tin và
truyền thông, Đại học Bách Khoa Hà Nội
2. On The Forward Checking Algorithm - Fahiem Bacchus and Adam
Grove
3. />15

×