现有约束推断的无效元组数

2024-04-25 01:19:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经处理这个问题好几天了,但仍然没有解决办法。让我用一个简单的例子来解释。你知道吗

假设有一个长度为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-length)的个数。例如,假设生成的数组中没有违反任何约束的一个称为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元组(约束)的数量?你知道吗


Tags: the方法isit数组this例子元组