Binox là một câu đố logic được mô tả như sau, cho một lưới các ô vuông với một số ô đã được điền sẵn X hoặc O.
Người chơi cần hoàn thiện lưới bằng cách điền vào những ô trống X hoặc O thỏa mãn:
Lưới được phủ kín bởi X và O
Trên mỗi hàng/cột không tồn tại chuỗi lớn hơn 2 ô liên tiếp được điền giống nhau
Trên mỗi hàng/cột số lượng X bằng số lượng O
Mỗi hàng/cột là duy nhất (Không có 2 hàng nào giống nhau, không có 2 cột nào giống nhau)
Dưới đây là ví dụ cho một câu đố Binox cỡ 6×6 và lời giải
Mỗi hàng là duy nhất. Để tuyến tính ràng buộc này ta diễn đạt lại như sau, với 2 hàng i,j bất
kỳ, tồn tại ít nhất một vị trí k sao cho x(i,k)=x(j,k) .
Với 2 hàng i=j bất kỳ, và mỗi cột k, xây dựng biến trung gian y(i,j,k) thỏa mãn
y(i,j,k)={10neˆˊu x(i,k)=x(j,k)ngược lại
Sử dụng phương pháp hình học
ta có thể biểu diễn được mối quan hệ giữa biến y và các biến x như sau
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).
Điểm nhấn của câu đố này nằm ở điều kiện hàng/cột duy nhất, trên thực tế những điều kiện dạng này
thường rất khó mô hình hóa một cách hiệu quả. Thử tưởng tượng chúng ta có số lượng
hàng/cột lên đến 1000 khi đó số điều kiện sẽ là một con số rất lớn, trong trường hợp đó ta phải
tìm ra những cách khác để giải quyết bài toán một cách hiệu quả.
Tham khảo thêm các câu đố Binox và biến thể tại Krazydad.
Code mô hình hóa Binox bằng python có tại Tung-hehe