Sau khi đã có đầy đủ các lệnh tinh chỉnh dữ liệu chính: Move To, Push Out, CX, điều thúc dục tôi suy nghĩ nhiều nhất khi đó là làm sao có được chức năng xếp tự động 100%. Điều này trước đó tôi không bao giờ nghĩ đến vì suy nghĩ thường trực của mình trong đầu luôn là: không bao giờ có thể thực hiện được ước mơ đó. Đó là 1 bài toán vĩnh viễn không có lời giải!
Tôi đã nghĩ một thời gian dài về chức năng này, có rất nhiều ý tưởng cho nó, nhưng xuyên suốt là ý tưởng cần mô phỏng lại hoàn toàn một quá trình xếp thời khóa biểu thực tế (bằng phần mềm) từ lúc bắt đầu cho đến lúc hoàn thành.
Qui trình xếp thời khóa biểu trên thực tế tại thời điểm đó cho đến lúc xếp xong có thể mô tả ngắn gọn như sau:
Bước 1: (các bước chuẩn bị: nhập dữ liệu, nhập bảng phân công chuyên môn, xếp tiết CHÀO CỜ, tiết KHÔNG HỌC, xếp tiết Sinh hoạt và một số tiết học khác)
Bước 2: Thực hiện lệnh tự động xếp của phần mềm đạt 95-99%.
Bước 3: Thực hiện việc xếp nốt các tiết trống còn lại. Cách làm nhanh nhất là thực hiện liên tục các lệnh CX cho đến khi xếp xong thì thôi.
Điều quan trọng, khó khăn nhất của qui trình trên là các lệnh CX thực hiện ở bước cuối cùng của qui trình trên. Không phải bao giờ lệnh CX cũng thành công. Thực tế đã chỉ ra khi thực hiện lệnh CX với các thuật toán khác nhau thì thứ tự các thuật toán tốt, thành công như sau (liệt kê theo thứ tự kém trước, tốt sau):
1. CX
2. FPR
3. DPR
Vấn đề chính là ở bước thứ 3 này, làm sao có thể kiểm soát được và khẳng định được các lệnh CX này sẽ thành công để hoàn thành nhiệm vụ xếp thời khóa biểu. Tất cả sự khó khăn phức tạp mà tôi suy nghĩ chính là ớ vị trí đó.
Việc mô phỏng các bước 2, 3 đã nói ở trên để đưa vào 1 hàm duy nhất sao cho tất cả qui trình trên trở thành "tự động" hoàn toàn cũng là một bài toán không đơn giản của việc lập trình.
Như vậy bài toán xếp 100% thời khóa biểu sẽ đưa về 2 vấn đề sau:
1. Thiết kế bộ dữ liệu và lập trình mô phỏng lại hoàn toàn các bước 2, 3 trên đây trong 1 hàm và 1 bộ dữ liệu duy nhất.
2. Bài toán phải đưa ra được các bước kiểm tra, phân tích những điều kiện nào, dữ kiện nào, ràng buộc nào có thể cản trở sự thành công của các lệnh CX này.
Tôi đã mang ý định, ý tưởng về lệnh xếp 100% thời khóa biểu đó bàn với các bạn trẻ trong công ty. Tôi nêu ý tưởng, nêu các khó khăn và nói đại ý rằng đây là một việc rất quan trọng. Nếu chúng ta làm được việc này thì đây là một bước đột phá quan trọng của công ty, đây là chức năng mà chúng ta có đầu tiên trên thế giới.
Các bạn trẻ đã ủng hộ nhiệt liệt ý tưởng của tôi, các bạn đó lập tức lập thêm 1 đội nữa, tự phân công nhau cùng làm, cả một cậu bên kinh doanh cũng xung phong quay sang lập trình. Phần ý tưởng chính có rồi, tôi sẽ lo thiết kế phần thuật toán kiểm tra, phân tích ban đầu (bài toán 2 nêu ở trên), phần còn lại nhóm sẽ tự làm.
Cả công ty School@net đã lao vào làm chức năng này với quyết tâm rất mãnh liệt, việc lập trình, kiểm thử, sửa sai mất gần 1 năm mới xong. Đây thực sự là 1 dự án lớn của công ty School@net vào thời kỳ đó. Toàn bộ module này được chia làm 3 phần:
1. Module kiểm tra, phân tích.
2. Module xếp tự động hoàn toàn 100%
3. Module tối ưu hóa dữ liệu sau khi hoàn thiện.
Tôi phụ trách thiết kế module 1. Công việc vô cùng vất vả. Chỉ biết rằng ở giai đoạn gần hoàn thiện tôi yêu cầu listing đoạn Code của module 1 để tôi kiểm tra bên ngoài. In giấy A4, phông chữ size 10, lề 1cm, mà in toàn bộ module này ra máy in là trên 100 trang, thật là khủng khiếp.
Cuối cùng lệnh đã được viết xong, chúng tôi thứ nghiệm với hơn 20 bộ dữ liệu mẫu đều không lỗi, chạy ngon lành, xếp toàn bộ 1 thời khóa biểu 100% chỉ mất khoảng 1 phút hoặc ít hơn. Thành công quá mong đợi.
Khi thiết kế giao diện tôi đã đặt tên chức năng này là SF - Start & Finish. 2 chữ này có ý nghĩa: chỉ cần bấm nút Start, đợi 1 lúc, bấm nút Finish là XONG.
Phiên bản TKB 5.0 ra đời tháng 6 năm 2004 là phần mềm đầu tiên của Việt Nam và thế giới có chức năng phân tích và xếp tự động 100% thời khóa biểu. Chúng tôi, các nhân viên công ty School@net rất vui và tự hào đã làm được 1 công việc lớn, giải được 1 bài toán khá hắc búa, vừa có ý nghĩa thực tế lớn, vừa có ý nghĩa khoa học.
Tôi nhớ lại bài toán về bài toán xếp thời khóa biểu mà tôi đã tham gia từ năm 1987 mà không khỏi cảm thấy vui vì mình đã đi những bước dài về phía trước của bài toán này.
Bùi Việt Hà, Công ty Công nghệ Tin học Nhà trường
School@net
|