我已经处理这个问题好几天了,但仍然没有解决方案。让我通过一个简单的例子来解释它。
假设有一个长度为 8 的整数数组。每个单元格都可以取某些值。前 4 个单元格可以取 0 或 1,另一半可以取 0、1 或 2。这 3 个数组可以是一些示例。
{1,1,0,1,2,1,0,2}
{1,0,0,1,0,0,2,2}
{0,0,0,0,2,0,0,1}
但是,构造数组有一些限制,如下所示:
constraint1 = {0,0,-,-,-,-,-,-} // !(constraint1[0]==0 && constraint1[1]==0)
constraint2 = {-,1,0,-,-,-,-,-} // !(constraint2[1]==1 && constraint2[2]==0)
constraint3 = {-,-,-,-,1,1,-,0} // !(constraint3[4]==1 && constraint3[5]==1 && constraint3[7]==0)
为了更好地理解;
{0,1,0,2,0,1,0,0} // this is not valid, because it violates the constraint2
{0,0,2,2,1,1,0,1} // this is not valid, because it violates the constraint1
{1,1,1,0,0,1,0,0} // this is valid, because it violates none of the constraints
问题是我需要从这些约束中找到推断的 t 元组(t 长度)的数量。例如,假设调用了一个不违反任何约束的生成数组myArray
。如果你看constraint1
,它表示如果myArray[0]
是0,无论什么myArray[1]
都必须是1。因为myArray[1]
只能取0和1,如果它得到0,那就违反了constraint1
。因此;
myArray[0]=0 => myArray[1]=1
现在如果我们看constraint2
,它说如果myArray[1]
是 1 则myArray[2]
不能是 0。因为在我们的例子中我们已经选择了myArray[1]
1,myArray[2]
它将是 0。
myArray[1]=1 => myArray[2]=0
当这些含义结合在一起时,又形成了一个约束:
myArray[0]=0 => myArray[1]=1 => myArray[2]=0
myArray[0]=0 => myArray[2]=0 // new constraint
{2,-,0,-,-,-,-,-}
我想严格强调,这是一个非常简单的例子,只是为了说明问题。就我而言,数组的长度在 50-200 之间变化。数量限制可以是 0 到 500(甚至更多)之间的任何值。我还想强调,我所需要的只是推断约束的数量,无需找到它们。
以下是我尝试过的一些方法;
1) 找出至少有一个共同选项相同的约束选项的真值表。然后,查找所有 t 元组。原来,空间很大。
2)找到所有不违反mathematica约束的解决方案(可满足问题),然后查找缺少哪些t元组。它甚至找不到一种解决方案。
问题是,在这些方法中,我试图生成我不需要的整个空间。在不枚举整个空间的情况下找到 t 元组(约束)的数量是否有更好的想法?