2
SAT求解器的n分之一编码
我正在使用SAT解算器对问题进行编码,作为SAT实例的一部分,我具有布尔变量,其中这些变量中的一个应该为true,其余的应该为false 。(我有时将其描述为“一次性”编码。)X1个,X2,… ,xñx1,x2,…,xnx_1,x_2,\dots,x_n 我想在SAT中编码约束“一个必须为true”。编码此约束以使SAT求解器尽可能高效运行的最佳方法是什么?X1个,… ,xñx1,…,xnx_1,\dots,x_n 我可以看到许多方法来编码此约束: 成对约束。我可以为所有添加成对约束以确保至多一个为true,然后添加以确保至少一个为true 。我,Ĵ X 我X 1 ∨ X 2 ∨ ⋯ ∨ X Ѭ X一世∨ ¬ XĴ¬xi∨¬xj\neg x_i \lor \neg x_j我,Ĵi,ji,jX一世xix_iX1个∨ X2∨ ⋯ ∨ Xñx1∨x2∨⋯∨xnx_1 \lor x_2 \lor \cdots \lor x_n 这将添加子句,并且没有额外的布尔变量。Θ (n2)Θ(n2)\Theta(n^2) 二进制编码。 我可以引入新的布尔变量来表示(以二进制形式)一个整数,使得(添加一些布尔约束以确保在所需范围内)。然后,我可以添加一些约束来强制是tree,而所有其他都是false。换句话说,对于每个,我们添加强制执行子句。我1,我2,... ,我LG的Ñ我1 ≤ 我≤ Ñ 我X 我X Ĵ Ĵ 我= Ĵ …