n-place mastermind变异算法

时间:2016-06-09 18:53:51

标签: algorithm probability

几天前,我在大学举办的比赛中遇到了这样一个问题:

  

鉴于使用数字而在主脑游戏中猜测的历史   对(x,y)形式的颜色,其中x是猜测,y是如何   正确放置了许多数字,猜出正确的数字。每   输入保证有解决方案。

     

5场比赛的例子:

     

(90342,2)
   (70794,0)
  (39458,2)
  (34109,1)
   (51545,2)
  (12531,1)

     

应该屈服:

     

39542

     

创建一个算法以正确猜测n位的结果   主脑给出了历史。

所以我唯一的想法是根据给定猜测中的正确镜头保持每个数字的概率正确,然后尝试生成最可能的数字,然后是下一个数字,依此类推 - 例如我们第一个位置有9%可能是40%(因为第一次猜测有2/5 = 40%正确),7是不可能的等等。然后我们对数字中的其他位置执行相同的操作,最后生成一个具有最高概率的数字,以便根据所有猜测对其进行测试。

这种方法的问题是,生成下一个可能的数字,然后生成下一个,等等(因为我们可能不会在第一次尝试中获得本垒打)真的是非平凡的(或者在至少我没有看到一种简单的方法来实现这一点)并且由于这次比赛有一个类似90分钟的时间框架,这不是唯一的问题,我认为没有这么详细的预期方法。

那么怎么能更容易呢?

2 个答案:

答案 0 :(得分:0)

概率不适用于此处。在这种情况下,数字是对还是错。没有"部分正确"。

对于5位数字,您可以根据给定的历史记录测试所有100,000个可能的数字,并抛弃匹配不正确的数字。在某些方面,这种方法对于较大的数字变得不切实际。您将看到符合条件的数字列表。如果列表中只有一个,那么你已经解决了它。

python代码,其中matches计算其2个参数的匹配数字:

for k in range(0,100000):
    if matches(k,90342)==2 and matches(k,70794)==0 and matches(k,39458)==2 and matches(k,34109)==1 and matches(k,51545)==2 and matches(k,12531):
        print k

打印:

39542

答案 1 :(得分:0)

我想到的一种方法是编写一个例程,该例程通常可以根据特定的 try 及其得分来过滤组合的枚举。

因此,对于您的示例,您最初会选择一个受限最多的尝试(其中一个得分为2的那个)作为过滤器,然后枚举满足它的所有组合。

然后,该枚举的输出将用作下一个未处理的 try 的过滤器运行的输入,依此类推,直到尝试的列表用完为止。

最终枚举中出现的候选人尝试就是解决方案。

相关问题