Logic VÀ: Sử dụng các ràng buộc tuyến tính , , , , trong đó bị ràng buộc là một số nguyên. Điều này thực thi các mối quan hệ mong muốn. (Khá gọn gàng mà bạn có thể làm điều đó chỉ với bất đẳng thức tuyến tính , phải không?)y1≥x1+x2−1y1≤x1y1≤x20≤y1≤1y1
Logic OR: Sử dụng các ràng buộc tuyến tính , , , , trong đó bị ràng buộc là một số nguyên.y2≤x1+x2y2≥x1y2≥x20≤y2≤1y2
Logic KHÔNG: Sử dụng .y3=1−x1
Hàm ý logic: Để diễn tả (nghĩa là ), chúng ta có thể điều chỉnh cấu trúc cho logic OR. Cụ thể, sử dụng các ràng buộc tuyến tính , , , , trong đó bị ràng buộc là một số nguyên.y4=(x1⇒x2)y4=¬x1∨x2y4≤1−x1+x2y4≥1−x1y4≥x20≤y4≤1y4
Hàm ý logic bắt buộc: Để thể hiện rằng phải giữ, chỉ cần sử dụng ràng buộc tuyến tính (giả sử rằng và đã bị ràng buộc với các giá trị boolean).x1⇒x2x1≤x2x1x2
XOR: Để thể hiện (độc quyền hoặc của và ), hãy sử dụng bất đẳng thức tuyến tính , , , , , trong đó bị ràng buộc là một số nguyên.y5=x1⊕x2x1x2y5≤x1+x2y5≥x1−x2y5≥x2−x1y5≤2−x1−x20≤y5≤1y5
Và, như một phần thưởng, một kỹ thuật nữa thường giúp ích khi hình thành các vấn đề có chứa hỗn hợp các biến số không (boolean) và biến số nguyên:
Truyền sang boolean (phiên bản 1): Giả sử bạn có một biến số nguyên và bạn muốn xác định sao cho nếu và nếu . Nếu bạn cũng biết rằng , thì bạn có thể sử dụng các bất đẳng thức tuyến tính , , ; tuy nhiên, điều này chỉ hoạt động nếu bạn biết giới hạn trên và dưới trên . Hoặc, nếu bạn biết rằng (nghĩa là, ) cho một số không đổi , sau đó bạn có thể sử dụng phương pháp được mô tả ở đâyxyy=1x≠0y=0x=00≤x≤U0≤y≤1y≤xx≤Uyx|x|≤U−U≤x≤UU. Điều này chỉ áp dụng nếu bạn biết giới hạn trên của.|x|
Truyền tới boolean (phiên bản 2): Chúng ta hãy xem xét cùng một mục tiêu, nhưng bây giờ chúng ta không biết giới hạn trên của . Tuy nhiên, giả sử chúng ta biết rằng . Đây là cách bạn có thể thể hiện ràng buộc đó trong một hệ thống tuyến tính. Đầu tiên, giới thiệu một biến số nguyên mới . Thêm bất đẳng thức , , . Sau đó, chọn hàm mục tiêu để bạn giảm thiểu . Điều này chỉ hoạt động nếu bạn chưa có chức năng khách quan. Nếu bạn có biến số nguyên không âm và bạn muốn truyền tất cả chúng thành booleans, sao cho nếuxx≥0t0≤y≤1y≤xt=x−ytnx1,…,xnyi=1xi≥1 và nếu , sau đó bạn có thể giới thiệu biến với bất đẳng thức , , và xác định hàm mục tiêu để giảm thiểu . Một lần nữa, điều này chỉ hoạt động không có gì khác cần xác định hàm mục tiêu (nếu, ngoài các phôi thành boolean, bạn đã dự định chỉ kiểm tra tính khả thi của ILP kết quả, không cố gắng tối thiểu hóa / tối đa hóa một số chức năng của các biến).yi=0xi=0nt1,…,tn0≤yi≤1yi≤xiti=xi−yit1+⋯+tn
Đối với một số vấn đề thực tiễn xuất sắc và ví dụ hoạt động, tôi khuyên bạn nên xây dựng Chương trình tuyến tính số nguyên: Phòng trưng bày của Rogues .