Memahami algoritma untuk masalah pompa bensin

11

Dalam masalah pompa bensin kita diberi n kota {0,,n1} dan jalan di antara mereka. Setiap jalan memiliki panjang dan setiap kota menentukan harga bahan bakar. Satu unit jalan menghabiskan satu unit bahan bakar. Tujuan kami adalah beralih dari sumber ke tujuan dengan cara semurah mungkin. Tangki kami dibatasi oleh beberapa nilai.

Saya mencoba memahami algoritma , jadi saya secara manual menuliskan langkah-langkah untuk menghitung solusinya. Sayangnya saya macet - pada titik tertentu tidak ada batas untuk dipertimbangkan, saya tidak tahu mengapa, mungkin saya kehilangan sesuatu.

Contoh:
jalan:
0 ----------- 1 ------------ 2 -------------- 3
(tidak harus sesederhana itu, bisa berupa grafik apa pun yaitu mungkin ada jalan antara 0 - 2, 0> 3, 1 -> 3 dll.)

Sumber: 0, Tujuan: 3, Tangki: 10 unit
Harga bahan bakar: 0 : 10 unit, 1 : 10 unit, 2 : 20 unit, 3 : 12 unit
Panjang: 0-> 1 : 9 unit, 1-> 2 : 1 unit, 2-> 3 : 7 unit
Solusi optimal: isi 9 unit pada 0 dan 8 unit pada 1. Total biaya kemudian adalah 170 unit (9 * 10 + 8 * 10).

Jadi saya mencoba menghitungnya seperti yang ditunjukkan di sini (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?

Pengulangan dari dokumen sepertinya tidak berfungsi atau lebih mungkin saya melakukan sesuatu yang salah.

Adakah yang bisa membantu saya dengan ini?

Wojciech Kulik
sumber

Jawaban:

7

Masalahnya adalah dalam kondisi untuk argumen pertama min()dalam Persamaan (4) pada hal. 7. Saat ini

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

tapi seharusnya begitu

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

untuk memaksa kedatangan pada t tidak memiliki gas yang tersisa. (Sama seperti dengan penjelasan saya di bawah untuk bug di Fill-Row (u, q), kami tidak pernah tertarik pada biaya gas di t. Dan seperti di sana, cara lain untuk memperbaiki masalah adalah dengan menimpa c (t ) dengan 0 pada awal algoritma.)

Memperbaiki kesalahan ini (dalam algoritma yang dipublikasikan), dikombinasikan dengan menambahkan di tepi yang hilang seperti yang saya jelaskan di bawah ini (kesalahan Anda :-P), harus cukup untuk membuat semuanya berfungsi.


Satu hal yang Anda lewatkan adalah grafik G harus lengkap (kalimat pertama bagian 2, hal. 4) - dan jika tidak lengkap, setiap tepi yang hilang harus ditambahkan, dengan bobot ditemukan dengan mengambil panjang jalur minimum dalam grafik. Jadi, misalnya dalam grafik contoh Anda, harus ada (antara lain) tepi dari 1 hingga 3 dengan bobot 8 (sesuai dengan jalur via 2), sehingga sebenarnya GV [3] = {0, 2}.

Saya tidak yakin apakah itu akan menyelesaikan masalah Anda sepenuhnya, tetapi itu akan membantu.

Secara terpisah, saya pikir ada bug dalam algoritma Fill-Row (u, q) pada hal. 6: algoritma ini harus menangani kasus q = 1 khusus, tetapi tidak. Saya percaya ini bisa diperbaiki dengan mengubah

if c(v) <= c(u)

pada saluran 3 ke

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

untuk memaksa kaki terakhir untuk sampai di tujuan kosong. (Secara intuitif, kita harus selalu mengabaikan harga gas di tujuan akhir, t.) Cara lain untuk mengatasi ini adalah dengan menimpa c (t) dengan 0 pada awalnya.

j_random_hacker
sumber
q=1c(v)>c(u)
2

Menggunakan solusi @j_random_hacker kita perlu mengubah grafik kita menjadi grafik lengkap dan mengubah kondisi dari persamaan (4) menjadi:

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

Grafik lengkap akan terlihat seperti ini:

masukkan deskripsi gambar di sini

dan perhitungan akhir:

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

Jalan melalui 0 -> 1 -> 3 [total biaya 170 $] adalah solusinya. Itu yang kami harapkan :-). Jika kita membutuhkan rute, maka kita harus dapat mengubah tepi ekstra dari solusi ke tepi yang diberikan di awal (seharusnya tidak terlalu sulit).

Saya hanya ingin tahu bagaimana kita harus menghindari deadlock dalam perulangan ini. Misalnya ada deadlock antara 0 <-> 1, karena c (0) <= c (1) dan c (1) <= c (0).

Wojciech Kulik
sumber
Untuk referensi di masa mendatang, lihat posting meta ini :-)
Juho
1

Idenya adalah untuk mendapatkan bahan bakar seperti yang diperlukan dalam tingkat termurah di mana pun Anda dapatkan (paradigma algoritma serakah)

Ambil beberapa contoh. dalam contoh Anda

Sumber: 0, Tujuan: 3, Tangki: 10 unit Harga bahan bakar: 0: 10 unit, 1: 10 unit, 2: 20 unit, 3: 12 unit Panjang: 0-> 1: 9 unit, 1-> 2: 1 unit, 2-> 3: 7 unit

Saya harus melakukan perjalanan 9 unit pada awalnya, jadi saya perlu mengisi tangki saya pada 0 dengan> = 9 unit (kapasitas> = 9). Sekarang, saya dapat melihat pada 1,2,3 tingkat bahan bakar>> tingkat bahan bakar pada 0. Karena saya ingin membeli bahan bakar yang saya butuhkan dalam tingkat termurah saya akan mencoba untuk mengisi 9 + 1 + 7 = 17 unit di hanya kota 0. Tetapi, kapasitas tangki mungkin <17, katakanlah 10. Jadi, saya akan mengisi hingga 10. Kemudian pada 1 saya memiliki 1 unit bahan bakar tersisa dan saya harus melintasi 8 unit lebih banyak, jadi pada 1 saya akan mengisi 7 unit lebih banyak. Saya tidak dapat mengisi pada angka 2 karena tarifnya akan lebih tinggi. Saya, total biaya = 10 * 10 + 7 * 10 = 170.

Cidijij

i) penuh = 0

i=0n1liCi>Clll=n1dllk=i+1ldk,k+1mindlimindli=l

Sayan Bandyapadhyay
sumber
Terima kasih atas jawaban Anda! Sayangnya saya tidak menentukan diri saya dengan cukup jelas. Anda berasumsi, grafik itu akan sesederhana contoh saya, tetapi bisa berupa grafik apa pun yaitu ada juga jalan 0-> 2, 1-> 3 dll.
Wojciech Kulik
Ya, karena Anda tidak menyebutkan bahwa sebelumnya saya berasumsi semua kota terhubung secara linear (grafiknya adalah jalur sederhana).
Sayan Bandyapadhyay