两个玻璃球和 100层高楼 问题

你有两个玻璃球和一个100层的大高楼,你想测出最低在那一层将玻璃球丢下,玻璃球便会破碎。用什么样的战术可以确保得到结果(i.e. 你的战术不能出现两个球都碎了,还找不到答案的情况),并且总共丢球的次数最小化?

如果你有 N 个玻璃球,你的战术会是什么?
 
http://www.xycq.net/forum/thread-123745-1-6.html 看到比较巧妙的分析, 受益匪浅,所以决定记录下来,并感谢他们精彩的讨论
再次添加:
      今天是2009年 10月11日,这几天看了几篇动态规划的文章,回头再看这篇文章,哈哈,其实周瑜老大的方法确实是运用了动态规划的思想,总算豁然开朗了
//==========================================
周瑜
假设N为玻璃球个数,x为尝试次数,最高能确定的层数为F(N,x)
定义域
N>=1, x>=1
边际条件
F(1,x)=x
F(N,1)=1
递推关系
F(N,x)=F(N-1,x-1)+F(N-1,x-2)+...+F(N-1,1)+x
通项公式
if x<=N
F(N,x)=2^x-1
if x>N and N is odd
F(N,x)=C(x+1,N)+C(x+1,N-2)+C(x+1,N-4)+...C(x+1,1)-1
if x>N and N is even
F(N,x)=C(x+1,N)+C(x+1,N-2)+C(x+1,N-4)+...C(x+1,0)-1
知道最高层数和玻璃球个数,查表可求出尝试次数。
//==========================================
周瑜
F(3,8)=92
F(3,9)=129
3个球9次即可

F(4,7)=98
F(4,8)=162
4个球8次即可

F(5,6)=62
F(5,7)=119
5个球7次即可

F(6,6)=63
F(6,7)=126
6个球7次即可
//==========================================

岱瀛

周大的算法思路是一种利用尝试次数和球数这两个变量,求可测算楼层的最大化,即最优战术可测算的最高楼层,即最优解.
本题运用的是动态规划的方法。

首先,无论采用哪一种尝试战术,最后都必然面临着剩一次机会的情况。
那么,根据题意,在N个球的情况下(N>0),只有一次机会下,最优解只能是1层。
这里有一个性质,就是F(x,y),当X>Y时,F(x,y)=F(y,y).  (X为球数,Y为尝试次数)
所以,Y是规划问题复杂度的量。


而在剩两次的机会下,最优解,必然是包含了1次机会的最优解,即在X不变的情况下,
F(x,2)的战术中必然包括F(x,1)和F(x-1,1)
1次机会下的最优解,是2次机会下最优解的子集,所以此题满足了最优化原理。

再来看,任何一次小球的出手,必然只有两种结果,一种是碎,一种是不碎。

比如F(2,2),如果第一次出手,球破了,那么剩一球,一次,显然只有F(1,1)是最优的。
                           球不破,那么剩2球,一次,F(2,1)是最优的。而F(2,1)=F(1,1)。
所以F(2,2)的战术,必然是F(1,1)和F(2,1)采用的战术的终合。
F(2,2)=1+F(1,1)+F(2,1)

这里面,题目有个特殊点,就是1~K层的尝试和K+1~M层的尝试,只要K层的性质等同于0层的性质,那么两个区间内的尝试
是等价的。

所以,对于x<y的情况下,F(x,y)必然可先有第一试,分出破与不破两个区间,不同情况然后采用相应战术。

推出:     F(x,y)=1+F(x-1,y-1)+F(x,y-1)

而x>=y的情况下,F(x,y)=F(y,y)=1+F(y-1,y-1)+F(y,y-1)

举3个球尝试9次的例子。F(3,9)=1+F(3,8)+F(2,8)
                            =2+F(3,7)+F(2,7)+F(2,8)
                            =3+F(3,6)+F(2,6)+F(2,7)+F(2,8)
                            =4+F(3,5)+F(2,5)+F(2,6)+F(2,7)+F(2,8)
                            =5+F(3,4)+F(2,4)+F(2,5)+F(2,6)+F(2,7)+F(2,8)
                            =6+F(3,3)+F(2,3)+F(2,4)+F(2,5)+F(2,6)+F(2,7)+F(2,8)
                            =7+F(3,2)+F(2,2)+F(2,3)+F(2,4)+F(2,5)+F(2,6)+F(2,7)+F(2,8)
                            =8+F(3,1)+F(2,1)+F(2,2)+F(2,3)+F(2,4)+F(2,5)+F(2,6)+F(2,7)+F(2,8)
                            =9+F(2,1)+F(2,2)+F(2,3)+F(2,4)+F(2,5)+F(2,6)+F(2,7)+F(2,8)
                            =9+1+3+6+10+15+21+28+36
                            =129

