vlambda博客
学习文章列表

动态规划求解手机耐摔指数分析



           


相传银河系一颗X星球
X星球的居民脾气不太好,他们生气的时候异常举动是:摔手机。


动态规划求解手机耐摔指数分析


各大厂商对此纷纷推出各种耐摔型手机,x星球的质监局规定了手机必须经过耐摔测试,并且评定出一个耐摔指数来之后才允许上市流通。
X星球有很多高耸入云的高塔,刚好可以用来做耐摔测试。塔的每一层高度都是一样的,与地球上稍有不同的是,他们的第一层不是地面,而是相当于我们的2楼。
如果手机从第7层扔下去没摔坏,但第8层摔坏了,则手机耐摔指数=7
特别地,如果手机从第1层扔下去就坏了,则耐摔指数=0
以此类推,如果到了塔的最高层第n层扔没摔坏,则耐摔指数=n
为了减少测试次数,每个厂家抽样3部手机参加测试。
某次测试的塔高为1000层,如果我们总是采用最佳策略,在最坏的运气下最多需要测试多少次才能确定手机的耐摔指数呢?
     这多简单,爬楼梯去了... 动态规划求解手机耐摔指数分析



动态规划求解手机耐摔指数分析


——莫激动,我们先来帮他们设个未知数 ——



假设待求的最多需要测试次数为i,把问题转向求可以测试的最大楼层数。

为了分析问题,我们先将问题的规模设定为1台手机。毋庸置疑,只有1台手机的情况下应该从第1层向高层逐层摔,若在第k1kn)层摔坏则其耐摔指数为k,若没摔坏则继续在k+1层(若存在)摔。由此可见,其最大测试次数i就是楼层总层数,记为m(i)=i,m1台手机可测的楼层总数。

动态规划求解手机耐摔指数分析

接下来将规模扩大到2台手机。第1台手机采用最佳策略选择在第k层摔下(无需理会具体的策略是什么),分两种情况:

情况一:如果摔坏了,则剩下1台手机,只能从1层向k-1层逐层摔,这样就将问题的规模从2台手机测试i次减少到1台手机测试i-1次的规模了,即相当于上述1台手机还有最多i-1次摔的机会,其楼层数记为:m(i-1)=i-1

情况二:如果没摔坏,则仍有2台手机继续用剩余的最多i-1次摔的机会,同样将问题的规模从最多摔i次减少为i-1次,从k+1层起向上采用最佳策略摔,楼层数记为:mm(i-1),其中mm代表2台手机摔i-1次的楼层数,则2台手机摔i次的楼层总数记为:

mm(i)=m(i-1)+1+mm(i-1)=i-1+1+mm(i-1)=mm(i-1)+i          ①

其中式中的1代表第k层,如下图所示:

动态规划求解手机耐摔指数分析

3台手机的情况与2台手机情况类似:当采用最佳策略在第k层将第1台手机摔下,分两种情况:

情况一:如果摔坏了,则将问题的规模从3台手机最多摔i次减少为2台手机最多摔i-1次,楼层数记为:mm(i-1),正好是上一阶段的结果。

情况二:如果没摔坏,则将问题的规模从3台手机最多摔i次减少为3台手机最多摔i-1次,楼层数记为:mmm(i-1)

所以,3台手机最多摔i次的楼层总数为:

mm(i)=mm(i-1)+1+mmm(i-1)    ②

同样,上式中的1为第k层。如下图:

动态规划求解手机耐摔指数分析

上述式是我们动态规划分析的结果,将问题规模缩小为子问题,子问题之间存在先续后继关系(例如,上述mm(i-1)式的子问题)。下面我们用Java语言来实现这个限定函数值mmm(代表楼层高度)来求解变量i(最大测试次数)的代码,即mmm(i)=1000i的值(请结合注释):

当我们输入1000时,输出结果19,即为正解。

到这里,基本就结束了。

  【小结】
上述解法采用了计算机算法设计中典型的动态规划算法,其核心思想是将复杂的大规模问题划分为简单的小规模问题,从而一步步求得最优解。 与一般的分治系统不同,一般适合于用动态规划求解的问题,经分解得到的子问题往往不是互相独立的,即下一个子阶段的求解都是建立在上一个子阶段求解的基础上的。( 李伟林2019-12-18)