解决说谎者真相出纳员问题中骗子的上限和下限

时间:2019-05-30 18:43:26

标签: algorithm

我正在尝试解决真相出纳员/骗子的问题。对班级进行了调查。答案采用矩阵A的形式,其中A [i] [j]表示第i个学生对第j个学生的回答。如果该字符为“ L”,则表示他/她是骗子;如果是“ T”,则表示该学生是讲真话的人。

说真实话的人(T):他/她的所有回答都是正确的。 骗子(“ L”):( S)他至少做出了一个错误的答复。

例如1

TLLL  

LTLL                                                                   

LLTL  

LLLT

类别包含至少3个和最多4个撒谎者,3是撒谎者的下限,而4是撒谎者的上限。

例如2

TLTLT 

TTTTT

LLTLL

LLLLL

TLTLT

班级至少包含4个骗子,最多4个骗子

我不确定如何找到上下限,任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

对于您给出的示例,您只需遵循逻辑,并假设一个特定的人为T即可看到结果。通常,您可以设置一个混合整数编程问题。

如果人i为L,则让x_i = 1,如果他为T,则使x_i = 0。然后根据每个人的语句创建线性函数。例如,从TLTLT创建:

f_1 = (x_1) + (1-x_2) + (x_3) + (1-x_4) + (x_5)

您可以看到图案。对于任何可行的赋值(即x变量和x值之间没有矛盾的x变量的设置),当且仅当f_1 = 0时,x_1 = 1;而当且仅当x_1 = 1时,x_1 = 1如果f_1> 0,或者由于所有都是整数,则f_1> = 1。这等效于f_i> = x_i和f_i <=(N + 1)x_i(其中N是人数)。现在您有了系统:

For all i=1,...,N
    f_i>=x_i
    f_i<=(N+1)x_i
    x_i is 0 or 1

该系统的每个可行解决方案都对应一个可行的分配,反之亦然。

有了这些约束,只需最小化和最大化sum x_i即可获得骗子数量的上限和下限。

答案 1 :(得分:0)

第一个示例:

  • 所有4名学生只说他们说的是实话,其余的都在撒谎
  • 他们可能都为我们所知道的撒谎-因此上限为4
  • 对于下限,我们可以假设1是在说真话,这在逻辑上是有意义的。如果我们试图说1以上为真 这是不可能的,因为学生会说彼此是 说谎-因此下界是3

对于第二个示例,需要更多的逻辑来找出:

  • 第四名学生说他在撒谎-这意味着他必须在撒谎,并且他对其他4名学生在撒谎的说法中至少有一个是谎言(声称他在撒谎显然是真实的)-这意味着至少有一个学生没有说谎,所以上限变成4,下限变成1
  • 学生2说他们都是真的-我们刚刚证明是错的,所以他一定是在撒谎
  • 这给我们留下了学生1,3和5,他们都说学生3在讲真话。既然我们知道至少有一个学生在讲真话-那么学生3必须在讲真话(因为他们都这么说)。
  • 然后根据学生3的说法,我们知道其余的都在撒谎-所以upper = lower = 4骗子