此时采用的战术是什么呢?显然就是从F(2+8)+1层开始试啊。即37层开始试.
          碎了,就在层内1~36层采用F(2,8)战术,
          不碎,就在38~129层这92层里采用F(3,8)战术 。(题目是100层,在此区间内)

----------------------------------------------------------------------------------------------------------------------------------------------------------

再看新问题,等价分布和高斯分布,同样都必须面临相同的最后选择,剩下一次机会的时候你能试多少层楼。
答案应该是肯定的,一次机会同样是一层楼。哪怕第一层的碎的概率是0.0000001%,你都必然得去试,
而碎与不碎的结果仅可判断第一层的结果。

那么再看累加的集。F(2,2)。在2个球,2种机会下。投出一个球,依然会回到F(2,1)或者F(1,1)的窘境,
而F(2,1)是的答案又等同于F(1,1).而前面已经得到,哪怕只有0.0000001%的概率,F(1,1)=1.

所以,题目如果要有不同,显然必须从F(2,2)入手。那么,第一个球显然是往最高碎的概率点投去的,不然概率的存在没有意义。
但是无论概率多少,出手后的结果却是一样,也是碎和不碎。
碎与不碎,只能确定投的那一层,然后转入两个区间内的运算,必然最终又回到F(2,1)和F(1,1)求解的问题。
因为,即使第N层有99.999999%概率会碎,
然后投完没碎, 仅仅代表那层没碎,N+1的可能概率依然没有变化,或者说无法另N+1层以上的某层概率归一
碎了的话,       仅仅代表那层会碎,  N-1层的可能概率也没有变化,或者说无法另N-1层以下的某层概率归一

所以,本题看不出和概率有什么相关性。规划战术应用过程中,总是在选择最佳战术,是有百分之百的把握的战术,因为题目要求球出手完是必然要得到一个 绝对结果而不允许得到一个可能结果的。

如果题目允许N个球都破,但是不能得出哪一层肯定碎或者最高层都不碎的答案,而是一个可能百分比,那么概率的设置才有意义。
因为这个时候,F(1,1)就不等于1了。

或者也可以有这种假设,比如说如果N层为99.99%的地方碎了,那么在N层下,98%以上的地方也必然碎,如果没碎,则N层上98%的层为不碎之类的前提条件,使反向一边的概率会从你尝试点处的概率推算出新的概率变化并且最终归一的话,那么概率分布对战术选择才会有影响吧。
//==========================================
whws
你的解释中的第一部分非常精彩,帮我弄清楚了许多我原先并没有真正明白的部分。谢谢你。

你解释中的第二部分显然是不正确的。我们来具体算一算结果就知道了。以题设给出的正态分布条件为例。各楼层概率分布的计算及其结果列表附在后面,以免影响大家阅读。

给出以下两个方案p1,p2:
p1:第一个小球预计投下的楼层数为[14,27,39,50,60,69,77,84,90,95,99]
     第二个小球预计投下的楼层数为[1:13]
                                               [15:26]
                                               ……(后面省略)
这就是reynolds_wwy给出的方案。

p2:第一个小球预计投下的楼层数为[27 39 45 50 54 60 69 77 90]
     第二个小球预计投下的楼层数为[1:26]
                                               [28:38]
                                               ……(后面省略)

方案p1、p2显然都能保证得到结果。但是其效率是不同的。
在极值最优的条件下,显然p1更为合理:p1的最大投掷次数为:Xmax=14;而p2的最大投掷次数为:Xmax=27。
但是在期望最优的条件下,却是p2更为合理:p1在正态分布下的预期投掷次数为平均9.3625次。p2在正态分布下的预期投掷次数为平均6.5797次。

实际上,在题设给出的正态分布条件下,方案p2更有可能用最少的实验次数得到结果。当然万一出现最差情况,p2也能保证得到结果,只是耗费的次数比p1多得多,但这种概率很小。说明一下,p2并不一定是该概率分布下期望值最优的方案。它只是对p1的一个简单修正。

