Um amigo meu realmente me fez uma pergunta muito interessante relacionada à ciência da computação, e eu fico presa a ela há muito tempo.
O problema é: você tem que viajar km. O único posto de gasolina está no ponto de partida. Sua capacidade máxima do tanque de combustível é suficiente para km de viagem, você pode "enterrar" combustíveis no meio da viagem e guardá-lo para mais tarde.
Por exemplo, você pode percorrer km primeiro e enterrar km de combustível lá, e depois voltar a abastecer, para a próxima vez que puder recuperar os km de combustível que você deixou e chegar mais longe com ele.
Você precisa encontrar a maneira mais eficiente de chegar ao destino.
O que pensei em usar programação dinâmica, no entanto, você deve assumir que a distância percorrida antes de cada reabastecimento é um número inteiro em quilômetros, caso contrário, é difícil fazê-lo com DP, ainda não tentei programação linear , mas acho que é possível.
Você tem alguma idéia de como fazer isso? Ou alguma dica?
Mais importante ainda, que tipo de problema de cs é esse? é NP difícil? É solucionável por máquina ou é mais um problema matemático?
Mais alguns pensamentos:
- Como é um caminho contínuo, perguntando se é NP pode ser um pouco tolo, mas ainda estou muito curioso.
- e podem ser escolhidos deliberadamente para evitar cálculos complexos.
- Existe uma solução gananciosa? Ainda não consigo pensar em nada.
- Agora acho que é mais um problema de localização de padrões matemáticos, embora meu amigo afirme que é um problema de cs, por isso, decido manter este post.
E se você tiver artigos científicos ou livros didáticos relacionados a isso, diga-me, não sei por onde começar.
Respostas:
A ideia básica é fazern viagens, retornando ao início e reabastecendo em todas as viagens, exceto a última. Em cada viagem, menos na última, você deixará um pouco de combustível em um novo depósito. Você quer saber até onde pode ir na última viagem. Para facilitar os cálculos, diremos que um tanque cheio contém 1 (unidade) de combustível e essa quantidade levará uma distância de 1 (outra unidade) de distância.
Exemplo 1 (n=1 viagem). Trivial: dirija até ficar sem combustível. Distância percorridaD(1)=1 .
Exemplo 2 (n=2 ) Na primeira viagem, viajex distância, então você terá 1−x combustível restante. Deixe combustível apenas o suficiente no despejo 1 para permitir que você retorne ao início. Saindo1−2x no despejo 1 fará o truque. Na segunda viagem, começando com um tanque cheio, vá para o primeiro despejo (usandox combustível), complete o tanque (tomando x do lixão, deixando 1−3x ) e dirija até ficar sem combustível. Para maximizar a distância, precisaremos que o despejo esteja vazio,1−3x=0 , tão x=1/3 . A distância total que você percorrerá seráD(2)=1+1/3 .
O caso geral . Comn viagens, você vai bater despejo 1 2 n - 1 vezes, despejo 2 2 n - 3 vezes, despejo 3 2 n - 5 vezes e assim por diante. Para esvaziar os despejos na última viagem, colocaremos o despejo 1 à distância1 / ( 2 n - 1 ) , despeje 2 a uma distância maior 1 / ( 2 n - 3 ) , e assim por diante. Então a última viagem cobrirá
Essa (e uma variante) é conhecida como problema do jipe e é abordada em mais detalhes aqui .
fonte