ガソリンスタンドの問題のアルゴリズムを理解する


11

ガスステーションの問題我々が与えられているの都市とそれらの間の道路。各道路には長さがあり、各都市には燃料の価格が定義されています。道路の1つの単位は燃料の1つの単位を要します。私たちの目標は、できるだけ安価な方法でソースから目的地に行くことです。私たちのタンクはいくつかの値によって制限されています。{ 0 n 1 }n{0,,n1}

アルゴリズムを理解しようとするので、解決策を計算するための手順を手動で書き留めました。残念ながら私は行き詰まりました-ある時点で考慮すべきエッジがありません、理由がわかりません、おそらく何かが足りないのです。

例:
道路:
0 ----------- 1 ------------ 2 -------------- 3
(それはしません単純である必要があります。グラフは任意です。つまり、0-> 2、0-> 3、1-> 3などの道路が存在する可能性があります。)

ソース:0、デスティネーション:3、タンク:10ユニット
燃料価格:0 :10ユニット、1:10ユニット、2:20ユニット、3:12ユニット
長さ:0-> 1:9ユニット、1-> 2:1ユニット、2-> 3:7ユニット
最適解: 0で9ユニット、1で8ユニットを入力します。合計コストは170ユニット(9 * 10 + 8 * 10)になります。

そこで、ここに示すように計算してみました(2.2項)

GV[u] is defined as:
GV[u] = { TankCapacity - length[w][u] | w in Cities and fuelPrice[w] < fuelPrice[v] and length[w][u] <= TankCapacity } U {0}

so in my case:
GV[0] = {0}
GV[1] = {0}
GV[2] = {0, 3, 9}
GV[3] = {0}

D(u,g) - minimum cost to get from u to t starting with g units of fuel in tank:
D(t,0) = 0, otherwise:
D(u,g) = min (foreach length[u][v] <= TankCapacity)
         { 
           D(v,0) + (length[u][v] - g) * fuelPrice[u]                             : if  fuelPrice[v] <= fuelPrice[u] and g <= length[u][v]
           D(v, TankCapacity - length[u][v]) + (TankCapacity - g) * fuelPrice[u]  : if  fuelPrice[v] > fuelPrice[u]
         }

