首页 > 代码库 > 飞机加油问题的粗略探究

飞机加油问题的粗略探究

大概5年前吧,我初次见到了下面的这道题,但是一直没有认真系统地给出确切答案,算是一个悬案吧。最近重新想起来,决定终结它。

题目是这样的:每架飞机只有一个油箱,飞机之间可以相互加油;一箱油可供一架飞机绕地球飞半圈。为使至少一架飞机绕地球一圈回到起飞时的飞机场,至少需要出动几架飞机(包括绕地球一周的那架在内)?注:所有飞机从同一机场起飞,而且必须安全返回,加油时间不计。(当然你们可以直接看最后的参考答案,注意是参考)

要使一架飞机刚好飞行一圈,则飞行途中需要的总加油量为一箱,而这一箱油是通过其他飞机贡献的,同时需要注意飞机的受油量必须不大于消耗量,保证每架飞机都能安全返回,这样一来这个问题似乎非常棘手, 何况还要确定最优化的方案呢,天啊,这是要把脑子烧糊嘛?

冷静!那就一步步抽丝剥茧吧。

要想飞得更远,必须有足够多的飞机,假设有n架飞机同时起飞,顺时针飞行,第i(i=1,2…n-1)架飞机在s[i]处返回(为方便描述,s[i]理解成圆周上以机场为0点,顺时针增大的坐标值)。

实际上,s[i]处也就是加油点,为保证飞行距离最远,某架飞机在s[i]处折返时,其余未折返飞机的油箱应该补充满,而且确保该折返飞机恰好能安全返航。列出如下关系式(假设飞行一圈的路程为L,暂不考虑飞机折返后其余飞机出发接力的情况):

0.5L – 2 s[1] = (n-1)s[1];(第1架飞机返回时,将保证返航之外的油输送给其余飞机,且正好补充其余飞机所消耗的油量,依此类推)

0.5L – 2(s[2]- s[1])- s[1] = (n-2) (s[2]- s[1]);

0.5L – 2(s[3]- s[2])- s[2] = (n-3) (s[3]- s[2]);

0.5L  - 2(s[i]- s[i-1]) - x[i-1] = (n-i)(s[i]- s[i-1]);(i=1,2,3...n-1);

 解出s[i]的表达式:                                                                                                                                                                                                                                   

s[1] = 0.5L/(n+1) ;

s[2] = 0.5L*2/(n+1);

s[i] = 0.5L*i/(n+1);

真相越来越接近了,现在演变为求s[i] 最值的问题,当i为n-1时,显然s[i]最大。也就是说最后的一架飞机能飞到最远。这个路程只与飞行架次有关系,n趋向于无穷大时,(n-1)/(n+1)  趋向于1,这时最后的飞机飞行的路程为(n-1)/(n+1) + 0.5L,也就是只能无限接近目的地。

其实我们忽略了地球是圆的,飞机可以从机场另一方向迎接。这样一来,问题是可以解决的,但却变得更加扑朔迷离了。

假设顺时针方向出发,最后一次给主飞机(绕地球一周到达目的地的飞机)加油的地点相距为s[i],则为了能够接到主飞机,逆时针出发的飞机需要在逆时针方向距机场0.5L- s[i])或更远的位置给油。

以下阴影部分可以选择不看。

逆时针出发的飞机飞行计算模型跟顺时针还不太一样,稍微改进一下,如果最后的那架飞机在加油后不再往前飞而是把除安全返航的油全部送给顺时针过来的主飞机,这样岂不是感觉比较爽。显然,这样的话,迎接点在逆向1/4L的地方。

0.5L- s[i] = 0.5L – 0.5L*i/(n+1);1式

i = n-1;

把1式 构造成  0.5L * (y-1)/(y+1) 的结构。

即  0.5L – 0.5L*(n-1)/(n+1)=  0.5L * (y-1)/(y+1);且(y-1)/(y+1) = 1/4;

n = y = 3时,成立。意思就是左右方向各出动3架次飞机。比较幸运,这个n的值比较小,如果这个n比较大的话,验证最优化的方案比较难。

还需要考虑一个问题,就是飞回来的飞机是可以复用的(看吧,这里又一个坑)。

后来我发现其实刚刚构造的模型(阴影文字)不是最优的,因为跟顺时针相比,相同路程逆时针所使用的飞机数应该可以更少,实际上可以相应少一架,这一架飞机可以理解为迎面而来的主飞机(他来时的动力已经由顺时针飞机提供)。

假设有y架飞机同时起飞,逆时针飞行,第k(k=1,2…y-1)架飞机在s’[i]处返回(这里s’[i]为圆周上以机场为0点,逆时针增大的坐标值)。

0.5L- s[i] = 0.5L – 0.5L*i/(n+1);1式

S’[k] = 0.5L * (k+1)/(y+2) = 0.5L- s[i];2式

联立1,2式,i取n-1,k取y;

求n+y的极值。

当n=3,y=2时,即顺时针出动3架,逆时针出动2架为最少出动飞机架次的方案。(由于一直以来数学很渣,况且多年没做过小学级别以上的数学题,具体就不仔细证明了)。

参考答案如下:

3架从一个方向起飞,到1/8路程时的第1架将2,3加满油返回,到1/4地时,2机将3机加满油返回!3机到1/2地时,与从机场反向出发的1机(复用)相遇,将油平分,飞至最后八分之一处(D点);

与从机场反向出发的2机(复用)相遇,各分四分之一油,返回。这样3机就能飞完一圈。

为了便于理解,懒惰的我再补上一张图。

技术分享图片来自:http://blog.sina.com.cn/s/blog_48ef377d0100089h.html

写到这里,其实小编早就已经是相当懵逼了,并不确定分析正确,希望抛砖引玉。欢迎指正。

 

 

 

 

---恢复内容结束---

飞机加油问题的粗略探究