BÀI TOÁN XẾP LỚP HỌC THEO TÍN CHỈ

Một phần của tài liệu (LUẬN văn THẠC sĩ) bài toán tìm bộ ghép cực đại trên đồ thị, ứng dụng giải một số bài toán trong thực tế (Trang 67)

3.2.1 Mô hình đào tạo theo học chế tín chỉ

Khác với mô hình đào tạo theo niên chế, đào tạo theo học chế tín chỉ là một mô hình đào tạo rất mềm dẻo, tăng cường tính chủ động, tự học, tự nghiên cứu của sinh viên; nhà trường, giảng viên tạo điều kiện thuận lợi tối đa cho sinh viên tích luỹ kiến thức, kỹ năng; đồng thời học chế tín chỉ cũng quản lý chặt chẽ quá trình học tập của từng sinh viên để đảm bảo chất lượng đào tạo.

Đầu mỗi khoá học, nhà trường thông báo cho sinh viên về: Chương trình đào tạo toàn khoá cho từng ngành học. Quy chế học tập và các quy định của trường.

Quyền lợi và nghĩa vụ của sinh viên.

Đầu mỗi học kỳ, nhà trường có trách nhiệm thông báo cho sinh viên về:

Danh mục các học phần và số lượng tín chỉ của mỗi học phần dự kiến giảng dạy trong học kỳ, điều kiện để đăng ký học các học phần đó.

Số lớp học dự kiến tổ chức cho mỗi học phần và thời khoá biểu cho các lớp học đó.

Đầu mỗi học kỳ, sinh viên phải tìm hiểu, nghiên cứu để nắm được chương trình đào tạo và đãng ký các học phần sẽ học trong học kỳ đó theo phiếu đăng ký quy định của trường.

3.2.2 Phát biểu bài toán

Qua tìm hiểu về mô hình đào tạo theo học chế tín chỉ em thấy rằng: việc cho sinh viên đăng ký học các học phần như hiện nay có thể dẫn đến tình trạng có những lớp số lượng sinh viên đăng ký học sẽ rất đông trong khi một số lớp học khác lại quá ít sinh viên theo học.

Trên cơ sở thực tế như vây em cho rằng nên cho sinh viên đăng ký học theo một cách mới mềm dẻo hơn đó là:

Sinh viên cần đăng ký số lượng học phần muốn học trong học kỳ; đồng thời đưa ra một danh sách các học phần có thể theo học với tổng số học phần trong danh sách phải lớn hơn hoặc bằng số lượng học phần muốn học đã đăng ký.

Căn cứ vào phiếu đăng ký của sinh viên, nhà trường sẽ bố trí cho mỗi sinh viên học đủ số lượng học phần đã đăng ký và các học phần mỗi sinh viên theo học đều nằm trong danh sách các học phần có thể học mà sinh viên đăng ký trong phiếu đăng ký của mình sao cho các học phần có số lượng sinh viên

theo học chênh lệch nhau càng ít càng tốt. Ví dụ:

Có M sinh viên đăng ký học trong năm học 2014-2015, nhà trưòng dự kiến mở lớp cho N học phần.

Phiếu đăng ký của sinh viên được biểu diễn bằng mảng A cấp (MxN) với: A[i,j]=0 nếu sinh viên i đăng ký học học phần j.

A[i,j]=2 nếu sinh viên i không đăng ký học học phần j.

Mảng p biểu diễn số học phần muốn học của mỗi sinh viên, với P[i] là số học phần muốn học của sinh viên i.

Hãy tìm cách bố trí cho các sinh viên học đủ các học phần phù hợp nguyện vọng của họ, đồng thời các học phần đó có số lượng sinh viên theo học chênh lệch nhau càng ít càng tốt.

3.2.3 Phân tích bài toán và xây dựng thuật toán

Danh sách sinh viên giả thiết được cung cấp từ một chương trình quản lý sinh viên (được lưu trong cơ sở dữ liệu), mỗi sinh viên mang một mã riêng theo quy định của nhà trường.

Danh sách các học phần của tất cả các ngành học cũng đã được lưu trong cơ sở dữ liệu, mỗi học phần mang một mã riêng theo quy định của nhà trường. Thông tin vào:

Các học phần giảng dạy trong học kỳ.

Số lượng học phần mỗi sinh viên muốn học.

Danh sách các học phần có thể theo học của mỗi sinh viên.

(Giả sử với lựa chọn bất kỳ cho mỗi sinh viên, tổng số tín chỉ theo học của mỗi sinh viên không nằm ngoài giới hạn của nhà trường.)

Thông tin ra:

Danh sách sinh viên theo học từng học phần.

Thuật toán:

Bước 1: Tạo phương án ban đầu: For i:=l to m do

đổi các giá trị A[i,j] = 0 thành 1 với j chạy từ 1 ->N cho đến khi đủ số lượng sinh viên i muốn học tức là bằng P[i].

Bước 2:

Repeat

Tao_day_voi; // tạo cột đầy, cột vơi Gán_số;

