Series: Mô hình hóa các câu đố logic
Phần: 2 / 91. Giới thiệu
Star Battle là một câu đố logic được mô tả như sau, cho một lưới cỡ được chia thành các khu vực, người chơi cần điền các ngôi sao vào lưới thỏa mãn các yêu cầu dưới đây:
- Mỗi hàng, cột, khu vực chỉ chứa một số lượng ngôi sao cho trước
- Một ngôi sao không được nằm cạnh một ngôi sao khác (bất kể theo hướng nào)
Dưới đây là ví dụ cho một câu đố Star Battle cỡ 10×10, và 2 ngôi sao mỗi hàng, cột, khu vực

2. Mô hình hóa câu đố
Một số ký hiệu dùng trong bài toán
- là số hàng của lưới
- là số cột của lưới
- là số ngôi sao cần điền vào mỗi hàng, cột, khu vực
- là tập hợp các khu vực
- là các ô thuộc khu vực
- là tập hợp các ô cạnh ô (theo cả hướng chéo)
- là số ô kề ô (theo cả hướng chéo)
2.1. Biến quyết định
Với mỗi ô trong lưới, xây dựng biến thỏa mãn
2.2. Các ràng buộc
- Mỗi hàng chứa đúng ngôi sao
- Mỗi cột chứa đúng ngôi sao
- Mỗi khu vực chứa đúng ngôi sao
-
Một ngôi sao không nằm cạnh bất kỳ ngôi sao nào khác
Điều kiện này được mô tả lại như sau, nếu ô được điền ngôi sao thì tất cả các ô kề ô không được điền ngôi sao
Tuyến tính hóa điều kiện trên bằng phương pháp hình học ta thu được điều kiện dưới đây và đó chính là điều kiện sử dụng trong mô hình
2.3. Hàm mục tiêu
Bài toán này không có hàm mục tiêu, bởi vì ta không cần tối thiểu hóa hay tối đa hóa gì cả, việc cần làm chỉ là tìm ra một nghiệm chấp nhận được. Về mặt kỹ thuật, khi lập trình ta có thể để hàm mục tiêu là một hằng số (mình hay chọn số 0).
3. Kết luận
Tham khảo thêm các câu đố Star Battle và biến thể tại Krazydad. Code mô hình hóa Star Battle bằng python có tại Tung-hehe.
Happy modeling!


