I. Xây dựng chương trình
I.4. Các giải pháp
I.4.1. Giải pháp đồ thị cho việc đặc tả học phần và quan hệ học phần
a. Đặt vấn đề: Như đã nói ở phần phân tích hiện trạng, mỗi học phần có quan hệ ràng buộc với các học phần khác. Theo chương trình hiện nay có 3 loại quan hệ: quan hệ tiên quyết, quan hệ học trước, quan hệ song hành. Vấn đề đặt ra là làm sao khi sinh viên đăng ký một lớp học phần, hệ thống có thể tự động kiểm tra các ràng buộc trên một cách nhanh chóng.
b. Mô tả bài toán: Cho trước một tập các học phần, một tập các quan hệ, cho trước một
danh sách sinh viên và bản điểm của sinh viên. Yêu cầu: với một sinh viên, khi đăng ký một lớp học phần, hãy kiểm tra xem sinh viên đó có đáp ứng đủ yêu cầu về ràng buộc các học phần hay không.
c. Giải pháp: Gọi đồ thị có hướng G = (V,E) để đặc tả các học phần và quan hệ giữa chúng. Trong đó, V là tập các đỉnh với mỗi đỉnh là một học phần và E là tập các cung với mỗi cung đặc trưng cho quan hệ giữa chúng, trong đó trọng số của mỗi cung chính là mã quan hệ giữa các học phần. Từ đó suy ra, việc sinh viên học hoặc vượt qua các học phần tại trường đại học sẽ tương ứng với việc một người đã đi qua được các đỉnh trên đồ thị; quá trình sinh viên đó học tại trường chính là đoạn đường mà sinh viên đó đi được; học phần mà sinh viên đăng ký để học chính là đỉnh tiếp theo trên đồ thị mà sinh viên đó phải đi. Và như vậy, bài toán lúc này trở thành kiểm tra xem với đoạn đường đã đi được của một sinh viên vào thời điểm hiện tại, sinh viên đó có thể đi tiếp đến đỉnh xác định nào đó hay không. Đồ thị G được đặc tả như hình.
Hình 51 – Đồ thị mô tả học phần và các quan hệ Với ví dụ trên thì các học phần có mối quan hệ như sau:
− Học phần A là học phần học trước đối với B.
− Học phần A là học phần tiên quyết đối với D.
− Học phần D là học phần học trước đối với C.
− Học phần A là học phần song hành đối với F.
Biểu diễn bài toán vào hệ thống: để biểu diễn đồ thị này vào máy tính để xử lý, chúng ta có 3 phương pháp:
1. Ma trận cạnh kề: Toàn bộ đồ thị được biểu diễn bằng ma trận NxN, với N là số đỉnh của đồ thị, giá trị mỗi ô trong ma trận đặc trưng cho trọng số của đồ thị. Với ví dụ trên thì ma trận cạnh kề như sau: 0 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 A = 0 0 1 0 0 3 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0
Phương pháp này có ưu điểm là việc truy xuất nhanh chóng. Trong trường hợp các học phần có thêm một hoặc nhiều quan hệ mới thì cũng dễ dàng cập nhật. Tuy nhiên phương pháp này cũng có những hạn chế. Để mô tả ma trận này trong máy tính thì phải yêu cầu một cấu trúc lớn, chẳng những thế, cấu trúc này lại khó thay đổi. Trên thực tế, các hệ thống hiện tại có dung lượng bộ nhớ hạn chế trong khi các học phần lại nhiều và có xu hương tăng lên. Bên cạnh đó việc biểu diễn đồ thị bằng ma trận cạnh kề trở nên phí phạm nếu số cạnh trong đồ thị thưa thớt. Thực tế thì chương trình đào tạo tín chỉ đang mới chuyển từ đào tạo niên chế sang do đó các học phần không có sự ràng buộc nhiều, nên việc biểu diễn này sẽ rất phí phạm. Với những lý do trên, phương pháp biểu diễn đồ thị bằng ma trận cạnh kề thực sự không tối ưu.
2. Danh sách đỉnh kề: Với mỗi điểm, chúng ta sử dụng m danh sách để biểu diễn những điểm kề nó, mỗi danh sách thể hiện một loại quan hệ. Với ví dụ trên thì m bằng 3 và đồ thị được biểu diễn thành danh sách đỉnh kề như sau:
Học phần Học phần học trước Học phần tiên quyết Học phần song hành A B D B C C D F E F D G
Bảng 34 – Biểu diễn quan hệ theo danh sách đỉnh kề
Phương pháp này có ưu điểm là tiết kiệm tài nguyên lưu trữ nhất. Đối với những trường hợp số cạnh thưa thớt và các trọng số không thay đổi nhiều thì phương pháp này rất hiệu quả. Tuy nhiên, trong trường hợp số lượng quan hệ tăng lên (nghĩa là trọng số có sự thay đổi), thì việc xử lý sẽ rất khó khăn. Bên cạnh đó, việc xử lý trên nhiều danh sách cùng một lúc sẽ làm cho hệ thống làm việc chậm lại.
đến các học phần khác được lưu bởi 1 cạnh của đồ thị. Với ví dụ trên thì đồ thị được biểu diễn thành danh sách cạnh như sau:
Học phần 1 Học phần 2 Quan hệ A B 1 A D 2 D C 1 D F 3 Bảng 35 – Bảng quan hệ học phần
Phương pháp này có ưu điểm là danh sách cạnh chỉ cần được lưu trữ trong một danh sách, nên việc truy xuất, cập nhật sẽ được dễ dàng. Những đỉnh độc lập thì không cần lưu trữ nên sẽ tiết kiệm đáng kể tài nguyên bộ nhớ. Trong trường hợp một đỉnh có rất nhiều cung (nghĩa là bậc của đỉnh đó khá lớn) thì phương pháp này trở nên phí phạm hơn so với phương pháp danh sách đỉnh kề.
Với thực tế bài toán này, chúng tôi chọn phương pháp thứ 3 với các lý do sau:
− Đối với vấn đề lưu trữ, mỗi học phần thường chỉ cần 1 đến 2 môn học trước hoặc tiên
quyết, do đó bậc của một đỉnh thường không vượt quá 5. Với ví dụ trên thì đỉnh có bậc cao nhất là đỉnh D (bậc 3). Vì bậc của một đỉnh không quá lớn nên việc lưu trữ sẽ không quá phí phạm.
− Đối với vấn đề xử lý, việc xử lý liên quan đến quan hệ giữa các học phần được thực
hiện trong 2 thời điểm: thời điểm đầu tiên là thời điểm đầu mỗi khóa học khi nhân viên đào tạo cập nhật chương trình học và các ràng buộc kèm theo và thời điểm thứ hai là thời điểm đầu kỳ khi sinh viên đăng ký học phần cho kỳ tới. Đối với thời điểm đầu tiên thì việc xử lý là thêm học phần và thêm quan hệ, trong thời điểm này, việc truy cập là không nhiều. Đối với thời điểm thứ hai thì việc xử lý là truy xuất để kiểm tra, trong thời điểm này các truy cập của sinh viên là rất nhiều. Việc thiết kế lưu trữ theo phương pháp danh sách cạnh nói trên tuy không thuận tiện cho việc thêm các quan hệ nhưng hoàn toàn thuận lợi cho việc truy xuất dữ liệu tương ứng.
− Với thiết kế này, chúng ta dễ dàng hiển thị quan hệ giữa các học phần theo dạng cây
phân cấp. Từ đó sinh viên có thể dễ dàng xem và biết được học phần nào là tiên quyết, học phần nào cần học trước để có kế hoạch học tập hợp lý.
d. Nội dung thuật toán (viết bằng giả ngữ):
− Input: Danh sách các đỉnh (học phần), danh sách các cạnh (quan hệ giữa các học phần), mã sinh viên, đoạn đường mà sinh viên đã đi được (bảng điểm của sinh viên), đỉnh đích (học phần cần đăng ký).
− Output: Yes/No. Nghĩa là, sinh viên có đi tiếp đến đỉnh đích hay không, hoặc sinh viên đó có được phép đăng ký học phần đó hay không.
− Method:
1. Tìm trong danh sách cạnh những cạnh có đỉnh cuối là đỉnh đích.
2. Nếu không tìm thấy (nghĩa là đỉnh đó độc lập, hay học phần cần đăng ký là học phần độc lập) trả về “Yes”, ngược lại, tiếp tục bước 3.
3. Với từng cạnh thu được, kiểm tra trong đỉnh đầu của mỗi cạnh, không có đỉnh nào nằm trong đoạn đường mà sinh viên đã đi (nghĩa là sinh viên đã học qua học phần đó) thì trả về “No”, ngược lại, trả về “Yes”.
e. Đánh giá thuật toán
Độ phức tạp của thuật toán là O(n*m) với n là số cạnh trong danh sách cạnh, m là số đỉnh mà sinh viên đó đã đi qua. Số cạnh trong danh sách cạnh không quá 1000, số đỉnh và sinh viên đó đi qua không quá 100. Do đó số xử lý thực hiện không vượt quá 105. Với độ phức tạp này, giải pháp này hoàn toàn có thể áp dụng vào chương trình.
I.4.2. Giải pháp chiếm dụng khe thời gian
a. Đặt vấn đề: Như đã nói ở phần phân tích hiện trạng, khi một sinh viên đăng ký một lớp học phần, hệ thống cần kiểm tra xem thời khóa biểu của sinh viên có bị xung đột hay không.
b. Mô tả bài toán: Cho trước danh sách các lớp học phần và thời khóa biểu tương ứng
của chúng. Với một sinh viên và một thời khóa biểu của sinh viên, hãy kiểm tra xem sinh viên có thể học lớp học phần ấy mà hai thời khóa biểu không bị xung đột hay không.
c. Giải pháp: Gọi Q là quỹ thời gian của sinh viên. Quỹ thời gian Q gồm có 7 ngày tương ứng với 7 ngày trong tuần và trong mỗi ngày sẽ có 12 khe thời gian tương ứng với 12 tiết học. Và P là danh sách những khe thời gian mà lớp học phần yêu cầu, P bao gồm những khe thời gian trong một vài ngày xác định tương ứng với các tiết học trong thời khóa biểu của lớp học phần đó. Khi một sinh viên đăng ký một lớp học phần nghĩa
là sinh viên đó sẽ phải dành ra một vài khe thời gian trong quỹ thời gian của mình hay nói cách khác, lớp học phần đã chiếm dụng một vài khe thời gian trong quỹ thời gian của người đó. Vấn đề lúc này là khi một sinh viên đăng ký một lớp học phần tiếp theo thì chúng ta cần kiểm tra xem các khe thời gian mà lớp học phần đó cần đã bị chiếm dụng hay chưa.
d. Biểu diễn bài toán vào hệ thống: Ta định nghĩa quỹ thời gian là một đối tượng gồm
7 thuộc tính kiểu số nguyên (integer 2 byte), trong đó 7 thuộc tính này tương ứng 7 ngày trong tuần, mỗi khe thời gian làm một bit trong số 16 bit của 2 byte đó. Đối tượng này cũng được định nghĩa cho danh sách các khe thời gian của lớp học học phần. Để kiểm tra những khe thời gian mà lớp học phần yêu cầu đã bị chiếm dụng hay chưa,
5/25/2007 5/25/2007 5/25/2007 5/25/2007 5/25/2007 5/25/2007 5/25/2007 5/25/2007 5/25/2007 *
Quỹ thời gian Khe thời gian Quỹ thời gian của sinh viên lớp học phầnyêu cầu sau khi đăng
ký
Mon Tue Wed Thu Fri Sat Mon Tue Wed Thu Fri Sat
*
Mon Tue Wed Thu Fri Sat
Hình 52 – Kiểm tra xung đột thời khóa biểu bằng AND bit (không xung đột)
Quỹ thời gian của sinh viên
Mon Tue Wed Thu Fri Sat
Khe thời gian lớp học phần
yêu cầu
Mon Tue Wed Thu Fri Sat
Quỹ thời gian sau khi đăng
ký
Mon Tue Wed Thu Fri Sat
Hình 53 – Kiểm tra xung đột thời khóa biểu bằng AND bit (có xung đột)
Để cập nhật quỹ thời của sinh viên sau khi đăng ký lớp học phần, chúng ta sử dụng toán tử OR để OR các cặp bit tương ứng trong từng số nguyên của 2 đối tượng với nhau.
Quỹ thời gian
Mon Tue Wed Thu Fri Sat
Khe thời gian yêu cầu
Mon Tue Wed Thu Fri Sat
Quỹ thời gian ký
Mon Tue Wed Thu Fri Sat
-
Để cập nhật quỹ thời gian của sinh viên sau khi sinh viên thực hiện hủy bỏ một lớp học phần chúng ta chỉ cần thực hiện toán tử AND NOT các cặp bit tương ứng trong từng số
nguyên của 2 đối tượng với nhau.
Mon Tue Wed Thu Fri Sat
Mon Tue Wed Thu Fri Sat
Mon Tue Wed Thu Fri Sat
Hình 55 – Cập nhật quỹ thời gian của sinh viên sau khi hủy bỏ lớp học phần
f. Đánh giá giải pháp
− Giải pháp này tối ưu về việc lưu trữ. Việc thiết kế lưu trữ dữ liệu ở dạng bit làm cho việc lưu trữ là tối ưu nhất. Ứng với mỗi quỹ thời gian chúng ta chỉ cần lưu trữ 14 byte.
− Giải pháp này tối ưu về việc tính toán. Việc sử dụng các toán tử xử lý bit (toán tử cơ bản của hệ thống) như AND, OR và NOT làm cho việc tính toán trở nên rất nhanh chóng. Với mỗi lần kiểm tra, hệ thống chỉ cần thực hiện phép toán này 7 lần.
I.4.3. Giải pháp ánh xạ dữ liệu
a. Đặt vấn đề: Khi thiết kế chương trình, dữ liệu liên quan đến đào tạo vốn đã có trong hệ thống quản lý niên chế tại trường. Việc nhập lại số liệu từ hệ thống cũ sang hệ thống mới rất là vất vả và không hiệu quả. Vấn đề đặt ra lúc này là làm sao có thể chuyển dữ liệu từ hệ quản trị cơ sở dữ liệu này sang hệ quản trị cơ sở dữ liệu khác một cách nhanh chóng mà vẫn đáp ứng các ràng buộc.
b. Giải pháp: Để có thể chuyển dữ liệu từ hệ quản trị cơ sở dữ liệu này sang hệ quản trị cơ sở dữ liệu khác ta sử dụng một cấu trúc dữ liệu trung gian làm trục. Đơn giản nhất là sử dụng file xml, tuy nhiên, file xml không thể biểu diễn trực quan thành dạng bảng cũng như khó chỉnh sửa cho phù hợp. Do đó, chúng tôi chọn file excel. File excel (*.xls) hiện tại trở thành dạng file thông dụng nhất hiện nay. Ngoài Ms Office của Windows, Open Office của Linux vẫn có thể đọc được. Dữ liệu được ánh xạ theo quy trình như hình 56.
Dữ liệu từ hệ thống hiện tại CSDL Ms SQL Module ánh xạ dữ liệu Dữ liệu hệ thống mới CSDL My SQL
File Excel .xls Xử lý ràng buộcĐọc file Excel dữ liệu Cầu nối JDBC CSDL chỉ định CSDL Oracle CSDL Access Hình 56 – Quy trình ánh xạ dữ liệu Quy trình ánh xạ dữ liệu như sau:
Bước 1: Chương trình quản lý hiện tại sử dụng chức năng report để xuất dữ liệu trong cơ sở dữ liệu cụ thể của mình sang file excel (*.xls).
Bước 2: Module ánh xạ dữ liệu sẽ đọc file excel, sau đó kiểm tra ràng buộc.
Bước 3: Module ánh xạ dữ liệu sẽ ghi vào cơ sở dữ liệu chỉ định thông qua cầu nối dữ liệu.
c. Cấu trúc module ánh xạ dữ liệu: Module ánh xạ dữ liệu này được xây dựng bằng ngôn ngữ Java trên nền JDK 1.5 nên có cấu trúc như sau:
− JExcel API: là một Java API cho phép những ứng dụng Java có thể đọc những bảng
tính Excel và có thể tạo những bảng tính Excel. Thêm vào đó, nó còn chứa những kỹ thuật cho phép ứng dụng Java có thể vừa đọc một bảng tính vừa thay đổi một số cell trên bảng tính, và ghi ra một bảng tính mới. JExcel API được công bố miễn phí tại địa chỉ http : / / j e x cel a pi.s ou r cefo rge . n e t và thành phần chính của nó là gói jxl.jar
− Class đọc file excel: Class này do chúng tôi cài đặt để vừa đọc vừa kiểm tra ràng buộc dữ liệu từ file excel. Nội dung class này như sau:
import java.io.File; import java.util.Date; import jxl.*;
...
Workbook workbook = Workbook.getWorkbook(new File("myfile.xls")); // Khi đã có sự truy cập vào workbook, bạn có thể truy cập vào một sheet cụ thể nào đó. Sheet đầu tiên có chỉ mục là 0, sheet thứ hai có chỉ mục là 1 và cứ tiếp tục như thế.
Sheet sheet = workbook.getSheet(0);
//Khi đã có một sheet , bạn có thể bắt đầu truy cập các cell của sheet. Bạn có thể lấy nội dung của cell là một xâu bằng cách sử dụng phương thức getContents().