문제를 인코딩하기 위해 SAT 솔버를 사용하고 있으며 SAT 인스턴스의 일부로 부울 변수 있는데 그중 하나가 참이고 나머지는 거짓이어야합니다. . (이것은 때때로 "one-hot"인코딩으로 묘사되는 것을 보았습니다.)
SAT 에서 제약 조건을 " 중 정확히 하나 여야합니다 "를 인코딩하려고 합니다. SAT 솔버를 최대한 효율적으로 실행하려면이 제약 조건을 인코딩하는 가장 좋은 방법은 무엇입니까?
이 제약 조건을 인코딩하는 여러 가지 방법을 볼 수 있습니다.
쌍 제한. 모든 에 대해 페어 단위 제약 조건 를 추가 하여 최대 하나의 x_i 가 true 인지 확인한 다음 x_1 \ lor x_2 \ lor \ cdots \ lor x_n 을 추가하여 하나 이상이 true인지 확인할 수 있습니다. . i , j x i x 1 ∨ x 2 ∨ ⋯ ∨ x n
이는 추가 조항 및 별도 부울 변수.
이진 인코딩. 내가 소개 할 수 새 부울 변수는 (이진) 정수를 표현하기 위해 있도록 (몇 부울 제약 조건을 추가 보장하기 위해 그 원하는 범위에 있습니다). 그런 다음 가 tree이고 다른 모든 가 false 임을 강제하는 제약 조건을 추가 할 수 있습니다 . 즉, 각 j 에 대해 i = j \ Leftrightarrow x_j를 적용하는 절을 추가합니다 .
이것은 절을 추가하고 몇 개의 추가 부울 변수를 모릅니다.
참값의 수를 세십시오. 부울 가산기 회로 트리를 구현하고 을 요구하여 각 를 false 또는 true 대신 0 또는 1로 처리 하고 Tseitin 변환을 사용하여 회로를 SAT 절로 변환 할 수 있습니다. 반가산기 트리는 다음과 같이 충분합니다. 각 반가산기의 캐리 출력을 0으로 제한하고 트리에서 최종 반가산기의 최종 출력을 1로 제한합니다. 트리는 임의의 모양을 갖도록 선택할 수 있습니다 ( 균형 이진 트리 또는 불균형 등).
이는 게이트 에서 수행 할 수 있으므로 절과 새 부울 변수를 추가합니다.
이 방법의 특별한 경우는 부울 변수 y_1, \ dots, y_n 을 도입 하는 것입니다. 는 x_1 \ lor x_2 \ lor \ cdots \ lor x_i 의 값을 포함해야 한다는 생각과 함께 부울 변수 y_1, \ dots, y_n 을 도입 합니다 . 이 의도는 , 및 \ neg y_i \ lor x_i \ lor y_ {i-1} 절을 추가하여 시행 할 수 있습니다 (여기서 은 i = 1, \ dots, n의 경우 false와 동의어입니다 . 다음으로, i = 1,2, \ dots, n-1에 대해 \ neg y_i \ lor \ neg x_ {i + 1} 제한을 추가 할 수 있습니다 . 이것은 기본적으로 반가산기 트리의 Tseitin 변환과 동일하며, 트리는 최대 불균형 모양을 갖습니다.
나비 네트워크. 비트 에 버터 플라이 네트워크 를 구축 하고 비트 입력을 으로 제한하고 비트 출력을 으로 제한하고 각 2 비트 버터 플라이 게이트를 독립 게이트로 취급 할 수 있습니다 제약되지 않은 새 부울 변수를 기반으로 수행 할 결정으로 입력을 교체하거나 교체하지 않습니다. 그런 다음 회로를 SAT 절로 변환하기 위해 Tseitin 변환을 적용 할 수 있습니다.n 000 ⋯ 01 n x 1 x 2 ⋯ x n
여기에는 게이트가 필요하므로 절과 새 부울 변수가 추가됩니다.
내가 간과 한 다른 방법이 있습니까? 어느 것을 사용해야합니까? 누구든지 이것을 테스트하거나 실험적으로 시험해 보았습니까? 아니면 경험이 있습니까? SAT 솔버 성능에 미치는 영향을 추정하기위한 절 수 및 / 또는 새로운 부울 변수 수는 좋은 독립형 지표입니까, 그렇지 않은 경우 어떤 지표를 사용 하시겠습니까?
나는 이 답변 에 SAT에 대한 카디널리티 제약 조건을 시행하는 것에 대한 참조가 있음을 알았습니다 . 즉, 변수 중 정확히 개가 참 이라는 제약 조건을 시행하는 것입니다 . 그래서 제 질문은 특별한 경우에 해당 합니다. 카디널리티 제약에 관한 문헌이 내 질문에 빛을 발하는 데 도움이 될 것입니다.n k = 1