火车运煤问题

来源:互联网 发布:优麒麟和ubuntu的区别 编辑:程序博客网 时间:2024/04/29 03:57

这个题的解答并不难,有很多网友都给出了答案,但是想说清楚道理还是比较绕弯。如果想做编程做模拟,代码很简单,但是一些边界条件、中间过程都很绕,所以把这个不是编程题的编程题放在这里解答一下,供参考。


根据题意可知有三种运输方式,分别是成本为5,成本为3,成本为1. 下面简称T5,T3,T1.  


首先给出最优策略1:用完所有能源,也就是运到终点的能源 + 路上消耗的能源=3000。否则,不论剩余多少能量,我们总可以后退一点,再多装一些,按照三种运输方式之一,多运一点能量到终点。


下面引入运输能力这个概念:
以T3举例,从起点向终点方向走2趟,最大可装载2000,运到距离为delta的某点之后,最大剩余2000-delta,因此称T3的运输能力C3 = 2000-delta <= 2000,(delta >= 0)。也就是说,T3最多能运送不超过2000的能量,超过2000就有剩余能量.
同理T5的运输能力C5 = 3000-delta <= 3000,T1的运输能力C1 = 1000 - delta <= 1000.

这样,我们就得出最优策略2:在运输能力范围内,选用成本最低的方式用R表示剩余未被运输的能量样,由策略1和策略2可知最优的运送方式:
2000 <= R <= 3000, 用T5方式
1000 <= R <= 2000, 用T3方式
0 <= R <= 1000, 用T1方式

即,先用T5消耗1000,剩余2000之后用T3方式再消耗1000,最后用T1方式运输余下能量。因此最优解为:
T5: 运输距离 x = 1000/5 = 200
T3: 运输距离 y = 1000/3 = 333.333
T1: 运输距离 z =1000 - x - y = 466.667
运送到终点的最大能量 = 1000 - 466.667 = 533.333

证毕.

进一步推广:
首先简化上面的计算过程:  
最大能量 = 1000 - z = 1000 - (1000 - x - y) = x + y = 1000 * (1/3 + 1/5).

现在有初始能量X(假设X可被1000整除,否则可以同理做推广),按照最优策略1和2可得:

最大需要的运输能力的方式Tmax=X/1000 * 2 - 1
所以,能够运输的最大能量 = 1000 * (1/3 + 1/5 + ... + 1/Tmax)
用归纳法很容易证明此结论。
 

因为1/3+1/5+1/7+...是发散的,理论上可以运送任意初始能源X,但是考虑到单程最大能力为1000,所以只要X比1000多一点,就可以用T3方式先运送一点,剩余采用T1,因此,约束条件为X > 1000.

 

最后提个问题,如果希望能够卖到集市上1000吨煤,那么最少需要初始有多少吨?

你才山西煤老板!!!

 

原创粉丝点击