Nếu tìm được dãy vơi thì sửa; Until không tìm được dãy vơi nữa. Trong đó:

Tao_day_voi:

Tìm trong mảng a tổng t của cột có tổng số các số 1 ít nhất.

Duyệt từ cột 1 đến cột N, nếu cột nào có tổng các số 1 = t thì cột đó được gọi là cột đầy, nếu cột nào có tổng các số 1 < t - 2 thì đó được gọi là cột vơi. Gán số: Xét trên từng cột: Nếu cột j là cột đầy thì: { Gán số 0 cho các cột j;

Xét tất cả các hàng i, gán số j cho các hàng i chưa được gán sô; }

Xét trên từng hàng:

Nếu hàng i đã được gán số thì

thì

Gán số i cho các cột j chưa được gán số.

Tìm vơi: Tìm xem trong các hàng còn tồn tại cột vơi hay không. Nếu tìm được cột vơ thì sửa lại dây chuyền xen kẽ ô xanh và ô trắng, với ô xanh là các ô a[i,j] được gán giá trị bằng 1.

Ví dụ:

Có 8 sinh viên đăng ký học, các sinh viên được đánh số từ 1 đến 8, nhà trường dự kiến mở lớp dạy 8 học phần kí hiệu từ 1 đến 8.

Thông tin phiếu đăng ký của các sinh viên được biểu diễn trong bảng sau: 1 2 3 4 5 6 7 8 1 0 0 2 0 2 0 2 0 2 2 0 0 0 0 2 2 0 3 0 2 0 2 2 2 0 0 4 0 0 0 0 2 0 2 2 5 2 0 2 0 0 2 2 0 6 2 0 0 2 0 2 2 0 7 0 2 2 2 0 0 0 2 8 2 2 0 0 0 0 2 0

Số lượng học phần các sinh viên muốn theo học cho trong bảng sau:

1 2 3 4 5 6 7 8

3 4 2 4 4 3 3 4

Thực hiện ví dụ này theo thuật toán ta có kết quả như sau: Sinh viên 1: Học các học phần: 1, 6, 8

Sinh viên 3: Học các học phần: 1, 7 Sinh viên 4: Học các học phần: 1, 2, 3, 4 Sinh viên 5: Học các học phần: 2, 4, 5, 8 Sinh viên 6: Học các học phần: 2, 3, 5 Sinh viên 7: Học các học phần: 1, 6, 7 Sinh viên 8: Học các học phần: 3, 4, 5, 6 Một số giao diện trong chương trình

Chức năng đăng ký học phần

