猜猜-谁最佳算法(guess who questions)

我正在制作一个程序,模仿猜测谁的游戏,在这个游戏中,为了确定谁是秘密的人,会提出问题。

我正在制作一个程序,模仿猜测谁的游戏,在这个游戏中,为了确定谁是秘密的人,会提出问题。

我只是停留在如何分类我的问题的方式,这将是最有效的,人物有 6 个不同的属性,衬衫,头发,眼睛,微笑,头发,眼镜。

enter image description here

我已经写了一个程序,但我的决策树是如此低效,它问了大约 10-30 个问题。

如果有帮助,我会提供我的老树来告诉你我在说什么,但我会根据你们的想法做一个新的。

if (g.hairIsColor(Color.BROWN) && g.eyeIsColor(Color.HAZEL) &&
    g.isSmiling() && g.shirtIsColor(Color.GREEN) &&
    g.isWearingGl())
    a = "Emily";
if (g.hairIsColor(Color.BROWN) && g.shirtIsColor(Color.GREEN)) {
    if (g.eyeIsColor(Color.BLUE))
        a = "Alice";
    else if (g.eyeIsColor(Color.GREEN))
        a = "Frank";
    else if (g.eyeIsColor(Color.BROWN) && g.isWearingGl())
        a = "Bob";
    else if (g.eyeIsColor(Color.BROWN))
        a = "Dave"; // this might be an error for other brown hair
    else
        a = "Isabelle";
}
// NULL IT WAS EMILY FALSE
else if (g.hairIsColor(Color.BROWN) && g.shirtIsColor(Color.RED)) {
    if (g.eyeIsColor(Color.GREEN))
        a = "Philip";
    else if (g.eyeIsColor(Color.BLUE) && !g.isSmiling())
        a = "Wendy";
    else if (g.eyeIsColor(Color.BLUE) && g.isWearingGl()) 
        a = "Mallie";
    else if (g.eyeIsColor(Color.BLUE))
        a = "Nick";
    else if (g.eyeIsColor(Color.BROWN) && g.isWearingHat())
        a = "Robert";
    else if (g.eyeIsColor(Color.BROWN) && g.isSmiling())
        a = "Quinn";
}
else if (g.hairIsColor(Color.BLACK) && g.shirtIsColor(Color.BLUE)) {
    if (!g.isSmiling())
        a = "Carol";
    else if (g.isWearingHat())
        a = "Gertrude";
    else
        a = "Olivia";
}
else if (g.hairIsColor(Color.BROWN) && g.eyeIsColor(Color.BLUE))
    a = "Tucker";
else if (g.hairIsColor(Color.BROWN) && g.eyeIsColor(Color.BROWN))
    a = "Zander";
else if (g.hairIsColor(Color.BLOND) && g.shirtIsColor(Color.RED))
    a = "Henry";
else if (g.hairIsColor(Color.BLOND) && g.shirtIsColor(Color.BLUE))
    a = "Jack";
else if (g.hairIsColor(Color.BLACK) && g.eyeIsColor(Color.HAZEL))
    a = "Karen";
else if (g.hairIsColor(Color.BLACK) && g.isWearingHat())
    a = "Xavier";
else if (g.hairIsColor(Color.BLACK))
    a = "Ursula";
else if (g.hairIsColor(Color.RED) && g.shirtIsColor(Color.GREEN))
    a = "Yasmine";
else if (g.eyeIsColor(Color.BLUE))
    a = "Larry";
else if (g.isWearingHat())
    a = "Sarah";
else if (g.isSmiling())
    a = "Victor";
return a;
2

这是一个概率问题:使用二进制问题解决问题

回答问题的最有效方法是问一个最接近 50 % / 50 % 概率的问题。例如,如果有一半的女孩和一半的男人在统计上问“是男人吗?”是更好的选择。

因此,您可能需要每个问题来测试所有可能的问题,并找到与其余人最接近 50 / 50 的问题。

I've found a good article that might help you
0

从这张图中并不完全清楚你是如何提问和获取数据的。你主要是在展示哪些条件必须是真实的,而不是你用来确定这些值的过程。

一个解决方案可能是检查每个问题后的剩余答案,看看哪个变量最有可能是真的,并询问它是否为真。例如,在初始设置大小中,问“这个人在微笑吗?”如果它是真的,将消除四个选择,但如果它不是真的,可能会消除更多。另一种方法可能是检查哪个答案可能是当前数据集的一半,例如“你戴着眼镜的人”通常会消除一半的答案。

0

可以做的是在源代码中映射你的表。有很多方法可以做到这一点。我将使用一个简单的对象数组

首先我们定义一个数据结构

Object[] person = new Object {"Alice", Color.BROWN, Color.GREEN, Color.BLUE, Boolean.TRUE, Boolean.TRUE, Boolean.FAlSE};

我们看到在每个索引下,我们表示 Alice 0 的一些属性-名称 1-头发 2-衬衫 3-眼睛 4-眼镜 5-微笑 6-帽子

如果我们坚持这个顺序,我们只能将人的价值与我们猜测的价值进行比较。

Object[] guess = Object[] {Color.BROWN, COLOR.RED, Color.HAZE, Boolean.TRUE, Boolean.TRUE.Boolean.TRUE};

因此,我们应该做的是创建我们的模型,在其中添加人员。

  List<Object[]> model = createModel(); //This method add preson into list
  for(Object[] person: model) {
     for(int i = 1; i < person.length; i++) {
          if(person[i].equals[gues[i]) {
            //We share some attributes 
            if(i == person.length -1) {
              return person[0]; //We report the name 
            }
         }  else {
            break; /We break and go to another person from model. 
         }
     }
  }

在下一阶段,您可以用适当的类实现替换对象数组。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(699)
React.js:如何在不同的端口上启动反应应用程序
上一篇
在 Javascript中从字符串生成哈希
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(63条)