Viajando com o caminho mais eficiente

7

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.100050

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.201010

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.
  • 1000 e podem ser escolhidos deliberadamente para evitar cálculos complexos.50
  • 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.

HenryHey
fonte
3
Meu primeiro pensamento é que a pesquisa A * provavelmente se sairá muito bem nesse problema.
Pseudônimo

Respostas:

5

A ideia básica é fazer nviagens, 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=1viagem). 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á 1xcombustível restante. Deixe combustível apenas o suficiente no despejo 1 para permitir que você retorne ao início. Saindo12xno 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 13x) e dirija até ficar sem combustível. Para maximizar a distância, precisaremos que o despejo esteja vazio,13x=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 2n-1 1 vezes, despejo 2 2n-3 vezes, despejo 3 2n-5vezes e assim por diante. Para esvaziar os despejos na última viagem, colocaremos o despejo 1 à distância1 1/(2n-1 1), despeje 2 a uma distância maior 1 1/(2n-3), e assim por diante. Então a última viagem cobrirá

D(n)=1 1+1 13+1 15++1 12n-1 1
Se definirmos o m-ésimo número harmônico ,
Hm=1 1+1 12+1 13+1 14+1 15++1 1m
então é sabido que Hmemm e podemos escrever a nossa distância
D(n)=1 1+1 13+1 15++1 12n-1 1=(1 1+1 12+1 13++1 12n-1 1)-(1 12+1 14++1 12n-2)=H2n-1 1-1 12Hn-1 1
Isso levará uma quantidade de viagens (e combustível) que são exponenciais na distância desejada. Por exemplo, para percorrer uma distância de2, vai levar n=8 viagens e percorrer uma distância de 5 vou levar 3093 viagens.

Essa (e uma variante) é conhecida como problema do jipe e é abordada em mais detalhes aqui .

Rick Decker
fonte
11
Eu criei um programa java simples para executar isso, para ir a uma distância de 5, ele precisa de 3093 viagens, bons fatos :). E para completar essa jornada de 1000 km são necessários mais de1048.viagens.
HenryHey