Thể hiện các phép toán logic boolean trong lập trình tuyến tính số nguyên không (ILP)


58

Tôi có một chương trình tuyến tính số nguyên (ILP) với một số biến được dùng để biểu diễn các giá trị boolean. Các bị ràng buộc là số nguyên và giữ 0 hoặc 1 ( ).xixi0xi1

Tôi muốn thể hiện các phép toán boolean trên các biến có giá trị 0/1 này, sử dụng các ràng buộc tuyến tính. Tôi có thể làm cái này như thế nào?

Cụ thể hơn, tôi muốn đặt (boolean AND), (boolean OR) và (boolean KHÔNG). Tôi đang sử dụng cách giải thích rõ ràng về 0/1 là các giá trị Boolean: 0 = false, 1 = true. Làm cách nào để viết các ràng buộc ILP để đảm bảo rằng các có liên quan đến các như mong muốn?y1=x1x2y2=x1x2y3=¬x1yixi

(Điều này có thể được xem là yêu cầu giảm từ CircuitSAT sang ILP hoặc yêu cầu cách thể hiện SAT dưới dạng ILP, nhưng ở đây tôi muốn xem một cách rõ ràng để mã hóa các hoạt động logic được hiển thị ở trên.)

Câu trả lời:


66

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?)y1x1+x21y1x1y1x20y11y1

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.y2x1+x2y2x1y2x20y21y2

Logic KHÔNG: Sử dụng .y3=1x1

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=(x1x2)y4=¬x1x2y41x1+x2y41x1y4x20y41y4

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).x1x2x1x2x1x2

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=x1x2x1x2y5x1+x2y5x1x2y5x2x1y52x1x20y51y5


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=1x0y=0x=00xU0y1yxxUyx|x|UUxUU. Đ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ếuxx0t0y1yxt=xytnx1,,xnyi=1xi1 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,,tn0yi1yixiti=xiyit1++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 .


bộ giải lập trình tuyến tính nào có thể giải quyết điều này? bởi vì một trong các định dạng * .lp hoặc * .mps của một ràng buộc phải là một số nguyên cố định và không phải là một biến.
boxi

4
@boxi, tôi không biết gì về định dạng * .lp hoặc * .mps, nhưng mọi người giải quyết lập trình tuyến tính số nguyên đều có thể giải quyết điều này. Lưu ý rằng nếu bạn có một cái gì đó như , thì điều này tương đương với , có thể ở định dạng bạn muốn. xyyx0
DW

-tôi kiểm tra lại. lp_solve có thể giải quyết nó, nhưng ví dụ qsopt thì không thể. tôi không biết tại sao. nhưng cảm ơn <3
boxi

@boxi, tôi vừa kiểm tra GUI applet trực tuyến QSopt và nó có thể xử lý các loại ràng buộc này khi tôi thay đổi thành , vì vậy tôi không chắc điều gì đang xảy ra. (Tôi đã sử dụng định dạng * .lp.) Tôi sẽ ngạc nhiên nếu bất kỳ người giải ILP nào không thể xử lý các hệ thống này. Nếu bạn có thêm câu hỏi về QSopt, có lẽ bạn nên đưa chúng đến các diễn đàn hỗ trợ của QSopt. xyxy0
DW

1
@Pramod, bắt tốt! Cảm ơn bạn đã phát hiện ra lỗi đó. Bạn hoàn toàn đúng. Tôi đã hỏi một câu hỏi mới về cách mô hình hóa trường hợp đó và tôi sẽ cập nhật câu trả lời này khi chúng tôi nhận được câu trả lời cho câu hỏi đó.
DW

19

Mối quan hệ AND logic có thể được mô hình hóa trong một ràng buộc phạm vi thay vì ba ràng buộc (như trong giải pháp khác). Vì vậy, thay vì ba ràng buộc có thể được viết bằng cách sử dụng ràng buộc phạm vi đơn Tương tự, đối với logic HOẶC:

y1x1+x21,y1x1,y1x2,
0x1+x22y11.
02y1x1x21.

Đối với KHÔNG, không có cải tiến như vậy có sẵn.

Nói chung cho ( -way VÀ), ràng buộc sẽ là: Tương tự cho OR: y=x1x2xnn

0xinyn1.
0nyxin1.

Một cách tiếp cận rất simillar có trong bài báo này: ncbi.nlm.nih.gov/pmc/articles/PMC1865583
Abdelmonem Mahmoud Amer

3

Tôi tìm thấy giải pháp ngắn hơn cho XOR y = x1⊕x2 (x và y là nhị phân 0, 1)

chỉ một dòng: x1 + x2 - 2 * z = y (z là số nguyên bất kỳ)


Để thể hiện sự bình đẳng trong ILP, bạn cần hai bất đẳng thức. Hơn nữa, để tránh giải pháp , bạn cần thêm hai bất đẳng thức nữa, . Vì vậy, câu trả lời này có bốn bất đẳng thức và một biến phụ so với sáu bất đẳng thức trong câu trả lời của DW. x1=1,x2=0,z=200,y=1990y1
JiK

Để biểu thị một đẳng thức trong ILP chỉ cần một phương trình, điều này đúng trong cả lý thuyết LP và trong phần mềm như Gurobi hoặc CPLEX. @jIk, tôi đoán bạn có nghĩa là "diễn đạt" a "cần hai bất đẳng thức."b
màu trắng xanh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.