Tải bản đầy đủ
Xây dựng thuật toán xếp lịch thi dựa trên thuật toán tô màu đồ thị.

Xây dựng thuật toán xếp lịch thi dựa trên thuật toán tô màu đồ thị.

Tải bản đầy đủ

44

1.
2.
3.
4.
5.
6.
7.

Output: Danh sách các môn thi đã được lên lịch, nếu là môn thực hành thì
phải được gán phòng thực hành.
Các bước thực hiện:
B1: Gom nhóm các môn thi theo nhóm sao cho các môn không được thi
trùng nhau thành một nhóm (các môn cao đẳng, các môn trung cấp, các môn
sử dụng chung phòng thi viết, vấn đáp hoặc thực hành,….).
B2: Xếp phòng thực hành đối với các môn thi thực hành.
B3: Thiết lập đồ thị cho toàn bộ các môn thi: hai môn thi cùng nhóm thì
nối với nhau.
B4: Áp dụng thuật toán tô màu đồ thị để gán các thời điểm thi cho các
môn thi:
B4.1: Lập danh sách các môn thi theo thứ tự giảm của bậc, đặt i=1, với i là
thứ tự các thời điểm thi.
B4.2: Gán thời điểm thi thứ i cho môn đầu tiên, duyệt lần lượt các môn
tiếp theo và gán thời điểm thứ i cho môn không có chung cạnh với môn đã
được gán thời điểm thứ i.
B4.3: Nếu đã gán xong thời điểm thi cho các môn thì dừng thuật toán, lịch
thi được xếp bởi i thời điểm, ngược lại chuyển sang B4.4.
B4.4: Xóa khỏi danh sách các môn thi đã xếp lịch, lập lại danh sách mới
với các môn thi chưa được lên lịch với thứ tự bậc giảm dần, đặt i=i+1; quay
lại B4.2.
Ví dụ: Xếp lịch thi cho 7 môn như sau:
Mạng máy tính, hệ cao đẳng, thi máy.
Toán rời rạc, hệ cao đẳng, thi tự luận.
Lập trình web, hệ trung cấp, thi máy.
Phát triển ứng dụng web với ASP.NET, hệ cao đẳng, thi máy.
Kiến trúc và tổ chức máy tính, hệ trung cấp, thi tự luận.
Tin học cơ sở, hệ trung cấp, thi máy.
Chuyên đề 1, hệ trung cấp, thi tự luận.
Với các phòng thực hành: A6.MT, A21.3
Thời gian thi: 7h-15/10, 9h-15/10, 13h-15/10, 15h-15/10, 7h-16/10, 9h16/10
Xếp lịch:
B1: phân nhóm
+ Nhóm cao đẳng: Toán rời rạc(2)
+ Nhóm trung cấp: Kiến trúc và tổ chức máy tính(5), Chuyên đề 1(7)
+ Nhóm cao đẳng, thực hành: Mạng máy tính(1), Phát triển ứng dụng web
với ASP.NET(4)
+ Nhóm trung cấp, thực hành: Lập trình web(3), Tin học cơ sở(6)
B2: gán phòng cho các môn thực hành
+ Mạng máy tính(1): phòng A21.3
+ Phát triển ứng dụng web với ASP.NET(4): phòng A6.MT

45

+ Lập trình web(3): phòng A6.MT
+ Tin học cơ sở(6): phòng A21.3
B3: tạo đồ thị tương ứng với các môn học

Hình 3.2. Đồ thị biểu diễn các môn thi
Số trên mỗi đỉnh là số thứ tự của môn thi
B4: áp dụng thuật toán tô màu đồ thị để tiến hành xếp lịch thi cho các môn
B4.1: tạo danh sách các môn theo bậc giảm dần E’=(3,6,1,4,5,7,2), đặt
i=1;
B4.2: lấy giờ thi thứ nhất xếp cho môn thứ (3), duyệt lần lượt danh sách và
xếp giờ này cho môn thứ (1).
B4.3: các môn chưa được xếp lịch xong, chuyển sang B4.4.
B4.4: loại bỏ 2 môn (3) và (1) ra khỏi danh sách, và sắp xếp lại E’ ta được
E’=(6,4,5,7,2), tăng i=2, trở về B4.2.
B4.2: lấy giờ thi thứ hai xếp cho môn thứ (6), duyệt lần lượt danh sách và
xếp giờ này cho môn thi thứ (4).
B4.3: các môn chưa được xếp lịch xong, chuyển sang B4.4.
B4.4: loại bỏ 2 môn (6) và (4) ra khỏi danh sách, và sắp xếp lại E’ ta được
E’=(5,7,2), tăng i=3, trở về B4.2.
B4.2: lấy giờ thi thứ 3 xếp cho môn thi thứ (5), duyệt lần lượt các môn
trong danh sách và xếp giờ này cho môn thứ (2).
B4.3: các môn chưa được xếp lịch xong, chuyển sang B4.4.
B4.4: loại bỏ 2 môn (5) và (2) ra danh sách, và sắp xếp lại E’ ta được
E’=(7), tăng i=4, quay lại B4.2.
B4.2: lấy màu thứ tư xếp cho môn thi thứ (7).
B4.3: các môn thi đã được xếp lịch, dừng thuật toán, cần dùng 4 giờ thi để
sắp xếp lịch cho 7 môn thi này.

