Dalam masalah pompa bensin kita diberi kota 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?
sumber
Menggunakan solusi @j_random_hacker kita perlu mengubah grafik kita menjadi grafik lengkap dan mengubah kondisi dari persamaan (4) menjadi:
Grafik lengkap akan terlihat seperti ini:
dan perhitungan akhir:
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).
sumber
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.
i) penuh = 0
sumber