2016-07-04 42 views
8

Questa domanda è relativa a this one, derivava dall'ottimizzazione del percorso su un insieme di punti. La situazione è la seguente: Un oggetto percorre un percorso designato che consiste in un elenco di punti 2D. (Sono possibili più Ds, ma dato che ogni turno è tecnicamente 2D, la soluzione per le due dimensioni lo farà.) Ad ogni punto questo oggetto può cambiare la sua velocità con un vettore che la lunghezza massima è predeterminata (assegnata a un punto). La velocità alla fine del percorso è irrilevante. La domanda è: come determinare il tempo minimo trascorso percorrendo questo percorso? Esiste un algoritmo efficiente per questo compito? Un algoritmo avido può alla fine far rallentare l'oggetto in modo tale da essere sottoposto a scansione in caso di dati appositamente preparati, o addirittura non rendere l'oggetto in grado di tornare al suo prossimo punto designato. Un algoritmo avido di versioni precedenti è anche imperfetto con lo stesso errore, non sempre è buono arrivare alla fine alla massima velocità.Ridurre al minimo il tempo trascorso quando si viaggia su un percorso designato

Un esempio: il vettore punto è: {(0,0), (0,1), (1,1), (2,2)} e il vettore di lunghezza massima è {2.0, 2.0, 3.0}. Il punto viaggia ad esempio a (0,sqrt(2)) da p1 a p2, quindi a (sqrt(2),0) da p2 a p3 e con (s,s) a qualsiasi velocità massima s da p3 a p4. E questa potrebbe essere una soluzione subottimale, dire di rallentare di uno 0,01 da p1 a p2, permettendo di accelerare di un po 'da p2 a p3, poi di un altro da p3 a p4, con un tempo totale possibile inferiore a questo insieme di velocità.

+0

come fai a sapere che le svolte generiche in 3D sono effettivamente 2D? che dire delle mezzelivelli etc? –

+0

@willywonkadailyblah Questo compito non interessa i cicli e ogni singolo turno può essere interpretato come 2D utilizzando un piano 2D che contiene tutti e tre i punti e due linee tra il punto precedente, quello attuale e quello successivo. Quindi utilizzare più di due dimensioni qui è inutile, mentre il compito espanso esatto può utilizzare tutte le dimensioni necessarie. – Vesper

+0

Non intendo cicli, intendo forme di curve che non possono essere rappresentate come una curva planare, ad es. parte di una spirale –

risposta

5

Questo è un problema di ottimizzazione convessa, risolvibile mediante librerie di ottimizzazione non lineare comuni. In SciPy:

import numpy as np 
from scipy import optimize 

points = np.array([[0., 0.], [0., 1.], [1., 1.], [2., 2.]]) 
movements = np.diff(points, axis=0) 
lengths = np.linalg.norm(movements, axis=1) 
directions = movements/lengths[:, np.newaxis] 
max_acceleration = np.array([2., 2., 3.]) 

fun = lambda x: np.sum(lengths/x) 
x0 = np.repeat(.5 * np.amin(max_acceleration), len(movements)) 
bounds = [(0., max_acceleration[0])] + [(0., None)] * (len(movements) - 1) 
constraints = [ 
    dict(
     type='ineq', 
     fun=lambda x, j: max_acceleration[j + 1] - np.linalg.norm(x[j] * directions[j] - x[j + 1] * directions[j + 1]), 
     args=(i,)) for i in range(len(movements) - 1) 
] 
x = optimize.minimize(fun, x0, bounds=bounds, constraints=constraints).x 
print(x) 
+0

@NelsonYeung Sì, questa è la nozione non standard di "accelerazione" definita da questo problema. –

+0

Hmm, mi chiedo quali altri valori faccia 'optimize.minimize()' generate. Prova questo, all'inizio sembra che sia la soluzione reale, anche se numerica invece di analitica. Ad ogni modo, il compito è abbastanza difficile da aspettarsi che esista sempre una soluzione analitica. – Vesper

+2

@Nelson Penso che tu abbia bisogno di leggere di nuovo la domanda.Il viaggio tra due punti è in linea retta e l'accelerazione è istantanea quando arrivi ad un punto. Il percorso DOVREBBE comprendere linee rette e angoli acuti non fisici. –