Ứng dụng các giải thuật trong điều độ time tabling để xây dựng lịch biểu giảng dạy, áp dụng cho trường FPT Polytechnic Tp. HCM

98 7 0
Ứng dụng các giải thuật trong điều độ time tabling để xây dựng lịch biểu giảng dạy, áp dụng cho trường FPT Polytechnic Tp. HCM

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC BÁCH KHOA LÊ PHẠM TUẤN KIỆT ỨNG DỤNG CÁC GIẢI THUẬT TRONG ĐIỀU ĐỘ TIME TABLING ĐỂ XÂY DỰNG LỊCH BIỂU GIẢNG DẠY, ÁP DỤNG CHO TRƯỜNG FPT POLYTECHNIC TP.HCM Chuyên ngành: KỸ THUẬT CÔNG NGHIỆP Mã số: 60520117 LUẬN VĂN THẠC SĨ THÀNH PHỐ HỒ CHÍ MINH, THÁNG 06 NĂM 2014 ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC BÁCH KHOA LÊ PHẠM TUẤN KIỆT ỨNG DỤNG CÁC GIẢI THUẬT TRONG ĐIỀU ĐỘ TIME TABLING ĐỂ XÂY DỰNG LỊCH BIỂU GIẢNG DẠY, ÁP DỤNG CHO TRƯỜNG FPT POLYTECHNIC TP.HCM Chuyên ngành: KỸ THUẬT CÔNG NGHIỆP Mã số: 60520117 LUẬN VĂN THẠC SĨ THÀNH PHỐ HỒ CHÍ MINH, THÁNG 06 NĂM 2014 -i- CƠNG TRÌNH ĐƯỢC HỒN THÀNH TẠI TRƯỜNG ĐẠI HỌC BÁCH KHOA – ĐHQG - HCM Cán hướng dẫn khoa học : (Ghi rõ họ, tên, học hàm, học vị chữ ký) Cán chấm nhận xét : (Ghi rõ họ, tên, học hàm, học vị chữ ký) Cán chấm nhận xét : (Ghi rõ họ, tên, học hàm, học vị chữ ký) Luận văn thạc sĩ bảo vệ Trường Đại học Bách Khoa - ĐHQG - HCM ngày tháng năm Thành phần Hội đồng đánh giá luận văn thạc sĩ gồm: (Ghi rõ họ, tên, học hàm, học vị Hội đồng chấm bảo vệ luận văn thạc sĩ) Xác nhận Chủ tịch Hội đồng đánh giá LV Trưởng Khoa quản lý chuyên ngành sau luận văn sửa chữa (nếu có) CHỦ TỊCH HỘI ĐỒNG TRƯỞNG KHOA…………… -ii- ĐẠI HỌC QUỐC GIA TP.HCM CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM TRƯỜNG ĐẠI HỌC BÁCH KHOA Độc lập - Tự - Hạnh phúc NHIỆM VỤ LUẬN VĂN THẠC SĨ Họ tên học viên: LÊ PHẠM TUẤN KIỆT MSHV: 12270707 Ngày, tháng, năm sinh: 17/09/1975 Nơi sinh: Đà Nẵng Chuyên ngành: KỸ THUẬT CÔNG NGHIỆP Mã số: 60520117 I TÊN ĐỀ TÀI : ỨNG DỤNG CÁC GIẢI THUẬT TRONG ĐIỀU ĐỘ TIME TABLING ĐỂ XÂY DỰNG LỊCH BIỂU GIẢNG DẠY, ÁP DỤNG CHO TRƯỜNG FPT POLYTECHNIC TP.HCM II NHIỆM VỤ VÀ NỘI DUNG: Nhiệm vụ: Xây dựng lịch biểu giảng dạy dùng giải thuật Local Tabu search ứng dụng cho trường FPT Polytechic Tp.HCM Nội dung: Tìm hiểu giải thuật Local Tabu search Tìm hiểu trường, phịng đào tạo Xây dựng tốn lịch biểu cho trường dùng giải thuật trên, phân tích kết quả, kết luận III NGÀY GIAO NHIỆM VỤ : 10 – 02 – 2014 IV NGÀY HOÀN THÀNH NHIỆM VỤ: 20 – 06 – 2014 IV CÁN BỘ HƯỚNG DẪN: PGS.TS HỒ THANH PHONG Tp HCM, ngày tháng năm 2014 CÁN BỘ HƯỚNG DẪN CHỦ NHIỆM BỘ MÔN ĐÀO TẠO (Họ tên chữ ký) (Họ tên chữ ký) TRƯỞNG KHOA….………… (Họ tên chữ ký) -iii- PHẦN LÝ LỊCH TRÍCH NGANG Họ tên: Lê Phạm Tuấn Kiệt Ngày, tháng, năm sinh: Giới tính: Nam Nơi sinh: Đà Nẵng 17/09/1975 Địa liên lạc : 68/119 Trần Quang Khải, P.Tân Định, Q.1, Tp.HCM QUÁ TRÌNH ĐÀO TẠO - Từ năm 1993 đến 1997 : Học Đại Học Ngành Công Nghệ Thông Tin Trường Đại Học Mở Bán Công TP.HCM - Từ năm 2012 đến 2013 : Học Cao Học Ngành Kỹ Thuật Hệ Thống Cơng Nghiệp thuộc Khoa Cơ Khí – Trường Đại Học Bách Khoa TP.HCM Q TRÌNH CƠNG TÁC Thời gian Nơi công tác Công việc đảm nhiệm 05/1997 – 01/2001 Trường Tin Học Tri Thức Giảng viên CNTT 11/1999 – 10/2001 Xí nghiệp Điện Cao Thế - Công ty Điện lực TP.HCM Cán Kỹ thuật quản lý Công Nghệ Thông Tin 10/2001 – 10/2009 Công Ty Chấn Nguyên, Công Ty TNHH Tin Học Tân Thiên Vũ, Công Ty TNHH Tin Học Nguyễn Sương IT Manager 11/2009 đến 07/2011 Cơng Ty cổ phần chứng khốn Thăng Long (TLS) Chuyên viên IT 08/2011 đến 11/2011 Công ty cổ phần hệ thống GEN Trưởng nhóm kinh doanh dự án CNTT 12/2011 đến 05/2012 Công ty cổ phần Tin Học Sáng Tạo Trưởng phòng kỹ thuật 08/2012 đến Trường Đại học FPT Giảng viên CNTT -iv- LỜI CẢM ƠN Lời đầu tiên, xin chân thành cám ơn Thầy Hồ Thanh Phong tận tình hướng dẫn tơi thực hồn thành luận văn Tơi xin cám ơn thầy Đỗ Ngọc Hiền, thầy Nguyễn Tuấn Anh, cô Lê Ngọc Quỳnh Lam thầy cô Bộ môn Kỹ Thuật Hệ Thống Công Nghiệp tận tâm truyền đạt kiến thức, kinh nghiệm suốt quãng thời gian học cao học Xin chân thành cám ơn bạn bè, đồng nghiệp phòng Đào Tạo trường FPT Polytechnic tạo điều kiện thuận lợi cho trình thực đề tài Và cuối tơi xin chân thành cám ơn Ba Mẹ, gia đình người thân động viên khuyến khích nguồn động lực vững cho vượt qua khó khăn suốt q trình học để cuối hoàn thành luận văn Dù cố gắng để hồn thành đề tài cịn nhiều thiếu sót khơng thể tránh khỏi, tơi mong nhận đóng góp ý kiến từ q thầy, cơ, bạn bè đồng nghiệp để phát triển đề tài ngày tốt Trân trọng Tp.HCM, Ngày 20 tháng 06 năm 2014 Lê Phạm Tuấn Kiệt -v- TÓM TẮT LUẬN VĂN Ngày nay, điều độ hoạt động thiếu lĩnh vực sản xuất, kinh doanh, dịch vụ doanh nghiệp Trong đó, ngành giáo dục khơng ngoại lệ, việc xếp thời khố biểu giảng dạy thật vấn đề khó khăn cán cơng nhân viên phịng đào tạo trường đại học, cao đẳng bậc phổ thơng Nhiều thập niên gần có nhiều tài liệu nghiên cứu giải thuật điều độ lịch biểu (Time Tabling) giúp cho việc xếp thời khoá biểu giảng dạy tự động hoá, nhanh chóng hiệu cao Trong luận văn ta nghiên cứu giải toán điều độ lịch biểu giảng dạy dùng giải thuật Local Search Tabu Search áp dụng cho trường cao đẳng FPT Polytechnic Thành Phố Hồ Chí Minh -vi- MỤC LỤC Chương I: GIỚI THIỆU ĐỀ TÀI 1.1 ĐẶT VẤN ĐỀ 1.2 NỘI DUNG .3 1.3 MỤC TIÊU .4 1.4 GIỚI HẠN VÀ PHẠM VI ĐỀ TÀI Chương II: CƠ SỞ LÝ THUYẾT VÀ CÁC NGHIÊN CỨU LIÊN QUAN 2.1 ĐIỀU ĐỘ TIME TABLING .5 2.1.1 Giới thiệu kỹ thuật điều độ 2.1.2 Mơ hình tổng quát toán Time Tabling 2.1.3 Các giải thuật lập lịch biểu (Time tabling) 2.2 PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG THƠNG TIN .15 2.3 NGƠN NGỮ LẬP TRÌNH C# VÀ SQL SERVER 17 2.4 CÁC NGHIÊN CỨU LIÊN QUAN .19 Chương III: PHƯƠNG PHÁP LUẬN 21 3.1 PHƯƠNG PHÁP NGHIÊN CỨU 21 3.2 PHƯƠNG PHÁP LUẬN 22 3.2.1 Nghiên cứu Time Tabling 23 3.2.2 Thu thập số liệu & phân tích tình trạng lịch biểu giảng dạy 23 3.2.3 Phân tích thiết kế hệ thống 23 3.2.4 Lựa chọn thuật giải điều độ viết code cho ứng dụng 23 3.2.5 Triển khai ứng dụng kiểm thử .24 3.2.6 Kết luận 24 Chương IV: XÂY DỰNG LỊCH BIỂU GIẢNG DẠY, ÁP DỤNG CHO TRƯỜNG FPT POLYTECHNIC TP.HCM .25 4.1 GIỚI THIỆU TRƯỜNG FPT POLYTECHNIC 25 4.2 THỰC TRẠNG SẮP XẾP LỊCH BIỂU TẠI TRƯỜNG FPT POLYTECHNIC TP.HCM 26 4.2.1 Phòng học 27 -vii- 4.2.2 Ca học .28 4.2.3 Lớp học .28 4.2.4 Điều kiện quy trình thực xếp lịch biểu 29 4.2.5 Số lượng giảng viên: 29 4.2.6 Thời gian thực xếp lịch biểu tại: 29 4.3 PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG XÂY DỰNG LỊCH BIỂU GIẢNG DẠY 30 4.3.1 Yêu cầu toán 30 4.3.2 Quy trình xếp lịch biểu .30 4.3.3 Thiết kế sở liệu triển khai cao sở liệu SQL Server .31 4.4 GIẢI QUYẾT BÀI TOÁN BẰNG KỸ THUẬT ĐIỀU ĐỘ 32 4.4.1 Định nghĩa toán: 33 4.4.2 Định nghĩa ràng buộc 35 4.4.3 Giải toán với ràng buộc cứng .36 4.4.4 Giải toán với ràng buộc mềm .45 4.5 SỬ DỤNG NGÔN NGỮ C# XÂY DỰNG ỨNG DỤNG LỊCH BIỂU GIẢNG DẠY 50 4.6 KẾT QUẢ THỰC NGHIỆM 52 Chương V: KẾT LUẬN VÀ KIẾN NGHỊ .54 5.1 KẾT LUẬN 54 5.1.1 Kết đạt 54 5.1.2 Hạn chế .54 5.2 KIẾN NGHỊ 55 TÀI LIỆU THAM KHẢO PHỤ LỤC A - SỐ LIỆU THỰC TẾ TẠI FPOLY PHỤ LỤC B - CODE C# CỦA LỚP TIMETABLING -viii- DANH MỤC HÌNH Hình 2.1: Giải thuật Hill-Climbing Hình 2.2: Giải thuật Min-Conflict Random Walk .9 Hình 2.3: Giải thuật SimulatedAnnealing .10 Hình 2.4: Giải thuật di truyền (Genetic Algorithm) 11 Hình 2.5: Giải thuật Tabu Search .13 Hình 2.6: Pseudo-code Tabu Search 14 Hình 3.1: Quy trình nghiên cứu 22 Hình 4.1: Sơ đồ tổng thể giải tốn TimeTabling cho FPOLY 32 Hình 4.2: Cluster đụng độ 34 Hình 4.3: Giải thuật Backtracking-free kết hợp Local Search Look-Ahead 37 Hình 4: Giải thuật xếp thứ tự meeting 40 Hình 5: Giải thuật xếp thứ tự giảng viên 40 Hình 4.6: Giải thuật chọn biến 41 Hình 4.7: Giải thuật chọn trị phịng 42 Hình 4.8: Giải thuật chọn trị giảng viên 43 Hình 4.9: Giải thuật SolveConflict dùng IterativeSearch 44 Hình 4.10: Hàm đánh giá vi phạm ràng buộc mềm 46 Hình 4.11: Mơ tả giải thuật Local Repair – Tabu Mechanism 47 Hình 4.12: Giải thuật repair_constraint 49 Hình 4.13: Giao diện đăng nhập ứng dụng 50 Hình 4.14: Giao diện hình làm việc 51 Hình 4.15: Giao diện hiển thị thời khóa biểu 51 Hình 4.16: Kết xếp học kỳ Spring 2014 .52 Hình 4.17: Kết xếp học kỳ Summer 2014 53 -ix- else this.cbgds[inCountCBGD].SoTietToiDaNgay = Convert.ToInt16(rdsCBGD[i].MaxTietNgay); } else { this.cbgds[inCountCBGD].MonHoc_ID.Add(rdsCBGD[i].MonHoc_ID); } } createMatrixCBGD(); } /* * Tao ma tran giang vien * + neu i , j cung giang vien thi matrix[i][j] =1 * + neu nhom i co k tiet hoc lien tiep va nhom j cung co gio hoc * nhung tiet cua i thi matrix[i][j] = */ public void createMatrixCBGD() { this.matrixForCbgd = new int[this.NUM_OF_MEETINGS][]; for (int i = 0; i < this.NUM_OF_MEETINGS; i++) { this.matrixForCbgd[i] = new int[this.NUM_OF_MEETINGS]; for (int j = 0; j < this.NUM_OF_MEETINGS; j++) { if (i == j) matrixForCbgd[i][j] = 1; else if ((this.meetings[j].Ngay_ID == this.meetings[i].Ngay_ID) && (((meetings[j].TietBatDau < (meetings[i].TietBatDau + meetings[i].SoTiet)) && (meetings[j].TietBatDau >= meetings[i].TietBatDau)) || ((meetings[i].TietBatDau < (meetings[j].TietBatDau + meetings[j].SoTiet)) && (meetings[i].TietBatDau >= meetings[j].TietBatDau)))) { matrixForCbgd[i][j] = 1; } else if ((this.meetings[i].MonHoc_ID == this.meetings[j].MonHoc_ID) && (this.meetings[i].NhomLop_ID == this.meetings[j].NhomLop_ID) && (this.meetings[i].Cum != this.meetings[j].Cum)) { matrixForCbgd[i][j] = 2; // chung cbgd } else matrixForCbgd[i][j] = 0; } } this.thongTinBanGioCBGD(); countAndArrangeGradeForCBGD(); xepCBGD(); } /* * Điền thông tin bận lên cbgdAndSlotTime */ private void thongTinBanGioCBGD() { try { int[] temp = new int[NUM_OF_CBGDS]; this.cbgdAndTimeSlot = new int[this.NUM_OF_CBGDS][]; this.indexOfCBGD = new int[this.NUM_OF_CBGDS]; for (int i = 0; i < this.NUM_OF_CBGDS; i++) { //temp[i] = -1; this.cbgdAndTimeSlot[i] = new int[this.inSoNgayTrongTuan * this.inSoTietTrongNgay]; for (int m = 0; m < this.inSoNgayTrongTuan * this.inSoTietTrongNgay; m++) { this.cbgdAndTimeSlot[i][m] = -1; } var bangio = (from c in ctx.CBGD_BanGios where c.CBGD_ID == this.cbgds[i].CBGD_ID orderby c.NgayHoc_ID, c.TietHoc_ID select new { c.NgayHoc_ID, c.TietHoc_ID }).Distinct().ToArray(); temp[i] = bangio.Count(); for (int j = 0; j < bangio.Count(); j++) { this.cbgdAndTimeSlot[i][(bangio[j].NgayHoc_ID - 1) * this.inSoTietTrongNgay + bangio[j].TietHoc_ID - 1] = -2; } for (int k = 0; k < this.NUM_OF_MEETINGS; k++) { if ((this.cbgds[i].CBGD_ID.Equals(this.meetings[k].CBGD_ID)) && (this.meetings[k].TietBatDau > 0) && (this.meetings[k].Ngay_ID > 0) ) { if ((this.cbgdAndTimeSlot[i][this.inSoTietTrongNgay * (this.meetings[k].Ngay_ID - 1) + this.meetings[k].TietBatDau - 1] >= 0) || (this.cbgdAndTimeSlot[i][this.inSoTietTrongNgay * (this.meetings[k].Ngay_ID - 1) + this.meetings[k].TietBatDau + this.meetings[k].SoTiet - 2] >= 0) ) this.meetings[k].CBGD_ID = "-1"; else { if (!this.cbgds[i].lstNgay.Contains(this.meetings[k].Ngay_ID)) this.cbgds[i].lstNgay.Add(this.meetings[k].Ngay_ID); this.cbgds[i].tiethocNgay[this.meetings[k].Ngay_ID - 1] += this.meetings[k].SoTiet; for (int m = this.meetings[k].TietBatDau; m < this.meetings[k].SoTiet + this.meetings[k].TietBatDau; m++) { this.cbgdAndTimeSlot[i][this.inSoTietTrongNgay * (this.meetings[k].Ngay_ID - 1) + m - 1] = k; temp[i] += 1; } } } } } int = this.inSoTietTrongNgay * this.inSoNgayTrongTuan + 1; int indexMin = 0; for (int i = 0; i < this.NUM_OF_CBGDS; i++) { for (int j = 0; j < this.NUM_OF_CBGDS; j++) { if (min > temp[j]) { = temp[j]; indexMin = j; } } this.indexOfCBGD[i] = indexMin; temp[indexMin] = this.inSoTietTrongNgay * this.inSoNgayTrongTuan + 1; = this.inSoTietTrongNgay * this.inSoNgayTrongTuan + 1; } } catch (Exception ex) { } } /* * xep CBGD vào meeting */ private void xepCBGD() { for (int i = 0; i < this.NUM_OF_MEETINGS; i++) { if (this.meetings[this.indexGrade[i]].CBGD_ID.Equals("-1") && (this.meetings[this.indexGrade[i]].TietBatDau > 0) && (this.meetings[this.indexGrade[i]].Ngay_ID > 0)) { checkMeetingForCBGD(this.indexGrade[i]); } } } private void checkMeetingForCBGD(int MEETING_ID) { int slotNgay = this.inSoTietTrongNgay * (this.meetings[MEETING_ID].Ngay_ID - 1) - 1; bool flag = false; bool koCoCBGD = true; List listCum = new List(); foreach (int itemCBGD in this.indexOfCBGD) { if (this.cbgds[itemCBGD].MonHoc_ID.Contains(this.meetings[MEETING_ID] MonHoc_ID)) { flag = true; koCoCBGD = false; for (int m = this.meetings[MEETING_ID].TietBatDau; m < this.meetings[MEETING_ID].TietBatDau + this.meetings[MEETING_ID].SoTiet; m++) { if (this.cbgdAndTimeSlot[itemCBGD][slotNgay + m] != -1) { flag = false; break; } } if (flag && checkKhoiLuongDay(MEETING_ID, itemCBGD) && checkCum(MEETING_ID, itemCBGD, listCum)) { foreach (int cumMeeting in listCum) { this.meetings[cumMeeting].CBGD_ID = this.cbgds[itemCBGD].CBGD_ID; if (!this.cbgds[itemCBGD].lstNgay.Contains(this.meetings[cumMeeting] Ngay_ID)) this.cbgds[itemCBGD].lstNgay.Add(this.meetings[cumMeeting].Ngay_ID ); this.cbgds[itemCBGD].tiethocNgay[this.meetings[cumMeeting].Ngay_ID - 1] += this.meetings[cumMeeting].SoTiet; for (int m = this.meetings[cumMeeting].TietBatDau; m < this.meetings[cumMeeting].SoTiet + this.meetings[cumMeeting].TietBatDau; m++) { this.cbgdAndTimeSlot[itemCBGD][(this.meetings[cumMeeting].Ngay_ID - 1) * this.inSoTietTrongNgay + this.meetings[cumMeeting].TietBatDau - 1] = cumMeeting; } } break; } } else { koCoCBGD = true; //continue; } } if (koCoCBGD) this.CONSTR_MATRIX[this.HARD_C7][MEETING_ID] = 1; } private bool checkKhoiLuongDay(int MEETING_ID, int CBGD_ID) { if ((this.cbgds[CBGD_ID].tiethocNgay[this.meetings[MEETING_ID].Ngay_I D - 1] + this.meetings[MEETING_ID].SoTiet > this.cbgds[CBGD_ID].SoTietToiDaNgay) || ((!this.cbgds[CBGD_ID].lstNgay.Contains(this.meetings[MEETING_ID] Ngay_ID)) && (this.cbgds[CBGD_ID].lstNgay.Count() + > this.cbgds[CBGD_ID].SoNgayToiDaTuan))) { return false; } else { return true; } } private bool checkCum(int MEETING_ID, int CBGD_ID, List listCum) { bool flag = true; listCum.Clear(); listCum.Add(MEETING_ID); for (int i = 0; i < this.NUM_OF_MEETINGS; i++) { if ((i != MEETING_ID) && (this.matrixForCbgd[MEETING_ID][i] == 2) && (this.meetings[i].TietBatDau > 0)) { flag = true; for (int m = this.meetings[i].TietBatDau; m < this.meetings[i].TietBatDau + this.meetings[i].SoTiet; m++) { if (this.cbgdAndTimeSlot[CBGD_ID][(this.meetings[i].Ngay_ID - 1) * this.inSoTietTrongNgay + this.meetings[i].TietBatDau - 1] != -1) { // vi phạm ràng buộc không gán cụm khác Lop-Mon với giảng viên return false; } } listCum.Add(i); } } int[] tiethocNgay = new int[this.inSoNgayTrongTuan]; List soNgay = new List(); soNgay.Clear(); foreach (int item in listCum) { if ((!this.cbgds[CBGD_ID].lstNgay.Contains(this.meetings[item].Ngay_I D)) && (!soNgay.Contains(this.meetings[item].Ngay_ID))) { soNgay.Add(this.meetings[item].Ngay_ID); } tiethocNgay[this.meetings[item].Ngay_ID - 1] += this.meetings[item].SoTiet; if ((tiethocNgay[this.meetings[item].Ngay_ID - 1] + this.cbgds[CBGD_ID].tiethocNgay[this.meetings[item].Ngay_ID - 1] > this.cbgds[CBGD_ID].SoTietToiDaNgay) || (soNgay.Count() + this.cbgds[CBGD_ID].lstNgay.Count() > this.cbgds[CBGD_ID].SoNgayToiDaTuan)) { // vi phạm ràng buộc giới hạn ngày tiết dạy giảng viên return false; } } return true; } // Thủ tục tối ưu hóa ràng buộc mềm public void SoftContraint() { this.queryMonHocCa(); List tabuList = new List(); tabuList.Clear(); Activity[] tempMeeting = new Activity[this.NUM_OF_MEETINGS]; int tabuLength=this.lstLopForSoftContraint.Count()*2/3; int index = -1; bool flag = false; double F1 = 0, F2 = 0; { F1 = 0; F2 = 0; checkSoftContrainstForLop(this.meetings); this.lstLopForSoftContraint.Sort(new SoftContraintComparer(SortDirection.Desc)); for (int i = 0; i < this.lstLopForSoftContraint.Count(); i++) { if (tabuList.Contains(this.lstLopForSoftContraint[i].Lop_ID)) { flag = false; continue; } else { index = i; flag = true; break; } } if (flag) { tempMeeting = this.meetings; for (int i = 0; i < this.lstLopForSoftContraint.Count(); i++) { F1 += this.lstLopForSoftContraint[i].conflictRate; } F1 += checkTietSangChieu(this.meetings); repairSoftContraint(tempMeeting, index); // repair // tabuList.Add(this.lstLopForSoftContraint[index].Lop_ID); checkSoftContrainstForLop(tempMeeting); for (int i = 0; i < this.lstLopForSoftContraint.Count(); i++) { F2 += this.lstLopForSoftContraint[i].conflictRate; } F2 += checkTietSangChieu(tempMeeting); if (F1 > F2) this.meetings = tempMeeting; } } while (tabuList.Count < tabuLength); } private void queryMonHocCa() { try { var rdsMonHocCa = (from c in ctx.MonHoc_Cathichhops orderby c.MonHoc_ID, c.CaHoc_ID select c).Distinct().ToArray(); string monhocID = ""; int index = -1; for (int i = 0; i < rdsMonHocCa.Count(); i++) { if (!monhocID.Equals(rdsMonHocCa[i].MonHoc_ID)) { monhocID = rdsMonHocCa[i].MonHoc_ID; index++; List sublst = new List(); sublst.Clear(); sublst.Add(rdsMonHocCa[i].CaHoc_ID); this.monHocCa.lstMonHoc_ID.Add(rdsMonHocCa[i].MonHoc_ID); this.monHocCa.lstTietHocThichHop.Add(sublst); } else { this.monHocCa.lstCaHocThichHop.ElementAt(index).Add(rdsMonHocTiet[ i].TietHoc_ID); } } } catch (Exception ex) { } } private void checkSoftContrainstForLop(Activity[] tempMeetings) { fillMatrixOfTimeForLopInSoftContrainst(tempMeetings); for (int i = 0; i < this.lstLopForSoftContraint.Count(); i++) { this.lstLopForSoftContraint[i].conflictRate = checkRoomforMeetingAtTheSameSession(i, tempMeetings) + checkMonHocCaThichHop(i, tempMeetings) // + another softcontraint + checkCaTrongForLop(i, tempMeetings); } } private int checkCaTrongForLop(int indexLop, Activity[] tempMeetings) { int inCount = 0; bool flag = false; int index = -1; for (int i = 1; i < this.inTongSoCaTrongTuan; i++) { if (timeslot[i].BuoiHoc_ID != timeslot[i 1].BuoiHoc_ID) { index = -1; flag = false; } if (this.lstLopForSoftContraint[indexLop].matrix[i] >= 0) { //if(!flag) flag = true; if (index == -1) index = i; else if (this.lstLopForSoftContraint[indexLop].matrix[i] == this.lstLopForSoftContraint[indexLop].matrix[index]) continue; else if ((index != -1) && (this.lstLopForSoftContraint[indexLop].matrix[i] < 0) && (timeslot[index].BuoiHoc_ID == timeslot[i].BuoiHoc_ID)) flag = true; else if ((index != -1) && (flag) && (this.lstLopForSoftContraint[indexLop].matrix[i] >= 0) && (timeslot[index].BuoiHoc_ID == timeslot[i].BuoiHoc_ID)) { inCount++; index = i; flag = false; } } } return inCount * 80; } private double checkCaSangChieu(Activity[] tempMeetings) { int n = 0, p = 0; try { for (int i = 0; i < this.NUM_OF_MEETINGS; i++) { if (tempMeetings[i].CaBatDau >= 0) { if (this.timeslot[tempMeetings[i].CaBatDau - 1].BuoiHoc_ID != this.timeslot[tempMeetings[i].CaBatDau + tempMeetings[i].SoCa - 2].BuoiHoc_ID) { n++; p += tempMeetings[i].SoCa; } } } } catch (Exception ex) { } return Math.Pow(4, n) + Math.Pow(2, Math.Abs(p - 6)); } private int checkRoomforMeetingAtTheSameSession(int indexLop, Activity[] tempMeetings) { //try { this.lstLopForSoftContraint[indexLop].M4.Clear(); for (int i = 1; i < this.inTongSoTietTrongTuan; i++) { if ((this.lstLopForSoftContraint[indexLop].matrix[i] >= 0) && (this.lstLopForSoftContraint[indexLop].matrix[i - 1] >= 0) && (this.timeslot[i].BuoiHoc_ID == timeslot[i - 1].BuoiHoc_ID) && (this.lstLopForSoftContraint[indexLop].matrix[i] != this.lstLopForSoftContraint[indexLop].matrix[i - 1]) && (tempMeetings[this.lstLopForSoftContraint[indexLop].matrix[i]].Pho ng_ID != tempMeetings[this.lstLopForSoftContraint[indexLop].matrix[i 1]].Phong_ID) ) { this.lstLopForSoftContraint[indexLop].M4.Add(new List { this.lstLopForSoftContraint[indexLop].matrix[i], this.lstLopForSoftContraint[indexLop].matrix[i - 1] }); if (!this.lstLopForSoftContraint[indexLop].lstSoftContraint.Contains( 6)) this.lstLopForSoftContraint[indexLop].lstSoftContraint.Add(6); } } } //catch (Exception ex) { } // cho số khác phòng cao = 90 return this.lstLopForSoftContraint[indexLop].M6.Count() * 90; } private int checkMonHocTietThichHop(int indexLop, Activity[] tempMeetings) { this.lstLopForSoftContraint[indexLop].M4.Clear(); for (int i = 0; i < this.NUM_OF_MEETINGS; i++) { if ((this.monHocTiet.lstMonHoc_ID.Contains(tempMeetings[i].MonHoc_ID) ) && tempMeetings[i].Lop_ID.Contains(this.lstLopForSoftContraint[indexL op].Lop_ID) ) { if (!this.monHocTiet.lstTietHocThichHop.ElementAt(this.monHocTiet.lst MonHoc_ID.IndexOf(tempMeetings[i].MonHoc_ID)).Contains(tempMeeting s[i].TietBatDau)) { this.lstLopForSoftContraint[indexLop].M4.Add(i); this.lstLopForSoftContraint[indexLop].lstSoftContraint.Add(4); } } } return this.lstLopForSoftContraint[indexLop].M4.Count() * 99; } private void fillMatrixOfTimeForLopInSoftContrainst(Activity[] tempMeeting) { for (int i = 0; i < this.lstLopForSoftContraint.Count(); i++) { for (int j = 0; j < this.NUM_OF_MEETINGS; j++) { if ((tempMeeting[j].Lop_ID.Count() == 1) && tempMeeting[j].Lop_ID.Contains(this.lstLopForSoftContraint[i].Lop_ ID)) { this.lstLopForSoftContraint[i].matrix = tempMeeting[j].indexSlotTime; break; } } } } private void repairSoftContraint(Activity[] tempMeeting, int indexlop) { foreach (int item in this.lstLopForSoftContraint[indexlop].lstSoftContraint) { repair_M4(tempMeeting, indexlop); break; } } private void repair_M4(Activity[] tempMeeting, int indexLop) { foreach (int item in this.lstLopForSoftContraint[indexLop].M4) { // tìm thời gian học thích hợp cho mơn học để swap // tìm thời gian thích hợp phịng học gán timTietHocChoMonHoc(tempMeeting, indexLop, item); } } private bool timTietHocChoMonHoc(Activity[] tempMeeting, int indexLop, int MEETING_ID) { //int index = -1; bool subflag = false; //bool flag = true; for (int i = 0; i < this.rooms.Count(); i++) { //xét phòng if (tempMeeting[MEETING_ID].Phong_ID == this.rooms[i].Phong_ID) { foreach (int tiet in this.monHocTiet.lstTietHocThichHop.ElementAt(this.monHocTiet.lstMo nHoc_ID.IndexOf(tempMeeting[MEETING_ID].MonHoc_ID))) { for (int = 0; < this.inSoNgayTrongTuan; ngay++) { // trống if (this.roomAndTimeSlot[i][this.inSoTietTrongNgay * + tiet - 1] == -1) { subflag = true; for (int m = tiet; m < tempMeeting[MEETING_ID].SoTiet + tiet; m++) { if (this.roomAndTimeSlot[i][this.inSoTietTrongNgay * + m - 1] != -1) { subflag = false; break; } } if (subflag) { for (int m = tempMeeting[MEETING_ID].TietBatDau; m < tempMeeting[MEETING_ID].TietBatDau + tempMeeting[MEETING_ID].SoTiet; m++) { this.roomAndTimeSlot[i][this.inSoTietTrongNgay * (tempMeeting[MEETING_ID].Ngay_ID - 1) + m - 1] = -1; } tempMeeting[MEETING_ID].TietBatDau = tiet; tempMeeting[MEETING_ID].Ngay_ID = + 1; tempMeeting[MEETING_ID].Buoi = timeslot[this.inSoTietTrongNgay * + tiet - 1].BuoiHoc_ID; for (int m = tiet; m < tempMeeting[MEETING_ID].SoTiet + tiet; m++) { this.roomAndTimeSlot[i][this.inSoTietTrongNgay * + m - 1] = MEETING_ID; } return true; } } // không trống -> swap } if (subflag) break; } } } return false; } } } //End TimeTabling } ... MINH TRƯỜNG ĐẠI HỌC BÁCH KHOA LÊ PHẠM TUẤN KIỆT ỨNG DỤNG CÁC GIẢI THUẬT TRONG ĐIỀU ĐỘ TIME TABLING ĐỂ XÂY DỰNG LỊCH BIỂU GIẢNG DẠY, ÁP DỤNG CHO TRƯỜNG FPT POLYTECHNIC TP .HCM Chuyên ngành: KỸ THUẬT... ngành: KỸ THUẬT CÔNG NGHIỆP Mã số: 60520117 I TÊN ĐỀ TÀI : ỨNG DỤNG CÁC GIẢI THUẬT TRONG ĐIỀU ĐỘ TIME TABLING ĐỂ XÂY DỰNG LỊCH BIỂU GIẢNG DẠY, ÁP DỤNG CHO TRƯỜNG FPT POLYTECHNIC TP .HCM II NHIỆM... thiết cho trường Với kinh nghiệm lập trình kỹ thuật điều độ học lớp cao học ISE – 2012, chọn đề tài: ? ?ỨNG DỤNG CÁC GIẢI THUẬT TRONG ĐIỀU ĐỘ TIME TABLING ĐỂ XÂY DỰNG LỊCH BIỂU GIẢNG DẠY, ÁP DỤNG CHO

Ngày đăng: 10/03/2021, 20:39

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan