No problema do posto de gasolina, temos cidades e estradas entre elas. Cada estrada tem extensão e cada cidade define o preço do combustível. Uma unidade de estrada custa uma unidade de combustível. Nosso objetivo é ir de uma fonte a um destino da maneira mais barata possível. Nosso tanque é limitado por algum valor.
Eu tento entender o algoritmo , então escrevi manualmente as etapas para calcular a solução. Infelizmente fiquei preso - em algum momento não há arestas a serem consideradas, não sei por que, talvez esteja perdendo alguma coisa.
Exemplo:
estrada:
0 ----------- 1 ------------ 2 -------------- 3
(não tem que ser tão simples, pode ser qualquer gráfico, ou seja, pode haver estradas entre 0-> 2, 0-> 3, 1-> 3 etc.)
Fonte: 0, Destino: 3, Tanque: 10 unidades
Preços de combustível: 0 : 10 unidades, 1 : 10 unidades, 2 : 20 unidades, 3 : 12 unidades
Comprimentos: 0-> 1 : 9 unidades, 1-> 2 : 1 unidade, 2-> 3 : 7 unidades
Solução ideal: preencha 9 unidades em 0 e 8 unidades em 1. O custo total será de 170 unidades (9 * 10 + 8 * 10).
Então, tentei calculá-lo como mostrado aqui (parágrafo 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?
A recorrência do documento não parece funcionar ou o que é mais provável que eu faça algo errado.
Alguém poderia me ajudar com isso?
fonte
Usando a solução @j_random_hacker, precisamos transformar nosso gráfico em um gráfico completo e alterar a condição da equação (4) para:
O gráfico completo deve ficar assim:
e cálculos finais:
Caminho através de 0 -> 1 -> 3 [custo total 170 $] é a solução. É o que esperávamos :-). Se precisarmos de uma rota, poderemos transformar essas arestas extras da solução nas arestas especificadas no início (não deve ser muita dificuldade).
Só me pergunto como devemos evitar impasses nessa recorrência. Por exemplo, pode haver deadloop entre 0 <-> 1, porque c (0) <= c (1) ec (1) <= c (0).
fonte
A idéia é obter o combustível conforme necessário na tarifa mais barata onde quer que você esteja (paradigma de algoritmo ganancioso)
Veja alguns exemplos. no seu exemplo
Fonte: 0, Destino: 3, Tanque: 10 unidades Preços de combustível: 0: 10 unidades, 1: 10 unidades, 2: 20 unidades, 3: 12 unidades Comprimentos: 0-> 1: 9 unidades, 1-> 2: 1 unidade, 2-> 3: 7 unidades
Eu tenho que viajar 9 unidades no começo, então eu preciso encher meu tanque em 0 com> = 9 unidades (capacidade> = 9). Agora, vejo em 1,2,3 que a taxa de combustível é> = taxa de combustível em 0. Como eu quero comprar o combustível necessário na taxa mais barata, tentarei encher 9 + 1 + 7 = 17 unidades em somente cidade 0. Mas, a capacidade do tanque pode ser <17, digamos 10. Então, vou encher até 10. Então, em 1, tenho 1 unidade de combustível restante e tenho que percorrer 8 unidades a mais, então em 1 encher 7 unidades mais. Não consigo preencher 2, porque a taxa seria maior. Meu, custo total = 10 * 10 + 7 * 10 = 170.
i) cheio = 0
fonte