誰でも、#SATソルバーの実用的な実装をダウンロードできる1つ以上のWebサイトを指し示すことができますか?近似値ではなく、正確な解カウントを返すものに興味があります。
誰でも、#SATソルバーの実用的な実装をダウンロードできる1つ以上のWebサイトを指し示すことができますか?近似値ではなく、正確な解カウントを返すものに興味があります。
回答:
1つのオプションは、JavaBDDなどのBDDライブラリを使用することです。そのようなライブラリはすべて、ソリューションを高速にカウントする関数を持っているか、少なくともそのような関数を簡単に記述できるようにします。ただし、多くの場合、BDDの構築に時間がかかり、多くのメモリが必要になる可能性があるという欠点があります。
入力がCNFの場合、BDDの構築を高速化する単純な発見的方法は次のとおりです。最初に、各句の小さなBDDを構築し、ルートが最小のBDDである優先度キューに入れます。次に、2つのBDDをポップし、それらの間のANDを計算して、結果を優先度キューにプッシュします。コンピューティングので、サイズの二分決定グラフの間:ここでの考え方だとnはかかるO (M nは)理論ではなく、〜M + N実際には、ランタイムを最小限に抑えることがハフマン符号を見つけることと同じです。
関連トピック:最高のSATソルバー。
私が見つけた最高のものは「c2dコンパイラ」です。http://reasoning.cs.ucla.edu/c2d/
d-DNNFを使用し、-countオプションが必要です。
ここにあるMBoundソルバーhttp://www.cs.cornell.edu/~sabhar/は、確率的保証付きでモデルカウントを提供できます。すべてのソリューションを列挙するよりもはるかに高速です。
私は小さなモデル/プライム暗黙の列挙子を書きました。これは、既にモデル列挙を使用したモデルカウントに使用できますが、あまり実用的ではありません。誰かが興味を持っている場合は、それを拡張して、プライムインプリカントからのモデルをカウントできます。
グルコースは、ボルドー大学で開発された非常に効率的なSATソルバーです。