Розуміння алгоритму проблеми АЗС


11

У задачі на АЗС нам задано 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 одиниць
Оптимальне рішення: заповніть 9 одиниць на 0 і 8 одиниць на 1. Загальна вартість тоді становить 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()в рівнянні (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), нас ніколи не цікавлять витрати газу на т. І як там, ще один спосіб виправити проблему - перезаписати c (t ) з 0 на початку алгоритму.)

Виправлення цієї помилки (в опублікованому алгоритмі) у поєднанні з додаванням відсутніх ребер, як я описую нижче (ваша помилка :-P), повинно бути достатньо, щоб все працювало.


Одне, чого вам не вистачає, - це те, що графік G повинен бути повним (перше речення розділу 2, стор. 4) - а якщо він не є повним, будь-які пропущені ребра повинні бути додані, а ваги знайдені, беручи мінімальну довжину шляху у графік. Так, наприклад, у вашому прикладі графіка має бути (серед інших) край від 1 до 3 із вагою 8 (що відповідає шляху через 2), так що насправді GV [3] = {0, 2}.

Я не впевнений, чи це повністю вирішить проблему для вас, але це повинно допомогти.

Окремо, я думаю, що в алгоритмі Fill-Row (u, q) на p. 6: цей алгоритм повинен розглядати випадок q = 1 спеціально, але це не так. Я вважаю, що це можна виправити, змінивши

if c(v) <= c(u)

по лінії 3 до

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

змусити будь-яку останню ногу прибути до пункту призначення порожнім. (Інтуїтивно ми завжди повинні нехтувати ціною газу на кінцевому пункті призначення, т.) Іншим способом цього було б перезаписати c (t) на 0 на початку.


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

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 $] - це рішення. Ось чого ми і очікували :-). Якщо нам потрібен маршрут, ми повинні мати можливість перетворити ці додаткові краї з рішення на задані краї на початку (це не повинно скласти великих труднощів).

Мені цікаво лише, як нам слід уникати тупиків у цьому повторенні. Наприклад, між 0 <-> 1 може бути тупикова петля, оскільки c (0) <= c (1) і c (1) <= c (0).


Для подальшого ознайомлення дивіться цей мета-пост :-)
Джухо

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.

Cidijij

і) повний = 0

i=0n1liCi>Clll=n1dllk=i+1ldk,k+1mindlповна, місткість} одиниця палива в місті . full = { повний, ємність}. Встановіть .imindli=l


Спасибі за вашу відповідь! На жаль, я не вказав себе досить чітко. Ви припускали, що цей графік буде таким же простим, як мій приклад, але це може бути будь-який графік, тобто можуть бути також дороги 0-> 2, 1-> 3 тощо.
Войцех Кулик

Я, як ви не згадували, що раніше я припускав, що всі міста з'єднані лінійно (графік - це простий шлях).
Саян Бандяпадхяй
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.