Một hệ thống lập Thời khóa biểu hoạt động hiệu quả nhất thì phải đáp ứng đƣợc các yêu cầu nghiệp vụ của bài toán. Do đó, chúng ta sẽ lần lƣợt giải quyết từng ràng buộc của bài toán.
Khai báo các biến ràng buộc sử dụng trong chƣơng trình:
var<CP>{int} start[0..n-1](cp,1..200); var<CP>{int} day[0..n-1](cp,2..6); var<CP>{int} hour[0..n-1](cp,{1,3,4}); var<CP>{int} room[0..n-1];
n là số buổi học cần phải sắp lịch. 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. Mảng
day chứa danh sách các ngày học trong tuần (từ thứ 2 đến thứ 6), có giá trị ràng buộc trong đoạn [2, 6]. Mảng hour là danh sách các thời điểm bắt đầu tiết học, có giá trị ràng buộc trong tập giá trị {1, 3, 4}. Mảng room là danh sách các phòng học phục vụ cho quá trình giảng dạy và học tập. Ngoài ra, còn có mảng session có hai giá trị là 0 (tƣơng ứng với buổi sáng) hoặc 1 (tƣơng ứng với buổi chiểu), mảng
duration lƣu khoảng thời gian của mỗi môn học/buổi.
start[i]==24*day[i]+ 8*session[i] + hour[i]
Mảng start là lƣu thời gian bắt đầu của từng môn học trong một tuần đƣợc ánh xạ từ các ngày học, buổi học và giờ học của môn đó
Ràng buộc về giáo viên:
Mảng startTemp là danh sách thời điểm giảng dạy tƣơng ứng với từng giảng viên. Mảng durationTemp lƣu khoảng thời gian giảng dạy của giảng viên đó. Do tính chất ràng buộc, tại một thời điểm mỗi giáo viên chỉ có thể đảm nhận dạy một môn học. Vì vậy, đối với những giảng viên dạy từ hai lớp trở lên hoặc hai môn trở lên thì tại thời điểm giảng dạy startTemp, trong khoảng thời gian
durationTemp, một giáo viên chỉ dạy một môn. Ta có thể khái quát ràng buộc đó nhƣ sau:
28
Hàm cumulative muốn nói mỗi công việc giảng dạy i, bắt đầu từ thời gian startTemp[i], diễn ra trong khoảng thời gian duration[i], ứng với một giáo viên (arr[i]=1) thì chỉ cho phép dạy một môn học.
Ràng buộc về ngày nghỉ của giáo viên:
Chƣơng trình quản lý danh sách những ngày nghỉ mà giáo viên đã đăng ký. Để đảm bảo chƣơng trình không xếp lịch dạy cho giáo viên vào những buổi mà giáo viên đã đăng ký nghỉ thì ta phải khái quát ràng buộc nhƣ sau
if(sessionTemp[j]==sessionOff[k]) cp.post(dayTemp[j]!=dayoff[k]);
sessionTemp là buổi dạy của giáo viên, sessionOff là buổi mà giáo viên đăng ký nghỉ, dayTemp là ngày phải đi dạy và dayoff là ngày mà giáo viên đăng ký buổi nghỉ (sessionOff).
Ràng buộc về giáo viên nghỉ tiết đầu:
cp.post(hourTemp [j]!=1)
hourTemp là tập hợp giờ bắt đầu dạy theo danh sách giáo viên đã đăng ký nghỉ tiết đầu. Do dó, để thỏa mãn điều kiện không xếp lịch dạy vào các tiết đầu mà giáo viên nào đó đã đăng ký nghỉ, thì ta phải post lên ràng buộc giờ bắt đầu
hourTemp[j] luôn phải khác 1 (tiết 1). Ràng buộc về số tiết/buổi:
cp.post(hour[i] + duration[i] <= 6);
Theo chƣơng trình đào tạo, phòng Đào tạo quy định số tiết học trong một buổi tối đa là 5 tiết. Để đảm bảo thảo mãn điều kiện số tiết/buổi tối đa là 5, chƣơng trình post ràng buộc hour[i] + duration[i] <= 6. Ở đây duration đƣợc tính theo khoảng thời gian của một tiết.
Ràng buộc về môn học:
Trong các danh sách các môn học của phòng Đào tạo, một số môn học có số đơn vị học trình cao (≥4), có thể đƣợc chia thành nhiều học phần phân bổ vào các buổi học khác nhau. Ví dụ nhƣ môn tiếng Anh 2 có 6 đvht sẽ đƣợc chia thành
29
hai học phần,… Để đảm bảo trong một lớp, các học phần cùng môn học không dạy cùng một ngày thì ngày học học phần thứ i phải trƣớc ngày học học phần thứ i+1.
function void SubjectConstraint(var<CP>{int}[] day) { Solver<CP> cp = day[0].getSolver(); forall(i in 0..day.getSize()-2) cp.post(day[i] < day[i+1]); } forall(i in 0..subjectNumber-1) {
int[] arr_index = subjects[i];
var<CP>{int}[] temp = GetVar(day,arr_index); SubjectConstraint(temp);
}
Ràng buộc về lớp học:
cp.post(room[i]==room[j]=>((start[i]+duration[i]<=start[j])||( start[j]+duration[j]<=start[i])));
Tại một thời điểm, một phòng học chỉ có thể có một lớp học. Để đảm bảo điều kiện này, nếu room[i]==room[j] (cùng một phòng), thời điểm kết thúc (bằng thời điểm bắt đầu start cộng với khoảng thời gian duration) của i luôn nhỏ hơn thời điểm kết thúc (bằng thời điểm bắt đầu start cộng với khoảng thời gian
duration) của j hoặc ngƣợc lại.
Nên cố định phòng học đối với lớp khi học cùng một môn vào những buổi khác nhau.
Ràng buộc về lập lịch có lựa chọn trước:
Đối với việc lập lịch có lựa chọn trƣớc, giáo vụ khóa có thể lựa chọn cố định ngày học hay giờ học cho môn nào đó của lớp nào. Do đó, việc xếp lịch của chƣơng trình phải trùng với những giá trị khởi tạo mà giáo viên đã lựa chọn.
forall(i in 0..dayInit.getSize()-1) {
if(dayInit[i]!=0)
cp.post(day[i]==dayInit[i]); }
30 forall(i in 0..hourInit.getSize()-1) { if(hourInit[i]!=0) cp.post(hour[i]==hourInit[i]); } 4.3. Thực nghiệm
Mô hình của chƣơng trình gồm hai thành phần: Thành phần giao diện đƣợc viết bằng ngôn ngữ C# và thành phần xử lý các ràng buộc bài toán đƣợc viết bằng ngôn ngữ Comet. Phần giao diện cập nhật, xử lý các thao tác của ngƣời dùng nhƣ thêm, xóa…các dữ liệu của chƣơng trình và ghi ra file data.txt. Phần code comet đọc dữ liệu từ file data.txt và xử lý các ràng buộc đã đƣa ra của bài toán và ghi kết quả ra file output.txt. Kết quả trong file output.txt sẽ đƣợc đọc bởi thành phần giao diện và hiện thị trực quan hơn cho ngƣời dùng.
Hình 4-1. Mô hình bài toán Hệ thống lập Thời khóa biểu gồm các chức năng chính:
Quản lý danh sách giáo viên, danh sách môn học, danh sách phòng học, danh sách khoa.
Phân công giảng dạy Lập thời khóa biểu.
Cho phép xem thời khóa biểu theo lớp, theo giáo viên, theo phòng học.
data.txt output.txt
Comet Code C# Code
31
4.3.1. Các chức năng quản lý danh sách giảng viên, danh sách môn học, danh sách phòng học, danh sách khoa.
Chức năng quản lý giảng viên:
Hình 4-2. Quản lý giảng viên
Chức năng này để quản lý thông tin về giảng viên (tên giảng viên, thuộc khoa nào), đồng thời quản lý lịch nghỉ của từng giảng viên (ngày nghỉ, buổi nghỉ hay nghỉ tiết đầu) bằng cách click chuột vào checkbox tƣơng ứng. Bên cạnh đó, chức năng này cho phép ngƣời dùng có thể thêm một giảng viên, xóa một giảng viên trong danh sách hay cập nhật lại thông tin giảng viên.
32
Chức năng quản lý phòng học
Hình 4-3. Quản lý phòng học
Chức năng này cho phép ngƣời sử dụng xem danh sách phòng học, thêm mới phòng học, xóa một phòng học trong danh sách, cập nhật lại thông tin một phòng học. Phong học đƣợc quản lý theo tên phòng, số chỗ ngồi vào loại phòng (phòng thực hành hay phòng lý thuyết ).
33
Chức năng quản lý môn học
Hình 4-4. Quản lý môn học
Quản lý theo tên môn học, số tiết/ tuần, loại môn (phân loại theo: môn lý thuyết, môn thực hành). Căn cứ vào “loại môn” chƣơng trình sẽ phân lịch học từng môn theo phòng học tƣơng ứng (phòng thực hành và phòng lý thuyết). Chức năng này cho phép ngƣời sử dụng xem danh sách môn học, thêm mới môn học, xóa, cập nhật môn học.
34
Quản lý lớp học
Hình 4-5. Quản lý lớp học
Tƣơng tự nhƣ các chức năng quản lý môn học, quản lý phòng học, chức năng quản lý lớp học cũng cho phép hiển thị thông tin về lớp học (tên lớp, sĩ số), cho phép ngƣời sử dụng thêm mới một lớp, xóa hay cập nhật lại thông tin của một lớp.
35
Chức năng quản lý Khoa
Hình 4-6. Quản lý khoa
Chức năng này cho phép ngƣời dùng thêm, bớt hay cập nhật lại một Khoa. Bên cạnh đó, chức năng quản lý Khoa hiển thị danh sách các Khoa trong hệ đào tạo của trƣờng.
36
4.3.2. Chức năng phân công giảng dạy
Hình 4-7. Chức năng phân công giảng dạy
Chức năng này đƣợc thực hiện thủ công bằng tay bởi giáo vụ khoa, ngƣời phân công giảng viên giảng dạy từng môn, từng lớp. Chức năng này chủ yếu là hỗ trợ cho chức năng lập lịch. Giáo vụ khoa phải sắp xếp từng môn học cho từng lớp theo quy định của phòng đào tạo và phân công giáo viên giảng dạy môn học đó.
37
4.3.3. Chức năng xếp thời khóa biểu
Hình 4-8. Chức năng xếp Thời khóa biểu
Chức năng xếp thời khóa biểu đƣợc phân thành hai lựa chọn: Lập lịch mới hoàn toàn và Lập lịch chọn trƣớc (ngƣời sử dụng có thể lựa chọn, cố định môn học nào đó học vào buổi nào, tiết mấy). Sau khi chƣơng trình thực hiện lập lịch xong, xuất hiện một thông báo “Lập lịch đã hoàn thành”.
38
4.3.4. Chức năng xem thời khóa biểu theo tên lớp, tên giảng viên, phòng học
Để ngƣời dùng có thể tiện theo dõi thời biểu theo lớp, giảng viên hay phòng học thì hệ thống đã cung cấp chức năng hiển thị thời khóa biểu theo tên lớp, giảng viên, phòng học. Nhƣ vậy, không chỉ có các lớp học, giảng viên và các phòng học cũng có thời khóa biểu riêng rõ ràng và khoa học.
Xem thời khóa biểu theo tên lớp
39
Xem thời khóa biểu theo tên giảng viên
Hình 4-10. Xem Thời khóa biểu theo giảng viên Xem thời khóa biểu theo tên phòng học
40
CHƢƠNG 5:
KẾT LUẬN VÀ HƢỚNG PHÁT TRIỂN
Khóa luận trình bày tổng quát ngôn ngữ lập trình ràng buộc với các ví dụ minh họa để thấy đƣợc điểm khác biệt giữa lập lịch ràng buộc và lập trình truyền thống. Lập trình ràng buộc đang là một công nghệ tạo ra một hƣớng giải quyết mới cho các bài toán tổ hợp. Bên cạnh đó, khóa luận tìm hiểu chi tiết ngôn ngữ lập trình Comet, một ngôn ngữ lập trình ràng buộc tiên tiến nhất hiện nay và đang đƣợc ứng dụng rộng rãi.
Bằng các kiến thức đã thu nhận thông qua việc tìm hiểu ngôn ngữ lập trình ràng buộc Comet, khóa luận đã áp dụng vào giải quyết bài toán “lập Thời khóa biểu” cho các trƣờng đại học. Chƣơng trình thực hiện lập thời khóa biểu một cách tự động, chính xác, khắc phục đƣợc những khó khăn trong công việc lập thời khóa biểu bằng tay trên giấy. Tuy nhiên chƣơng trình vẫn tồn tại một số hạn chế:
- Chƣơng trình mới thực hiện phân xếp lịch theo lớp, chƣa đề cập tới việc phân lịch cho từng nhóm trong lớp.
- Chƣơng trình chƣa đề cập và giải quyết ràng buộc với cùng một môn học, cùng một lớp học thì nên sắp lịch cho lớp học học môn đó cố định tại một phòng học.
Một số hƣớng phát triển của bài toán:
- Giải quyết các vấn đề còn tồn tại để hoàn thiện chƣơng trình
- Phát triển hệ thống lập Thời khóa biểu cho cả các THPT, THCS … - Phát triển hệ thống lập Thời khóa biểu cho hệ đào tạo tín chỉ.
41
TÀI LIỆU THAM KHẢO
[1]. Alexander Shrijver, Combinatorial Optimization, September 1, 2002. [2]. Luca Bortolussi, Alessandro Dal Palù, and Agotino Dovier, Two constraint–based tools for protein folding.
[3]. Pascal Van Hentenryck Laurent Michel, Comet in context, 2003.
[4]. Pascal Van Hentenryck Laurent Michel, Constraint-Based Combinators for Local Search , 2005.
[5]. Roman Barták, Constraint propagation and backtracking–based search, Charles University, Faculty of Mathematics and Plysics, Department of Theoretical Computer Science, February, 1995.
[6]. Bài toán thời khóa biểu và phần mềm xếp thời khóa biểu,
http://www.vnschool.net//modules.php?name=News&file=article&sid=35
[7]. Comet, http://www.comet-online.org/Welcome.html.
[8]. Comet Tutorial, Dynamic decision technologies inc, august 28, 2009. [9]. Constraint Programming,
http://en.wikipedia.org/wiki/Constraint_programming