Algorithm 说谎者说真话问题中说谎者上界和下界的求解

Algorithm 说谎者说真话问题中说谎者上界和下界的求解,algorithm,Algorithm,我正试图解决一个说真话/说谎的问题。对一个班级进行了调查。答案以矩阵a的形式给出,其中a[i][j]表示第i个学生对第j个学生的回答。如果这个角色是“L”-这意味着他/她是一个骗子;如果是“T”-那么这意味着,这个学生是一个讲真话的人 真理演说者(“T”):他/她的回答都是真实的。 撒谎者('L'):(S)他至少做了一次错误的回答 例1 类包含至少3个说谎者,最多4个说谎者,3是说谎者的下界,4是上界 例2 类至少包含4个说谎者,最多包含4个说谎者 我不知道下限和上限是如何找到的,如果有任何帮助

我正试图解决一个说真话/说谎的问题。对一个班级进行了调查。答案以矩阵a的形式给出,其中a[i][j]表示第i个学生对第j个学生的回答。如果这个角色是“L”-这意味着他/她是一个骗子;如果是“T”-那么这意味着,这个学生是一个讲真话的人

真理演说者(“T”):他/她的回答都是真实的。 撒谎者('L'):(S)他至少做了一次错误的回答

例1

类包含至少3个说谎者,最多4个说谎者,3是说谎者的下界,4是上界

例2

类至少包含4个说谎者,最多包含4个说谎者


我不知道下限和上限是如何找到的,如果有任何帮助,我们将不胜感激

对于您给出的示例,您只需遵循逻辑,并通过假设某个特定的人是T来了解接下来的内容。通常,您可以设置一个混合整数规划问题

如果人i是L,则设x_i=1,如果人i是T,则设x_i=0。然后从每个人的陈述中创建一个线性函数。例如,从TLT创建:

f_1 = (x_1) + (1-x_2) + (x_3) + (1-x_4) + (x_5)
你可以看到图案。对于任何可行的赋值(即,x变量的设置,其中x值和人们的陈述之间不存在矛盾),当且仅当f_1=0时,x_1=0;当且仅当f_1>0时,x_1=1;或者,由于一切都是整数,f_1>=1。这相当于f_i>=x_i和f_i=x_i
f_i对于你给出的例子,你可以按照逻辑,看看假设一个特定的人是T会发生什么。一般来说,你可以设置一个混合整数规划问题

如果人i是L,则设x_i=1,如果人i是T,则设x_i=0。然后从每个人的陈述中创建一个线性函数。例如,从TLT创建:

f_1 = (x_1) + (1-x_2) + (x_3) + (1-x_4) + (x_5)
你可以看到图案。对于任何可行的赋值(即,x变量的设置,其中x值和人们的陈述之间不存在矛盾),当且仅当f_1=0时,x_1=0;当且仅当f_1>0时,x_1=1;或者,由于一切都是整数,f_1>=1。这相当于f_i>=x_i和f_i=x_i
第一个例子:

  • 所有4名学生只说他们说的是实话,其余的都在撒谎
  • 据我们所知,他们可能都在撒谎,所以上限是4
  • 对于下限,我们可以假设1是真实的,这在逻辑上是有意义的。如果我们试图说不止一个是真的 这是不可能的,因为学生们会说彼此都是 说谎-因此下限为3
对于第二个示例,需要更多的逻辑来理解:

  • 第四个学生说他在说谎——这意味着他一定在说谎,他关于其他四个学生说谎的说法中至少有一个是谎言(他说谎的说法显然是正确的)——这意味着至少有一个学生没有说谎,因此上界变为4,下界变为1
  • 学生2说他们都是真的——我们刚刚证明是错的,所以他一定是在撒谎
  • 这给我们留下了学生1、3和5,他们都说学生3说的是实话。既然我们知道至少有一个学生在说真话,那么第三个学生肯定在说真话(因为他们都这么说)
  • 然后,从学生3所说的,我们知道其余的人都在撒谎,所以上面的=下面的=4个说谎者

    • 第一个例子:

      • 所有4名学生只说他们说的是实话,其余的都在撒谎
      • 据我们所知,他们可能都在撒谎,所以上限是4
      • 对于下限,我们可以假设1是真实的,这在逻辑上是有意义的。如果我们试图说不止一个是真的 这是不可能的,因为学生们会说彼此都是 说谎-因此下限为3
      对于第二个示例,需要更多的逻辑来理解:

      • 第四个学生说他在说谎——这意味着他一定在说谎,他关于其他四个学生说谎的说法中至少有一个是谎言(他说谎的说法显然是正确的)——这意味着至少有一个学生没有说谎,因此上界变为4,下界变为1
      • 学生2说他们都是真的——我们刚刚证明是错的,所以他一定是在撒谎
      • 这给我们留下了学生1、3和5,他们都说学生3说的是实话。既然我们知道至少有一个学生在说真话,那么第三个学生肯定在说真话(因为他们都这么说)
      • 然后,从学生3所说的,我们知道其余的人都在撒谎,所以上面的=下面的=4个说谎者

      我不知道你所说的最小化和最大化和x_I是什么意思,也不知道f_I的所有情况都是0,因为在你写的线性方程中,每当它是L(1-xi)时。很抱歉,如果这是一个糟糕的问题,我很难理解。还有,你会用什么语言来编程?如果所有的f_i都是0,那么所有的x_i都必须是0(这是所有i的一个约束条件),这意味着每个人都是T,这可能不是一个可行的解决方案。x_i和f_i手拉手移动的事实,也就是说,如果x_i是1,那么约束f_i>=x_i迫使f_i是1,这意味着f_i中至少有一个术语是1,这意味着与我所声称的人有分歧。这很好,因为这正是x_i=1的意思。你也可以提出相反的观点:如果x_i=0,那么因为f_iAs对于使用什么编程语言。。。有专门的库来解决MILP问题。一些商业(尽管免费供学术使用),如CPLEX、Gurobi、XPress,一些开源软件如glpk、cbc。Matlab中也有一个解算器。三个商业类都有API(C、C++、java、python),它们是
      f_1 = (x_1) + (1-x_2) + (x_3) + (1-x_4) + (x_5)
      
      For all i=1,...,N
          f_i>=x_i
          f_i<=(N+1)x_i
          x_i is 0 or 1