so in my case:
D(0,0) = min { D(1,0) + 9*10 }  - D(0,0) should contain minimum cost from 0->3
D(1,0) = min { D(2,9) + 10*10 } - in OPT we should tank here only 8 units :(
D(2,9) = min { ??? - no edges which follows the condition from the reccurence 

Nevertheless D(0,0) = 90 + 100 + smth, so it's already too much.

To achieve the optimal solution algorithm should calculate D(2,7) because the optimal route is:   
(0,0) -> (1,0) -> (2, 7) -> (3, 0) [(v, g): v - city, g - fuel in tank]. 
If we look at G[2] there is no "7", so algorithm doesn't even assume to calculate D(2,7), 
so how can it return optimal solutions?

ドキュメントからの繰り返しが機能しないようであるか、何かが間違っている可能性が高いです。

誰かがこれを手伝ってくれませんか?

回答:


7

問題は、min()pの式(4)の最初の引数の条件にあります。7.現在

c(v) <= c(u) and g < d[u][v]

しかしそれは

(c(v) <= c(u) or v = t) and g < d[u][v]

tに到着して強制的にガスを残さないようにする。(Fill-Row(u、q)のバグについての以下の私の説明と同様に、tでのガスのコストにはまったく関心がありません。そして、そこと同様に、問題を修正する別の方法はc(t )アルゴリズムの最初は0です。)

この公開されたアルゴリズムの間違いを修正し、以下で説明するように欠落しているエッジを追加することで(あなたの間違い:-P)、すべてが機能するのに十分です。


不足していることの1つは、グラフGが完全でなければならないことです(セクション2、p。4の最初の文)-完全でない場合は、不足しているエッジを追加する必要があります。グラフ。たとえば、例のグラフでは、(とりわけ)1から3までのエッジがあり、重みが8(2経由のパスに対応)であるため、実際にはGV [3] = {0、2}になります。

それで問題が完全に解決するかどうかはわかりませんが、解決するはずです。

それとは別に、pのFill-Row(u、q)アルゴリズムにバグがあると思います。6:このアルゴリズムはq = 1の場合を特別に処理しますが、そうではありません。変更することで修正できると思います

if c(v) <= c(u)

3行目で

if c(v) <= c(u) or q = 1

最終レグを強制的に空にして目的地に到着させます。(直感的には、最終目的地tでのガスの価格は常に無視する必要があります。)これを回避する別の方法は、最初にc(t)を0で上書きすることです。


で何が発生するかについて注意するだけでなく、内部ループで要素が不足したときに、意味のある値をテーブルに入力するように注意する必要もあります。さらに、私がそれを正しく読んでいる場合、アルゴリズムはケース(このCS SEの質問を参照を完全に無視しているように見えるので、そこで何かを行う必要があります。c v > c u q=1c(v)>c(u)
fuglede

2

@j_random_hackerソリューションを使用して、グラフを完全なグラフに変換し、条件を式(4)から次のように変更する必要があります。

(c(v) <= c(u) or v = t) and g < d[u][v]     

完全なグラフは次のようになります。

ここに画像の説明を入力してください

そして最終的な計算:

GV[0] = {0}, GV[1] = {0}, GV[2] = {0, 3, 9}, GV[3] = {0, 2}

D(0,0) = min { D(1,0) + 9 * 10 }
D(1,0) = min { D(2,9) + 10 * 10, D(3,0) + 8*10 }
D(3,0) = 0
... etc

so D(0,0) = 170

0-> 1-> 3 [合計コスト170 $]のパスがソリューションです。それが私たちが期待したものです:-)。ルートが必要な場合は、これらの余分なエッジをソリューションから指定されたエッジに最初に変換できるはずです(それほど難しいことではありません)。

私はこの再発でデッドループをどのように回避すべきか疑問に思います。たとえば、c(0)<= c(1)およびc(1)<= c(0)であるため、0 <-> 1の間にデッドループが存在する可能性があります。


将来の参照については、このメタ投稿を参照してください :-)
Juho

1

アイデアは、必要に応じて、どこにいても最も安い料金で燃料を入手することです(貪欲アルゴリズムパラダイム)

いくつか例を挙げましょう。あなたの例では

ソース:0、デスティネーション:3、タンク:10ユニット燃料価格:0:10ユニット、1:10ユニット、2:20ユニット、3:12ユニット長さ:0-> 1:9ユニット、1-> 2:1ユニット、2-> 3:7ユニット

私は最初に9ユニットを移動する必要があるため、0で> = 9ユニット(容量> = 9)をタンクに充填する必要があります。今、私は1,2,3で燃料レートが0での燃料レート以上であることを確認できます。必要な燃料を最も安いレートで購入したいので、9 + 1 + 7 = 17ユニットを満タンにしようとします。市0のみ。しかし、タンクの容量は17未満、たとえば10になる可能性があります。したがって、10まで充填します。その後、1で燃料が1ユニット残っており、8ユニット以上トラバースする必要があるため、1で7を充填しますもっと単位。レートが高くなるので、2で満たすことができません。私の合計コスト= 10 * 10 + 7 * 10 = 170。

貪欲なアルゴリズムは、上記の考えに従います。都市iでの燃料費。2つの都市と間の距離。「満タン」とは、タンクが満たされる燃料の単位です。「容量」は最大タンク容量です。d i j i jCidijij

i)フル= 0

ためii)はと、聞かせ後の最初の都市である、このようなこと(そのような場合、次に存在しない)。 = more_distance_need_to_travel_till_city_ =。都市で {フル、容量}の単位燃料を購入します。フル= {フル、容量}。設定します。i=0n1liCi>Clll=n1dllk=i+1ldk,k+1mindlimindli=l


ご回答ありがとうございます!残念ながら、私は自分自身を十分に明確に指定していませんでした。あなたは、そのグラフは、私の例のように、単純なようになりますが、それは任意のグラフすなわちもあるからできる道路0-> 2、1-> 3等をすることができ、仮定
ヴォイチェフクーリック

ええと、あなたが言及しなかったように、私がすべての都市が線形的に接続されていると仮定する前に(グラフは単純なパスです)。
Sayan Bandyapadhyay 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.