如何使用动态编程找到最大概率?

时间:2019-02-06 05:50:06

标签: algorithm probability

为更好地理解这个问题,您可以查看:-

1)https://math.stackexchange.com/questions/3100336/how-to-calculate-the-probability-in-this-case

约翰在与魔术师对战。在这场比赛中,他前面最初有'N'个相同的盒子,其中一个盒子里装有一个魔术药丸-吃完这药后,他就变得不朽了。

他必须确定哪个盒子里装有药丸。他最多只能执行'M'个动作。在每一步中,他都可以执行以下操作之一:

1)

随机选择一个在他前面的盒子,然后猜猜这个盒子里有药。如果猜想是正确的,则游戏结束并获得药丸。否则,经过这个猜想,魔术师以他无法确定添加了哪些盒子的方式在他前面添加了K个空盒子。他猜到的那个盒子也留在了他的前面,他也无法在随后的移动中将该盒子与其他盒子区分开。

2)选择一个数字X,使X为K的正数,但严格小于John前面的当前盒子数。魔术师然后删除X个空盒子。当然,如果当前的盒数≤K,则约翰绝不能执行此举。

如果约翰打得最好,他得到药丸的最大概率是多少? “ N”始终小于“ K”。

示例:-令M = 3,因此允许3个移动。 K = 20,N = 3。

John在他的第一步中选择了一个概率为x = 1/3的框,(已添加20个框(20 + 3 == 23),然后在第二步中,他再次选择了具有概率的框这次,y = 1/23 *(2/3)。这里的2/3表示第一步失败的概率。

第三步,他以z = 1/43 *(22/23)*(2/3)的概率做同样的事情。

所以总概率为= x + y + z = l1

让我们说,在上述情况下,在第二步中,他选择移走20个盒子,什么也不做,那么新的最终概率为= 1/3 + 0(第二步不做任何事情!)+ 2 / 3 *(1/3)= l2。现在,由于l2> l1,所以'l2'是我们问题的答案。

基本上,我们必须确定哪个移动顺序将产生最大概率?还有,

P(获胜)= P(以第一动作结束的游戏)+ P(以第二动作结束的游戏)+ P(以第三动作结束的游戏)=(1/3)+0+(2/3)*( 1/3)= 5/9

给出,N,K,M我们如何找出最大概率? 我们必须应用动态编程吗?

1 个答案:

答案 0 :(得分:0)

p N K M )成为约翰打得最佳的概率。我们具有以下重复关系:

  • p N K ,0)= 0
    • 如果没有剩余的动作,那么他会输。
  • 如果 M > 0和 N < X ,则 p N K M )= 1 / N + N −1) / N · p N + K K M −1)
    • 如果至少还有一个动作,并且选项#2不允许,那么他获胜的概率就是他在这一轮猜中正确的概率,加上他在这一轮猜错了的概率。 / em>他稍后获胜。
  • 如果 M > 0并且 N X ,则 p N K M )是这两个中的较大者:
    • 1 / N + N -1) / N · p N + K K M −1)
      • 如果他选择了选项#1,则与被迫选择选项#1的情况相同。
    • p N K K M −1) ,其中'%'是“余数”或“模数”运算符
      • 如果他选择第2个选项,那么他肯定不会在此步骤中获胜,因此他获胜的可能性等于他在以后的回合中获胜的可能性。
      • 请注意,我们只需要考虑 N K ,因为他当然应该选择允许的最大 X 值。让盒子的池子保持不必要的大小永远不会有任何好处。

动态编程或递归加记忆很适合于此。您可以直接应用上述递归关系。

请注意, K 永远不会更改,因此不需要数组维;和 N 仅通过加或减 K 的整数倍来更改,因此最好使用数组索引 n ,使 N =( N 0 K )+ nK

此外,请注意, M 每回合恰好减少1,因此,如果您使用的是动态编程方法,并且只需要最终概率,则无需保留 M 的所有值的概率;相反,在为给定值 M 构建数组时,只需将数组保留为 M -1。