期望投掷次数的计算公式为:EX=sum_w(X(w)*f(w)),可以参见我上一次的回复帖。


在非均匀概率分布的情况下,为什么会出现这种情况?打个简单的比方吧:如果一块地板下面有一个鼠洞,你要通过打洞的办法找到它。在什么都不知道的情况下,也即按均匀概率分布进行估计的情况下,你只能平均每隔一段距离打一个洞。但是如果你知道鼠洞的大概位置,你必然会在鼠洞可能存在的地方多打几个洞,而在其它地方少打一些。

事实上,无论在什么概率分布下,当我们只剩下一个球的时候,我们都不可避免地要在上一个球最后划定的区间内一层接一层地试下去。但是如果某个区间所包涵概率可能性小一些,我们不妨把这个区间所包涵的楼层数划的多一些,从而使其它区间所包涵的楼层数少一些。因为结果落在这个区间的可能性很小。一旦我们不需要测量这个区间,而只需测量其它区间,那么我们可以大大节省我们必须测试的楼层数。当然,结果落在这个小概率的区间的可能性不是没有,万一是这样,只能说我们赌博失败,于是我们不得不一层一层地测量许多层,从而多耗费更多的时间。不过这样的可能性很小。最终,我们可以求得一个期望下的平均值来作为我们决定策略的依据。

事实上,大多数工程,不会以极值作为优化策略的依据,而只会把极值作为一个给定的限制条件,只要在极端条件下不超出工程所能承受的能力,我们还是会以期望最优来建立我们的策略。于是上面那个题目还可以进一步限制为:在最坏条件下测量次数不能超过20次,请给出期望最优的方案设计。






附:题目给定的高斯分布下,各个楼层的概率值列表及其计算方法。

简单计算可知,正态分布函数的参数为:均值mu=50;均方差sigma=10/Fai(0.475)=10/1.96=5.1020。查表很麻烦,可以用matlab的normcdf函数来计算。为了离散化,我们把第n层的概率表达为[n-0.5,n+0.5]的积分,第一层和第一百层的概率表达为(-inf,0.5]和[99.5,+inf)的积分。利用高斯分布的对称性可以得到各层的概率值。下面是经计算得到的各层概率列表:

9.9068e-022  5.4009e-021  3.3308e-020  1.9769e-019  1.1293e-018  6.2081e-018  3.2846e-017   
1.6726e-016  8.1966e-016  3.8659e-015  1.7548e-014  7.6662e-014  3.2232e-013  1.3043e-012  
5.0793e-012  1.9037e-011  6.8672e-011  2.3840e-010  7.9655e-010  2.5614e-009  7.9271e-009  
2.3611e-008  6.7683e-008  1.8673e-007  4.9580e-007  1.2670e-006  3.1161e-006  7.3758e-006  
1.6803e-005  3.6840e-005  7.7736e-005  1.5787e-004  3.0856e-004  5.8042e-004  1.0508e-003  
1.8309e-003  3.0703e-003  4.9553e-003  7.6970e-003  1.1506e-002  1.6555e-002  2.2924e-002  
3.0551e-002  3.9185e-002  4.8372e-002  5.7468e-002  6.5710e-002  7.2312e-002  7.6587e-002  
7.8068e-002  7.6587e-002  7.2312e-002  6.5710e-002  5.7468e-002  4.8372e-002  3.9185e-002  
3.0551e-002  2.2924e-002  1.6555e-002  1.1506e-002  7.6970e-003  4.9553e-003  3.0703e-003  
1.8309e-003  1.0508e-003  5.8042e-004  3.0856e-004  1.5787e-004  7.7736e-005  3.6840e-005  
1.6803e-005  7.3758e-006  3.1161e-006  1.2670e-006  4.9580e-007  1.8673e-007  6.7683e-008  
2.3611e-008  7.9271e-009  2.5614e-009  7.9655e-010  2.3840e-010  6.8672e-011  1.9037e-011
5.0793e-012  1.3043e-012  3.2232e-013  7.6662e-014  1.7548e-014  3.8659e-015  8.1966e-016  
1.6726e-016  3.2846e-017  6.2081e-018  1.1293e-018  1.9769e-019  3.3308e-020  5.4009e-021  
8.4285e-022  1.4782e-022
//==========================================
最后附上自己根据周瑜老大通项公式 而进行的编码
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值