Các hàm và thủ tục chính của chương trình: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DangKyTinChi.Common {

public class Hungari {

public int[] P = null/*So Hoc Phaan sv muon hoc*/, Day = null/*Day day hay voi*/

, Gc = null/*Gan cot*/, Gh = null/*Gan hang*/; public int[][] A = null;

public int M = 0/*So SV*/, N = 0/*So Hoc Phan*/, J0 = 0; public void Prepare()

{

this.P = new int[this.M]; this.Gc = new int[this.N]; this.Gh = new int[this.M]; this.Day = new int[this.N]; this.A = new int[M][];

for (int i = 0; i < this.M; i++) this.A[i] = new int[this.N];

for (int i = 0; i < this.M; i++)

for (int j = 0; j < this.N; j++) this.A[i][j] = 2; }

private void Hang(int i) {

int dem = 0;

for (int j = 0; j < this.N; j++) {

if (this.A[i][j] == 0 && dem < this.P[i]) { this.A[i][j] = 1; dem++; } } } /// <summary>

/// Tao Phuong An Ban Dau /// </summary>

public void Pal() {

for (int i = 0; i < this.M; i++) {

this.Hang(i); }

}

private int TongCot(int j) {

int p = 0;

for (int i = 0; i < this.M; i++) {

if (this.A[i][j] == 1) p++; }

return p; }

private void TaoDayVoi() {

for (int j = 0; j < this.N; j++) this.Day[j] = 0; int t = this.TongCot(0);

for (int j = 1; j < this.N; j++) {

int tongCotJ = this.TongCot(j); if (t < tongCotJ)

t = tongCotJ; }

for (int j = 0; j < this.N; j++) {

int tongCotJ = this.TongCot(j);

if (t == tongCotJ) this.Day[j] = 1; //Cot Day //if (t >= tongCotJ + 2) this.Day[j] = -1; //Cot Voi 1< t -2

if (tongCotJ < t - 2) this.Day[j] = -1; }

}

private void Gan1() {

{

if (this.Day[j] == 1) {

this.Gc[j] = 0;

for (int i = 0; i < this.M; i++) { if (this.A[i][j] == 1) if (this.Gh[i] == -1) this.Gh[i] = j; } } } }

private void Gan2() {

for (int i = 0; i < this.M; i++) {

if (this.Gh[i] > 0) {

for (int j = 0; j < this.N; j++) { if (this.A[i][j] == 0) if (this.Gc[j] == -1) this.Gc[j] = i; } } } }

private void GanSo() {

int dem = 0;

for (int i = 0; i < this.M; i++) {

this.Gh[i] = -1;

for (int j = 0; j < this.N; j++) { this.Gc[j] = -1; dem = 0; do { Gan1(); Gan2(); dem++;

} while (dem == (this.N + this.M)); }

}

private bool TimVoi() {

for (int j = 0; j < this.N; j++) {

if (this.Day[j] == -1 && this.Gc[j] > 0) { // j 0:=j; this.J0 = j; return true; break; } } return false; }

private void Sua(int i, int j) { while (i > 0 && j > 0) { i = this.Gc[j]; this.A[i][j] = 1 - this.A[i][j]; j = this.Gh[i]; if (j > 0) this.A[i][j] = 1 - this.A[i][j]; } }

public void ThucHien() {

do {

TaoDayVoi(); GanSo();

if (TimVoi()) Sua(this.Gc[this.J0], this.J0);

} while (TimVoi()); }

} }

KẾT LUẬN 1. Kết luận

Sau thờ i gian nghiên cứu về Lý thuyết đồ thị, tìm hiểu về những ứng du ̣ng và tính thiết thực của lĩnh vực này, luận văn đã đa ̣t được những kết quả như sau:

Phần lý thuyết:

-Tìm hiểu các khái niệm cơ bản của đồ thị, đồ thị hai phía.

-Tìm hiểu các thuật toán giải bài toán bộ ghép cực đại trên đồ thị hai phía và trên đồ thị tổng quát.

Phần thực nghiệm:

- Tìm hiểu được mô ̣t số ứng du ̣ng của Lý thuyết đồ thi ̣ và bước đầu biết cách ứng dụng lý thuyết để triển khai áp du ̣ng giải hai bài toán trong thực tế: Bài toán xếp lớ p ho ̣c theo tín chỉ và bài toán điều hành taxi.

-Cài đặt thử nghiê ̣m chương trình mô phỏng thuâ ̣t toán Hungari giải bài toán xếp lớp học theo học chế tín chỉ. Đây là bài toán có tính thực tế cao.

-Các thuật toán sử dụng là tìm bộ ghép cực đại với trọng số cực tiểu trên đồ thị hai phía và thuật toán phỏng theo thuật toán Hung-ga-ri.

-Thời gian chạy bài toán nhanh.

-Giao diện thân thiện và có thể nâng cấp để áp du ̣ng vào công viê ̣c đào ta ̣o của Trường TCKT Vĩnh Phúc.

Bên cạnh đó, luận văn còn một số nhược điểm như: Chương trình mới mô phỏng được thuật toán, chưa mô tả và giải quyết được hết các yêu cầu phát sinh trong thực tế.

2. Hướng phát triển của đề tài:

Tiếp tục tìm hiểu về mô hình đào tạo theo học chế tín chỉ để xây dựng phần mềm hoàn chỉnh, với đầy đủ chức năng phục vụ cho công việc đào tạo theo học chế tín chỉ - một mô hình đào tạo còn mới và còn nhiều khó khăn.

Tìm hiểu thêm về những ứng du ̣ng của Lý thuyết đồ thi ̣ để giải quyết các bài toán trong thực tế.

TÀI LIỆU THAM KHẢO Tiếng Việt

[1] Lê Minh Hoàng, Giải thuật và lập trình, Đại học sư phạm Hà Nội 1999-2002 [2] Nguyễn Cam, Chu Đức Khánh, Lý thuyết đồ thị, NXB Thành phố Hồ Chí Minh,

1999.

[3] Đinh Mạnh Tường, Cấu trúc dữ liệu và thuật toán, NXB KH&KT, 2001

[4] Nguyễn Đức Nghĩa – Nguyễn Tô Thành, Toán rời rạc, NXB Đại học Quốc Gia Hà Nội, 2003.

[5] Kenneth H.Rosen – Toán rời rạc ứng dụng trong Tin học (Bản dịch), NXB Khoa học và Kỹ thuật, 2003.

Tiếng Anh

[6] S. Dasgupta, C. H. Papadimitriou, and U. V. Vazirani, Algorithms, 2006

[7] Edmonds, Jack (1965). "Paths, trees, and flowers". Canad. J. Math. 17: 449– 467. doi:10.4153/CJM-1965-045-4

[8] Hopcroft,JohnE.;RajeevMotwani,JeffreyD.Ullman, Introduction to Automata Theory, Languages and Computation,1stedition,Addison-Wesley,

1979.

[9] Narsingh Deo "Graph Theory with Applications to Engineering and Computer Science", New Delhi-110001, 2006.

[10] Aho A., The design and analysis of computer algorithms. Addison Wesley Pub. Comp, London 1976.

Một phần của tài liệu (LUẬN văn THẠC sĩ) bài toán tìm bộ ghép cực đại trên đồ thị, ứng dụng giải một số bài toán trong thực tế (Trang 67)

Tải bản đầy đủ (PDF)

(80 trang)