2016-07-02 20 views
15

Questo è solo qualcosa che mi è venuto in mente da solo, ma sembra un problema divertente e mi ha convinto.Percorso più veloce con accelerazione ai punti

Hai una serie di punti nello spazio bidimensionale, con un punto designato "Inizio" e uno "Fine". Ogni punto ha coordinate (in metri dall'origine), ma anche un "numero di accelerazione" (in metri/secondo di delta-V). Al raggiungimento di un punto (incluso l'inizio), è possibile accelerare fino al numero di accelerazione di quel punto in qualsiasi direzione. Il costo del bordo dipende dalla tua velocità attuale, ma devi anche muoverti nella direzione corretta.

Esiste un algoritmo efficiente per trovare il percorso più veloce fino al punto finale? Non ho trovato niente di meglio di "Prova ogni percorso e verifica i risultati". Gli algoritmi di Djikstra e altri semplici algoritmi non funzionano, perché non si può facilmente dire che un percorso verso un punto intermedio sia migliore o peggiore di un altro, se vi arriva con diverse velocità iniziali.

Se è troppo semplice, cosa succede se aggiungi il requisito che devi fermare al punto finale? (Ad esempio, è necessario avere un valore inferiore al suo valore di accelerazione quando si raggiunge la fine.)

MODIFICA: Per essere chiari, la direzione è importante. Si mantiene un vettore di velocità mentre si attraversa il grafico e l'accelerazione significa aggiungere un vettore ad esso, la cui magnitudine è limitata al numero di accelerazione di quel punto. Ciò significa che ci sono situazioni in cui la costruzione di un'enorme velocità è dannosa, poiché andrai troppo veloce per "indirizzare" verso altri punti preziosi/la tua destinazione.

+0

Dovrai fornire maggiori dettagli. Come funzionerebbe il tuo concetto di "accelerazione"? Riduce tutti i costi dei bordi lungo un percorso con il "numero di accelerazione"? Cosa succede se accumuli "numero di accelerazione" ben oltre i costi di bordo? Introdurre un concetto come "accelerazione" suggerisce che potrebbe essere utile introdurre un'idea corrispondente di attrito/trascinamento, altrimenti si potrebbe finire con una "velocità incontrollata". Finora, non penso che la tua domanda sia abbastanza chiara per noi da formulare una soluzione adeguata, ma penso che sia molto interessante. – lightalchemist

+2

Dubito che ci sia una soluzione analitica a questo problema. Vorrei iniziare risolvendo prima un problema molto più semplice: il percorso più veloce che prende i punti in un dato ordine. (Quel spazio di ricerca ha un numero di dimensioni pari al numero di punti intermedi, e non riesco a vedere un approccio migliore di ricottura.) Una volta che hai quel metodo, puoi creare un Dijkstra modificato. – Beta

+0

@ lightalchemist Con "Accelerazione", intendo "Cambio di velocità". (Quindi, costo di costa = distanza euclidea/velocità, ma permesso solo se stai viaggiando nella direzione giusta ... quindi) La velocità non selezionata va bene (è pensato per essere un puzzle matematico, non una simulazione ... anche se l'ho fatto inizialmente lo immagino per un veicolo spaziale che raccoglie le riserve di carburante, quindi l'attrito non sarebbe ancora una cosa.) –

risposta

3

Penso che il requisito che si usi l'accelerazione da ciascun punto una sola volta rende questo problema NP completo nel caso generale. Prendere in considerazione un ingresso che assomiglia a questo:

enter image description here

Se la "enorme distanza" tra il punto finale e il resto dei punti è grande abbastanza per dominare il costo della soluzione finale, trovando una soluzione ottimale sarà si riduce a trovare un modo per raccogliere il maggior numero di accelerazioni possibili dall'inizio del grafico. Se si consente solo a ciascun punto di essere passato una volta, ciò equivale al problema del percorso hamiltoniano, che è NP completo.

