Khóa luận tốt nghiệp và những câu chuyện - Phần 4: Vấn đề tràn bộ nhớ và cải thiện mô hình
Series: Khóa luận tốt nghiệp và những câu chuyện
Phần: 4 / 5- Khóa luận tốt nghiệp và những câu chuyện - Phần 1: Giới thiệu
- Khóa luận tốt nghiệp và những câu chuyện - Phần 2: Định nghĩa bài toán
- Khóa luận tốt nghiệp và những câu chuyện - Phần 3: Mô hình hóa bài toán
- Khóa luận tốt nghiệp và những câu chuyện - Phần 4: Vấn đề tràn bộ nhớ và cải thiện mô hình
- Khóa luận tốt nghiệp và những câu chuyện - Phần 5: Một số thành tựu và cảm nhận cá nhân
1. Vấn đề tràn bộ nhớ
Mô hình hoàn chỉnh ở phần trước mô tả đúng bài toán, nhưng với dữ liệu thật của một học kỳ thì mô hình có từ 1.3 đến 1.5 triệu biến và 1.7 đến 2 triệu ràng buộc. Mình đã từng lập trình mô hình này và để cho máy tính giải, treo máy qua đêm, hôm sau ngủ dậy thấy máy tính đã chạy được hơn 8 tiếng sau đó bị dừng vì tràn bộ nhớ và quan trọng nhất là vẫn chưa có một nghiệm chấp nhận nào được tìm thấy.
Phản ứng đầu tiên của mình khi đó là chạy lại 1 lần nữa - kết quả vẫn như vậy. Sau đó mình lục tung đống code xem có bug ở đâu không - không tìm thấy gì cả. Vậy là mình ngồi xem lại mô hình - không thấy gì, mô hình đã mô tả rất đúng bài toán, thậm chí còn được thu gọn vì đã phá tính đối xứng rồi.
Cuối cùng mình nhận ra không có gì sai cả, chỉ là kích cỡ bài toán lớn quá không thể giải quyết chỉ trong 1 lần giải được. Và một cách giải quyết rất tự nhiên thôi, to quá không giải quyết được thì chẻ nhỏ ra và giải từng phần một.
2. Chia bài toán thành hai giai đoạn
Thay vì giải một mô hình khổng lồ duy nhất, bài toán được tách thành 2 giai đoạn và giải lần lượt.
2.1. Số phòng yêu cầu tối thiểu
Tách giai đoạn dễ khiến giai đoạn 1 xếp thời gian xong nhưng giai đoạn 2 lại không đủ phòng để xếp. Để tránh việc này, định nghĩa số phòng yêu cầu tối thiểu của môn thi là số phòng ít nhất cần có để chắc chắn đủ chỗ cho môn đó.
Ví dụ với 6 phòng thi sức chứa , môn thi có sinh viên cần ít nhất phòng (), vì bất kỳ 4 phòng nào trong 6 phòng trên cũng đủ chỗ. Chỉ cần đảm bảo tại mỗi ca thi, tổng số phòng yêu cầu không vượt quá tổng số phòng thi tối đa thì giai đoạn 2 chắc chắn xếp đủ phòng.
2.2. Mô hình xếp thời gian cho môn thi
Giữ nguyên biến , và hàm mục tiêu ở Phần 3, bỏ hết biến/ràng buộc liên quan đến phòng thi, thêm ràng buộc về số phòng yêu cầu tối thiểu
2.3. Mô hình xếp phòng cho môn thi
Sau khi giải xong giai đoạn 1, với mỗi ca thi ta có tập các môn thi được xếp vào ca đó. Giai đoạn này chỉ còn cần xếp phòng, với thêm mục tiêu hạn chế tổng số phòng sử dụng (vì luôn số phòng thật sự cần dùng)
2.4. Đánh đổi cho việc chia nhỏ
Nếu để ý kỹ bạn sẽ thấy việc sử dụng "số phòng yêu cầu tối thiểu" đã khiến mô hình có một lỗ hổng, đó là một số môn sẽ yêu cầu quá nhiều phòng. Hãy xem lại ví dụ với 6 phòng thi sức chứa , môn thi có sinh viên. Tất nhiên với 4 phòng thi bất kỳ kiểu gì cũng xếp được môn này nhưng có thể môn này chỉ cần 2 phòng (30, 30) hoặc 3 phòng (10, 20, 30) thôi là đủ rồi.
Mình hoàn toàn nhận thức được điều đó nhưng sau nhiều thử nghiệm với nhiều cách khác nhau mình vẫn chọn làm cách này vì hai lý do sau:
- Số lượng phòng trong bộ dữ liệu mình làm việc là dư thừa (tức là mình có thể phân chia phòng thoải mái)
- Mối quan tâm chính của bài toán này tại trường Đại học Khoa học Tự nhiên là các vấn đề về thời gian
Sau khi đã chia nhỏ, giai đoạn 2 giải rất nhanh (dưới 1 giây), nhưng giai đoạn 1 vẫn chạy chậm và nghiệm chưa đủ tốt - đó là lý do cho phần tiếp theo.
3. Cải thiện mô hình bằng tìm kiếm địa phương
Ý tưởng: giải giai đoạn 1 đến khi có một nghiệm khởi tạo chấp nhận được, sau đó lặp lại một khung chung để cải thiện dần - thu hẹp không gian tìm kiếm quanh nghiệm hiện tại theo một "quy tắc riêng" và giải lại, lặp lại quá trình cho đến khi không tìm được nghiệm tốt hơn.
3.1. Kỹ thuật thứ nhất - thu hẹp không gian quanh mỗi môn thi
Với nghiệm hiện tại, môn thi đang xếp ở ca thi . Xây dựng tập gồm các ca thi cách không quá ca ( cho trước) rồi giới hạn mỗi môn thi chỉ được xếp trong tập này. Ví dụ ở ca , thì . Đây chính là "quy tắc riêng" điền vào khung chung ở trên:
3.2. Kỹ thuật thứ hai - cố định các môn đã "ổn"
Môn thi được gọi là có thời gian ôn tập tốt nếu mọi sinh viên đăng ký đều có thời gian ôn tập môn lớn hơn ngưỡng cho trước. "Quy tắc riêng" của kỹ thuật này là một phép phân loại cho từng môn thi:
3.3. Thuật toán xếp lịch thi hoàn chỉnh
Toàn bộ các bài toán quy hoạch hỗn hợp nguyên ở từng bước được giải bằng Gurobi 10.0.
4. Kết luận
Trên đây là thuật toán cốt lõi cho nghiên cứu của bọn mình, tuy nhiên đây mới chỉ là lý thuyết trên giấy và để có thể đem lại kết quả tốt vẫn cần rất nhiều những kỹ thuật khác liên quan đế cấu trúc dữ liệu và lập trình. Nhưng mình sẽ không trình bày ở đây vì đó là phần mà Quý Anh và Quân đảm nhận. Phần sau sẽ là phần cuối của series, mình sẽ trình bày về các kết quả đạt được của dự án này và một chút cảm nhận cá nhân.
Đọc tiếp Phần 5