46

Hình 3.3. Đồ thị các môn thi đã được lên lịch

3.3. Xây dựng chương trình xếp lịch thi.
Cài đặt các bước của thuật toán:
Trong chương trình sử dụng các cái khái niệm như sau: Có 3 nhóm thi:
Cao đẳng; Trung cấp; nhóm thực hành, vấn đáp, thi máy; nhóm thi lại
- Các nhóm cùng Cao đẳng thì nối với nhau
- Các nhóm cùng Trung cấp thì nối với nhau
- Các nhóm thực hành, vấn đáp, thi máy dùng chung phòng thì nối với nhau
(số lượng phòng thực hành có hạn...)
Bước 1: Gom nhóm các môn thi theo nhóm sao cho các môn không được
thi trùng nhau thành một nhóm (các môn cao đẳng, các môn trung cấp, các
môn thực hành sử dụng chung phòng thực hành,….).
Bước 2: Xếp phòng thực hành đối với các môn thi thực hành.
Bước 3: Thiết lập đồ thị cho toàn bộ các môn thi: hai môn thi cùng nhóm
thì nối với nhau.
( Cài đặt 3 bước trên trong một hàm sau)
DanhSachMonThi DsMonThi()
{
DanhSachMonThi Dsmt = newDanhSachMonThi(newList());
foreach (DataGridViewRow r in grwDanhSach.Rows)
if (Convert.ToString(r.Cells["NHÓM"].Value) != "") //Duyệt qua tất cả
các môn thi mà đã được xét thuộc hệ nào (Cao đẳng, Trung cấp ..)
{
MonThi mt = newMonThi(Convert.ToString(r.Cells["MÃ
HP"].Value)); // Với mỗi môn, thì tạo 1 đối tượng môn học

47

string phong1 =Convert.ToString (((DataGridViewTextBoxCell)
r.Cells["PHÒNG"]).Value); // xem môn đó được xếp vào phòng
nào
string nhom1 = Convert.ToString(r.Cells["NHÓM"].Value); // vào
thuộc nhóm thi nào (cao đẳng hay trung cấp)
if (phong1 != "") // nếu không được sắp xếp phòng thì nó là phòng
thi máy
mt.DungPhongMay = true;
foreach (DataGridViewRow r2 in grwDanhSach.Rows) //Duyệt
qua danh sách môn học đó 1 lần nữa, tìm những môn học cùng
hệ với môn học đang xét và cho vào danh sách láng giềng
{
if (r2.Index != r.Index) //những môn học "khác" có nghĩa là
không xét nó
{
string nhom2 =
Convert.ToString(r2.Cells["NHÓM"].Value); // xem môn đó
thuộc nhóm nào
string phong2 =
Convert.ToString(((DataGridViewTextBoxCell)
r2.Cells["PHÒNG"]).Value); // thuộc phòng nào
if (DuLieu.KiemTraTrung(nhom1, nhom2) ||
DuLieu.KiemTraTrung(phong1, phong2)) // nếu nó cùng
chung 1 hệ , hoặc khác hệ mà cùng chung phòng, thì ta xét
cho nó là láng giềng
mt.ThemMonCungNhom(Convert.ToString(r2.Cells[1].Valu
e)); // xét cho môn r2 là láng giềng của môn r1
}
}
Dsmt.ds.Add(mt); // thêm 1 r1 vào danh sách các môn sẽ thi
}
return Dsmt; // duyệt qua tất cả các dòng ta trả về được danh sách các môn thi
với đầy đủ thông tin về các môn thi láng giềng
}
Bước 4: Áp dụng thuật toán tô màu đồ thị để gán các thời điểm thi cho các
môn thi:
Sau khi có được danh sách các môn thi rồi, ta tiến hành thực hiện xếp lịch.
Input cho sắp lịch thi là 1 list các môn cần sắp xếp và list các giờ thi có thể thi.
privatevoid btnXepLichThi_Click(object sender, EventArgs e)

48

{
LenLichThi llt = newLenLichThi(DsMonThi(), GioThi.GetAll);//Tạo
1 đối tượng xếp lịch thi với đầy đủ input
if (llt.ThucHien())// Sau đó thực hiện sếp lịch thi với thuật toán tô màu
XuLyDataGridView.ShowData(llt.DsMonThiDaXep, grwDanhSach,
"NGÀY", "GIỜ THI");
}
Hàm quan trọng nhất của thuật toán tô màu đó là phải tìm ra số lượng màu
tối thiểu để tô cho các đỉnh của đồ thị. Ở đây màu là số tiết và đỉnh là môn
cần sắp xếp. Số lượng màu tối thiểu bằng số bậc lớn nhất của đồ thị (bậc ở
đây là số lượng môn thi cùng 1 nhóm)
publicint SoLuongMau
{
get
{
int sl = 0;
foreach (MonThi mt in ds)
if (sl < mt.DSMonCungNhom.Count)
sl = mt.DSMonCungNhom.Count;
return sl;
}
}
// Sắp xếp danh sách giảm dần theo bậc
publicvoid SortGiam()
{
ds.Sort(delegate(MonThi mt1, MonThi mt2)
{
return -mt1.DSMonCungNhom.Count.CompareTo(mt2.DSMonCungNhom.Count);
}
}
publicbool ThucHien()
{
if (DsMonThi.SoLuongMau > DSGioThi.Count) //Nếu số lượng màu ít hơn
số lượng màu tối thiểu, thì báo lỗi

49

return BatLoi.ThongBao2("Số lượng giờ thi sử dụng không đủ để xếp lịch.
Vui lòng kiểm tra lại");
try
{
TienTrinh = newThread(ShowProcess);
TienTrinh.Start();
int TietXep = 0; // đánh dấu tiết đang xét
while (DsMonThi.Length > 0) //duyệt qua danh sách môn thi
{
DsMonThi.SortGiam(); // Bước 4.1 sắp xếp giảm dần theo bậc
if (DuocPhepTo(DsMonThi[0], TietXep)) // Với môn thi đầu tiên,
kiểm tra môn thi đó "có thể gán cho tiết i" hay không
{
DsMonThi.SetGio(DsMonThi[0], DSGioThi[TietXep]);
// Nếu được, là bước 4.2 Gán thời điểm thi thứ i cho môn đầu
tiên,
UpdateDs(DsMonThi[0]); // thực hiện việc cập nhật lại dánh
sách môn thi
}
for (int i = 0; i < DsMonThi.Length; i++) // Duyệt qua danh sách
các môn thi còn lại
{
MonThi mt2 = DsMonThi[i];
if (!GioDaDung(DsMonThi[i], TietXep) &&
DuocPhepTo(DsMonThi[i], TietXep)) //Kiểm tra xem tiết
đó có được tô hay không
{
DsMonThi.SetGio(mt2, DSGioThi[TietXep]); // Nếu
được phép thì gán tiết đó cho môn học này
UpdateDs(mt2); //Sau đó update lại danh sách môn thi
i- -;
}
}
TietXep++; // Với màu thứ nhất, không còn môn nào xếp được
cho màu này, thì ta chuyển qua màu tiếp theo
}//B4.4: Xóa khỏi danh sách các môn thi đã xếp lịch, lập lại danh
sách mới với các môn thi chưa được lên lịch với thứ tự bậc giảm dần, đặt
i=i+1; quay lại B4.2.
}
catch (Exception)

50

{
TienTrinh.Abort();
returnfalse;
}
TienTrinh.Abort();
returntrue;
}
}
void UpdateDs(MonThi mt)
{
DsMonThi.ThemTietDaTo(mt, DSGioThi.IndexOf(mt.Tiet)); // sử
dụng hàm bên dưới để đánh dấu màu cấm
DsMonThi.Remove(mt); //Xóa môn đó ra khỏi danh sách cần sắp xếp
vì đã sắp rồi
DsMonThiDaXep.Add(mt); // thêm nó vào danh sách các môn đã sắp
xếp
}
// Hàm này sử dụng để đánh dấu tiết đó không thể sử dụng để tô màu cho môn
học (nghĩa là cho vào danh sách cấm)
publicvoid ThemTietDaTo(MonThi mthi, int Tiet)
{
foreach (string mhp in mthi.DSMonCungNhom) //Duyệt qua danh
sách các môn chung nhóm với môn đó sau đó
try
{
this[mhp].ThemMauCam(Tiet); // thêm tiết i vào danh sách màu
cấm cho từng môn
}
catch (Exception)
{
}
}

51

Các chức năng chính của chương trình:
a) Chức năng quản lý bậc học

Hình 3.4. Mẫu quản lý bậc học
Chức năng này cho phép người sử dụng nhập tên bậc học vào textbox để
thêm vào danh sách, và các nút xóa sau tên mỗi bậc học trong danh sách cho
phép xóa đi những bậc học không còn quản lý nữa, để hoàn tất cài đặt Bậc
học, nhấn lưu để lưu lại những thay đổi, ngược lại nhấn thoát để thoát.
b) Chức năng quản lý phòng thực hành

Hình 3.5. Mẫu quản lý phòng thực hành
Tương tự như đối với chức năng quản lý bậc học, chức năng quản lý
phòng thực hành cho phép người dùng nhập tên phòng thực hành, sức chứa
của phòng, nút xóa để xóa các phòng không còn quản lý nữa, và nút lưu để
hoàn tất quá trình cài đặt, nút thoát để thoát khỏi cài đặt mà không lưu lại
những gì đã thay đổi.
c) Chức năng quản lý thời gian

Hình 3.6. Mẫu quản lý giờ thi

52

Chức năng quản lý thời gian thi cho phép người dùng chọn ngày bắt đầu
và ngày kết thúc của mùa thi, click vào lấy ngày chương trình tự động lấy ra
các giờ thi trong khoảng thời gian đó với quy tắc mỗi ngày sẽ có 4 ca thi(7h,
9h, 13h và 15h) để đưa vào danh sách, mỗi giờ thi trong danh sách đều có nút
xóa để xóa nếu nó thuộc giờ cấm.
d) Chức năng chọn nhóm

