火車運煤問題

網上有一道火車運煤的問題。

題目:

你是山西的一個煤老闆,你在礦區開採了有3000噸煤需要運送到市場上去賣,從你的礦區到市場有1000公里,你手裏有一列燒煤的火車,這個火車最多隻能裝1000噸煤,且其能耗比較大——每一公里需要耗一噸煤。請問,作爲一個懂編程的煤老闆的你,你會怎麼運送才能運最多的煤到集市?

 

開始看到題目覺得沒有解,火車運1000噸,到終點後,什麼也沒有了,都在路上消耗光了,但是一次性從頭開到尾,還有很多煤在起點,沒有運。因此火車不能一次性開到尾,一定先開到中途某一點,選擇這一點作爲中轉站,卸下部分煤,然後返回再去運(當然前提條件是火車首尾都必須有火車頭!)。既然是求最值問題,我首先想到的這道題可能的幾個思路:1.建立數學方程求最值;2.通過編程窮舉。

 

首先我自己想舉個實際的情況看看,怎樣運煤到終點。

假設火車開始行到400公里,然後卸煤。火車運送三次到400公里點處,在400公里處剩餘1000噸(3000-5*400),剩下600公里,火車裝滿煤,然後到終點還剩400噸煤。

這說明火車是可以運煤到終點的。如何才能求的運送的最大值?我現在遇到的困難是:

1.火車可以現在任意個地方做爲中轉站。火車可以走到一公里處選擇卸煤,剩下的煤剛夠返回;火車還可以在100公里處選擇卸煤,然後返回;甚至可以在10.4公里處,選擇卸煤。

2.選擇中轉站的次數是任意的。比如從開始到100公里之間,我可以選擇只在100公里處卸煤,再返回運煤;我也可以選擇在中間某個地方卸煤,然後到100公里出卸煤;或者我可以選擇中間兩個地方作爲中轉站。可以選擇中轉站的次數是任意的。

3.選擇同一個地方爲中轉站,但火車返回的趟數不固定。比如我一開始可以選擇在100公里處選擇卸煤,我可以返回一趟運煤;我也可以返回兩趟運煤。

 這麼看來可能運煤的方式有無數種,無從下手。


我就從一公里下手,假設火車每走一公里就選擇中轉站,然後回上次的出發點運煤,分析中會發現:

火車從A點出發,到B點中轉,那麼運煤的情況只可能是下面三種:

1. A運到B,不選擇返回

2. A運到B,返回A一次,然後再回到B

3. A運到B,返回A兩次,在返回B

這是因爲:

火車最多運送1000噸煤,而煤的總量是3000噸,所以只能出現上面這三種情況。這是一個很重要的信息。

注意:爲了儘可能多的運煤,每次從中轉站返回時,火車裝的煤剛好夠返回,多餘的煤存放在中轉站。

我們又發現幾個規律。

1.等效性。

假設從位置A運煤到位置B,返回A兩次;從位置B運煤到位置C,返回B兩次。這種運煤方式等效於:從A運煤到C,返回A兩次。

 

2. 還可以發現一個規律,姑且叫返回次數不可增大性。

假設從位置A運煤到位置B,返回A一次;接着從位置B運煤到位置C,則到達C之後,最多隻能返回一次B,然後再回到C。

原因:從A到B,返回A一次,所以火車從A運了兩次煤到B,每次最多1000,火車行走還有消耗煤,所以火車運到B的煤總量必然小於2000。如果火車到達車C返回B兩次,那麼從A運到B的煤就必須大於2000,所以最多隻能返回一次B,然後回到C。

每次從一個地方A運煤到另一個地方B,都要儘可能多的把A原有的煤運到B處。從出發點,我們就要把原先3000噸煤儘可能多的運到第一個中轉站,開始一定是返回出發點兩次(也就是運三次煤到第一個中轉站);接着一定是返回一次到中轉站(也就是運兩次煤到第二個中轉站);然後直接運煤到終點

所以,有上面的分析,即使可能會出現無數種運煤方式,最優的運煤方式一定符合下面的情行:

Start------------Two-------------One----------End

Start代表出發點;End代表終點;Two代表一箇中轉站,返回Start處兩次(也就是從Start處總共運了三次煤到Two處);One代表一箇中轉站,返回Two處一次(也就是從Two出總共運了兩次煤到One處);最後從One處直接運送一次煤到終點。

其它可能的情況:Start------------Two-------------End,這種情況也被上面所包含。當位置Two和位置One重合時就是這種特殊情況。

所以現在我們就對下面的情況進行分析。

Start------------Two-------------One----------End

假設Start處座標爲0,位置Two的座標爲X,位置One的座標爲Y。即:

0--------------X--------------------Y--------------1000

分兩種情況討論

I.3000-5X >= 2000, X<=200

這時運到Y處的煤總量是:2000-3(Y-X),再考慮兩種情況,

 i)2000-3(Y-X) >= 1000, (Y-X)<=1000/3;

   最終運送到終點的煤:1000-(1000-Y)=Y

   Y<=1000/3+X=533.33

   所以最多是運送533.33,X=200,Y=333.33。

 ii)2000-3(Y-X) < 1000, 3(Y-X)>1000

   最終運送到終點的煤:

2000-3(Y-X)-(1000-Y)=1000-2Y+3X=1000-2(Y-X)+X<1000-1000*(3/2)+200=533.33

II.3000-5X < 2000, X>200

這時運送到Y處的煤總量是:3000-5X-3(Y-X)=3000-3Y-2X,同樣再考慮兩種情況,

i) 3000-3Y-2X>=1000

  最終運送到終點的煤:1000-(1000-Y)= Y,

  Y<=(2000-2X)/3<1600/3=533.33

ii) 3000-3Y-2X<1000

  最終運送到終點的煤:3000-3Y-2X-(1000-Y)= 2000-2Y-2X

由3000-3Y-2X<1000,得到2(Y+X)>(2000+X)*(2/3),

所以,2000-2Y-2X <2000 - (2000+X)*(2/3) <2000-(2000+200)*(2/3)=533.33

 

所以由上面分析知道最多運煤533.33噸。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章