Benzin istasyonu problemi için bir algoritmayı anlama


11

Gelen benzin istasyonu sorunu biz verilmiştir şehirler aralarında ve yollar. Her yolun uzunluğu vardır ve her şehir yakıtın fiyatını tanımlar. Bir birim yolun maliyeti bir birim yakıttır. Hedefimiz bir kaynaktan hedefe mümkün olan en ucuz şekilde gitmek. Tankımız bir değerle sınırlıdır.n{0,...,n-1}

Algoritmayı anlamaya çalışıyorum , bu yüzden çözümü hesaplamak için adımları manuel olarak yazdım. Ne yazık ki takılıp kaldım - bir noktada dikkate alınması gereken kenarlar yok, nedenini bilmiyorum, belki bir şeyleri kaçırıyorum.

Örnek:
yol:
0 ----------- 1 ------------ 2 -------------- 3
(değil bu kadar basit olmalı, herhangi bir grafik olabilir, yani 0-> 2, 0-> 3, 1-> 3 vb. arasında yollar olabilir.)

Kaynak: 0, Hedef: 3, Tank: 10 adet
Yakıt fiyatları: 0 : 10 adet, 1 : 10 adet, 2 : 20 adet, 3 : 12 adet
Uzunluk: 0-> 1 : 9 adet, 1-> 2 : 1 birim, 2-> 3 : 7 birim
Optimal çözüm: 0'da 9 birimi ve 1'de 8 birimi doldurun. Toplam maliyet 170 birimdir (9 * 10 + 8 * 10).

Bu yüzden burada gösterildiği gibi hesaplamaya çalıştım (paragraf 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?

Belgeden tekrarlanma işe yaramıyor ya da yanlış bir şey yapmam daha olası.

Biri bana bu konuda yardımcı olabilir mi?

Yanıtlar:


7

Sorun, min()s. 2'deki Denklem (4) ' deki ilk argümanın koşuludur . 7. Şu anda

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

ama olmalı

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

t'ye gelişini gaz kalmamasına zorlamak. (Tıpkı Fill-Row'daki (u, q) hataya ilişkin aşağıdaki açıklamamda olduğu gibi, asla t'deki gaz maliyetiyle ilgilenmiyoruz. Ve orada olduğu gibi, sorunu düzeltmenin başka bir yolu da c (t ) algoritmanın başlangıcında 0 ile.)

Bu hatayı düzeltmek (yayınlanan algoritmada), aşağıda açıkladığım gibi eksik kenarları eklemekle birlikte (hatanız :-P), her şeyin çalışması için yeterli olmalıdır.


Eksik olan bir şey, G grafiğinin tam olması gerektiğidir (bölüm 2, s. 4'ün ilk cümlesi) - ve tamamlanmamışsa, eksik kenarların eklenmesi gerekir; grafik. Yani, örneğin, örnek grafiğinizde, (diğerleri arasında), ağırlık 8 ile 1'den 3'e kadar bir kenar olmalıdır (2 yoluyla yola karşılık gelir), böylece aslında GV [3] = {0, 2}.

Bunun sizin için sorunu tamamen çözüp çözemeyeceğinden emin değilim, ama yardımcı olmalı.

Ayrı ayrı, bence Fill-Row (u, q) algoritmasında bir hata var. 6: Bu algoritma q = 1 örneğini özel olarak ele almalıdır, ama etkilemez. Değişerek giderilebileceğine inanıyorum

if c(v) <= c(u)

3. hatta

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

herhangi bir son ayağı hedefe boş ulaşmaya zorlamak. (Sezgisel olarak, nihai hedefteki gazın fiyatını her zaman göz ardı etmeliyiz, t.) Bunun bir başka yolu, başlangıçta 0 ile c (t) üzerine yazmak olacaktır.


q=1c(v)>c(u)

2

@J_random_hacker çözümünü kullanarak grafiğimizi eksiksiz bir grafiğe dönüştürmeliyiz ve koşulu denklem (4) 'ten şu şekilde değiştirmeliyiz:

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

Tam grafik şöyle görünmelidir:

resim açıklamasını buraya girin

ve son hesaplamalar:

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 arasındaki yol [toplam maliyet 170 $] çözümdür. Beklediğimiz bu :-). Bir rotaya ihtiyacımız olursa, başlangıçta bu ekstra kenarları çözeltiden verilen kenarlara dönüştürebilmeliyiz (çok zor olmamalı).

Sadece bu rekürrensde deadloopstan nasıl kaçınmamız gerektiğini merak ediyorum. Örneğin, 0 <-> 1 arasında ölü döngü olabilir, çünkü c (0) <= c (1) ve c (1) <= c (0).


İleride
gönderiye

1

Fikir, nerede olursanız olun yakıtı en ucuz oranda almaktır (açgözlü algoritma paradigması)

Bazı örnekler verelim. senin örneğinde

Kaynak: 0, Hedef: 3, Tank: 10 adet Yakıt fiyatları: 0: 10 adet, 1: 10 adet, 2: 20 adet, 3: 12 adet Uzunluk: 0-> 1: 9 adet, 1-> 2: 1 birim, 2-> 3: 7 birim

İlk başta 9 birim seyahat etmeliyim, bu yüzden tankımı 0'da> = 9 birim (kapasite> = 9) ile doldurmam gerekiyor. Şimdi, 1,2,3'te yakıt oranının 0 = yakıt oranı 0 olduğunu görebiliyorum. İhtiyaç duyduğum yakıtı en ucuz fiyatla satın almak istiyorum. 9 + 1 + 7 = 17 birimini doldurmaya çalışacağım. yalnızca şehir 0. Ancak, tankın kapasitesi <17, örneğin 10 olabilir. Yani, 10'a kadar dolduracağım. Sonra 1'de 1 birim yakıt kaldım ve 8 birimi daha fazla geçmek zorundayım, bu yüzden 1'de doldururum 7 daha fazla. Oranı daha yüksek olacağı için 2'de dolduramıyorum. Benim toplam maliyetim = 10 * 10 + 7 * 10 = 170.

Cbendbenjbenj

i) dolu = 0

ben=0n-1lbenCben>Clll=n-1dllΣk=ben+1ldk,k+1mindl-dolu, kapasite} şehirdeki birim yakıt . dolu = { dolu, kapasite}. Set .benmindl-ben=l


Cevabınız için teşekkür ederim! Maalesef kendimi yeterince net bir şekilde belirtmedim. Bu grafiğin örneğim kadar basit olacağını varsaydınız, ancak herhangi bir grafik olabilir, yani 0-> 2, 1-> 3 vb. Yollar da olabilir
Wojciech Kulik

Ya, bahsetmediğin gibi, tüm şehirlerin doğrusal bir şekilde bağlı olduğunu varsaymadan önce (grafik basit bir yoldur).
Sayan Bandyapadhyay
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.