Hình 3.7. Mẫu chọn nhóm cho các môn thi
Chức năng chọn nhóm lấy ra danh sách môn thi ta đưa vào chương trình,
từ đó cho phép người dùng có thể chọn nhóm thủ công cho từng môn thi
bằng cách click chuột vào từng nút chọn của mỗi môn thi để thêm nhóm cho
môn thi đó, hoặc cũng có thể chọn tự động, để chương trình tự động xếp
nhóm cho các môn thi, chức năng tự động này chỉ mới phân nhóm được cho
2 nhóm trung cấp và trung cấp.

53

e) Chức năng chọn phòng

Hình 3.8. Mẫu chọn phòng thực hành
Chức năng này tự động lọc các môn thi có hình thức thi là thực hành lên
form CHỌN PHÒNG THI để thực hiện gán phòng thi cho các môn thi, nút
chấp nhận để lưu lại những thay đổi của người dùng và hủy để thoát khỏi cài
đặt mà không lưu lại những thay đổi.
f) Chức năng xếp lịch

Hình 3.9. Mẫu xếp lịch thi
Sau khi đã chọn nhóm và phòng thực hành cho các môn thi, người dùng có
thể nhấp nút Xếp Lịch để chương trình tự động gắn thời gian thi cho các môn
thi.

54

Các chức năng phụ của chương trình:
a) Chức năng tạo tài khoản, đăng nhập

Hình 3.10. Mẫu đăng kí tài khoản

Hình 3.11. Mẫu đăng nhập hệ thống
Nếu chương trình chạy lần đầu tiên, chưa có thông tin người sử dụng
chương trình sẽ có phép người dùng tạo tài khoản trên hệ thống, và những
lần sử dụng sau bắt buộc phải đăng nhập để có thể sử dụng được chương
trình.
b) Chức năng đổi mật khẩu

Hình 3.12. Mẫu đổi mật khẩu
Chức năng này cho phép người dùng thay đổi mật khẩu trong quá trình sử
dụng để bảo đảm an toàn thông tin.