Bir sorunu kodlamak için çözücü bir SAT kullanıyorum ve SAT örneğinin bir parçası olarak, ben boolean değişkenler var bu tam olarak bir gerçek olması gerektiğini amaçlanan ve nerede dinlenme gerektiği yanlış ol. (Bunu bazen "sıcak" bir kodlama olarak tanımlandığını gördüm.)
SAT'da "tam olarak doğru olması gerekir " kısıtlamasını kodlamak istiyorum . SAT çözücüsünü olabildiğince verimli bir şekilde çalıştırmak için bu kısıtlamayı kodlamanın en iyi yolu nedir?
Bu kısıtlamayı kodlamanın birçok yolunu görebiliyorum:
İkili kısıtlamalar. Ben İkili kısıtlamaları ekleyebilirsiniz herkes için i , j en çok bir sağlamak için x i doğrudur ve ardından eklemek x 1 ∨ x 2 ∨ ⋯ ∨ x n en az biri doğru olduğundan emin olmak için.
Bu, cümlecikleri ekler ve fazladan boole değişkeni içermez.
İkili kodlama. Ben tanıtmak olabilir yeni boole değişkenler i 1 , i 2 , ... , i lg n (ikilik sistemde) bir tamsayı temsil etmek i öyle ki 1 ≤ i ≤ n (emin olmak için bir kaç boolean sınırlamalar ekleyerek i istenilen aralığındadır ). Sonra, x i'nin ağaç ve tüm diğer x j'lerin yanlış olduğunu zorlayan kısıtlamalar ekleyebilirim . Başka bir deyişle, her biri için j , biz hükümler olduğunu zorlama eklemek i = j .
Bu, cümleleri ekler ve kaç tane ekstra boole değişkeni bilmiyorum.
Gerçek değerlerin sayısını sayın. Boole toplayıcı devreler bir ağaç uygulanması ve gerektirir ki , her bir tedavi x i , 0 ya da bunun yerine sahte ya da gerçek bir 1 ve Tseitin SAT devre dönüşümünü kullanımı maddeleri. Bir yarı toplayıcılar ağacı yeterlidir: her yarı toplayıcının taşıma çıktısını 0 olacak şekilde sınırlandırın ve ağaçtaki son yarı toplayıcının son çıktısını 1 olacak şekilde sınırlandırın. Ağaç herhangi bir şekilde seçilebilir ( dengeli ikili ağaç veya dengesiz veya her neyse).
Bu, kapılarında yapılabilir ve böylece Θ ( n ) cümleleri ve Θ ( n ) yeni boolean değişkenleri ekler .
Bu yaklaşımın özel bir örneği, boole değişkenlerini , y i'nin x 1 ∨ x 2 ∨ ⋯ ∨ x i değerini içermesi gerektiği düşüncesiyle ortaya koymaktır . Bu hedef maddeleri ekleyerek zorunlu olabilir y i ∨ ¬ x i , y i ∨ ¬ y i - 1 ve ¬ y i ∨ x i ∨ y ı - (biz tedavi y 0 için yanlış ile eşanlamlı olarak)i=1,...,n. Daha sonra,i=1,2,…,n-1için¬ y i ∨¬ x i + 1 kısıtlamalarını ekleyebiliriz. Bu, temel olarak, ağacın maksimum dengesiz bir şekle sahip olduğu, yarım katlı bir ağacın Tseitin dönüşümüne eşittir.
Kelebek ağı N bitler üzerinde bir kelebek ağı kurabilir , n- bit girişini 000 ⋯ 01 olacak şekilde sınırlayabilir, n- bit çıkışını x 1 x 2 ⋯ x n olacak şekilde sınırlayabilir ve her 2-bit kelebek geçidini bağımsız bir kapı olarak ele alabilirim bu, sınırsız bırakılan yeni ve yeni bir boolean değişkeni temel alan kararını vererek ya takas eder ya da girişini değiştirmez. Daha sonra, devreyi SAT yan tümcelerine dönüştürmek için Tseitin dönüşümünü uygulayabilirim.
Bu, kapıları gerektirir ve böylece Θ ( n lg n ) cümleleri ve Θ ( n lg n ) yeni boolean değişkenleri ekler .
Gözden kaçtığım başka yöntemler var mı? Hangisini kullanmalıyım? Bunu test eden ya da deneysel olarak deneyen biri var mı ya da bunlardan herhangi biriyle deneyimi olan var mı? Cümlelerin sayısı ve / veya yeni boole değişkenlerinin sayısı, bunun SAT çözücü performansı üzerindeki etkisini tahmin etmek için iyi bir stand-in ölçütü mü, yoksa değilse, hangi metriği kullanırsınız?
Sadece fark bu yanıt , yani SAT için önem düzeyi kısıtlamaları uygulayan tam olarak bu kısıtlamayı zorunlu kılma ile ilgili bazı referanslar vardır dışına n değişkenleri doğrudur. Bu yüzden benim sorum k = 1 olan özel bir durumdan kaynaklanıyor . Belki de kardinalite kısıtlamaları hakkındaki literatür sorumu aydınlatmaya yardımcı olacaktır.