Detto questo, il problema ha alcune regole extra su di esso (le distanze sono euclide, il grafico è sempre completo) che potrebbe finire per rendere più facile il problema.

+1

Non penso che sia abbastanza il problema del percorso hamiltoniano (potrebbe essere più difficile , non più facile), perché non c'è alcuna garanzia che visitare ogni punto sia il migliore. L'accelerazione è in velocità, non solo la velocità di presa ... quindi se devi cambiare molto direzione per colpire ogni punto, potresti uscirne muovendoti più lentamente che se colpissi 4 o 5 che erano tutti approssimativamente vicini al tuo destinazione. –

+0

Umm ... Penso che potrebbe essere necessario specificare chiaramente la modalità di funzionamento della fisica nel modello. Quando l'ho letto ho capito che l'accelerazione era un semplice "aumento di velocità" che rendeva meno accessibili i futuri bordi. – hugomg

+0

Ok, modifica il problema per renderlo più chiaro. Stavo pensando che la direzione fosse importante (quindi se la tua velocità fosse abbastanza alta, non sarebbe effettivamente un grafico completo). Credo di essere d'accordo sul fatto che nel modo in cui lo descrivevi, in certe situazioni può arrivare a un percorso hamiltoniano. –

3

È possibile provare a risolvere questo problema all'indietro, tracciando ricorsivamente i percorsi dall'estremità verso l'altro nodo, quindi designare la massima velocità lungo la linea per poter passare da quel nodo a qualsiasi altro. La regola di eliminazione sarà se un percorso dal nodo corrente a quello successivo esiste con meno velocità e meno tempo trascorso dalla fine, il che significa che l'altro percorso è più ottimale di default perché può raggiungere più nodi e richiede meno tempo. Una volta che un percorso raggiunge il nodo iniziale, dovrebbe essere ricalcolato in base alla velocità massima raggiungibile all'avvio e memorizzata. Quindi raccogli il percorso con meno tempo speso.

È necessario cercare qualsiasi percorso disponibile qui, perché i percorsi disponibili sul grafico dipendono dallo stato passato con una meccanica indiretta, utilizzando meno velocità consente più scelte.

+0

Non sono sicuro di aver capito tutta la tua risposta ... mente chiarendo un paio di cose che potrebbero sembrare sbagliate per me? "indica la massima velocità lungo la linea per essere in grado di girare da quel nodo a qualsiasi altro" sembra che perda troppe informazioni, perché potresti essere in grado di raggiungere alcuni nodi e non altri o raggiungere alcuni nodi ma solo a intervalli di velocità che ti impedisce di raggiungere altri ancora, ecc. In "La regola di cancellazione avverrà se esiste un percorso dal nodo corrente al prossimo con meno velocità e meno tempo trascorso dalla fine", cosa intendi con "meno velocità?" A volte la velocità è buona. –

+0

Informazioni sulla "velocità massima" - può essere per nodo, un nodo più vicino al vettore consentirà velocità più elevate. "Minor velocità" significa che se stai interrogando il percorso AB, determina quale velocità può essere raggiunta girando in A per raggiungere B, scopri che c'è un percorso in B che viene da A ma impiega meno tempo a raggiungere B AND è più lento a AB, questo significa che il tuo percorso attuale resta indietro e può essere scartato. – Vesper

+0

Ma c'è un avvertimento a cui ho pensato: cosa succede se si avvia in A e si è in grado di visitare A per accelerare? Questo algoritmo fallirà quindi, se c'è un nodo dietro A. Imagine config: B --- A --- C, source è A, target è C, e puoi accelerare per 5 su A, e per 10 su B, con AC è piuttosto lungo. Il percorso corretto potrebbe finire in ABAC, diciamo se si viaggia a 4 da A a B, ritorno a 6 da B a A, e poi 11 da A a C, che sarà più veloce di andare a 5 da A a C direttamente, e più veloce di andare in ABC. – Vesper

Problemi correlati