Trovare il percorso di costo più basso - dinamico

0

Devo scrivere un algoritmo dinamico per trovare il percorso di costo più basso. Quindi ho un punto che devo visitare. Posso saltare solo tra punti per distanza - 5 Ho una serie di distanze da 0 punti per esempio (1 3 5 10 15 20 21 22). Ogni mossa mi è costata 1. Quindi il percorso migliore sarà quello di spostare 1- > 5- > 15- > 20- > 22 (3 e 21 posso saltare).

Puoi darmi suggerimenti, come programmarlo in modo dinamico? Stavo pensando di fare qualcosa del genere: trovare la soluzione per array [0] e array [1] (è facile che ci sia solo una soluzione da 1 (1- > 3)) quindi aggiungere array [2], e trovare la soluzione migliore (1- > 5 inoltre c'è una soluzione 1- > 3- > 5 ma mi costerà 2 mosse) poi per 4 punti, 5 ecc.

Ma non so come iniziare a fare in modo che il mio algoritmo sia scritto corretto e dinamico. So che posso fare un algoritmo avido, ma non è questo il punto del compito ... Puoi darmi qualche suggerimento? Come iniziare? Come mantenere le soluzioni? e trova i migliori?

    
posta jondetra 07.03.2014 - 01:08
fonte

2 risposte

2

Un altro approccio ( graph search ):

Passaggio1:analisideidatiiniziali

Consideracheognipuntoèunnodedieognipossibilespostamentoèunpathtraduenodi.

CreaunamatriceN*N(grafico)ecalcolailvaloredelpercorsotraciascunnodo.

  • percorso(A,B)=1:seabs(nodeA-nodeB)<=5

altro

  • percorso(A,B)=MAXINT

Passaggio 2: calcola il percorso più breve

Applica un algoritmo di ricerca veloce del grafico (ad es. l'algoritmo di Dijkstra ) alla tua matrice.

    
risposta data 07.03.2014 - 11:08
fonte
0

Mi sembra che, per il problema dato, avida sia sempre la migliore.

Tuttavia, in generale, passerei da sinistra a destra attraverso l'elenco, mantenendo un elenco completo di tutte le possibilità; se ci sono due o più possibilità che ti atterrerebbero nello stesso punto, poti ogni possibilità che non è la più efficiente (a seconda della domanda, potresti anche potare tutte tranne una delle soluzioni identicamente efficienti). Elimina regolarmente ogni soluzione che è un vicolo cieco.

Quindi, per il tuo esempio (elencherò ogni possibilità tra parentesi):

  • Passa al primo elemento dell'array - 1. Devi iniziare da qui, quindi rendi questo il tuo elenco di possibilità: (1)
  • Passa all'elemento successivo dell'array - 3
  • Per ogni elemento nel tuo elenco di possibilità, copialo, aggiungi l'elemento nell'array e aggiungilo all'elenco di possibilità: (1), (1,3)
  • Elimina qualsiasi possibilità non valida o possibilità che non possono mai essere valide (nessuna ancora)
  • Per qualsiasi coppia di possibilità che finiscono nello stesso posto, elimina tutto tranne il più efficiente (ancora nessuno)
  • Passa alla voce successiva del tuo elenco - 5
  • Per ogni elemento del tuo elenco di possibilità, copialo, aggiungi l'elemento nell'array e aggiungilo all'elenco di possibilità: (1), (1,3), (1,5), (1 , 3,5)
  • Elimina qualsiasi possibilità non valida o possibilità che non possono mai essere valide (nessuna ancora)
  • Per ogni coppia di possibilità che finiscono nello stesso posto, spoglia tutto tranne il più efficiente. (1,5) e (1,3,5) entrambi terminano con 5 e (1,5) è più efficiente, quindi elimina (1,3,5).
  • Passa al prossimo elemento del tuo elenco - 10
  • Per ogni elemento del tuo elenco di possibilità, copialo, aggiungi l'elemento nell'array e aggiungilo all'elenco di possibilità: (1), (1,3), (1,5), (1 , 10), (1,3,10), (1,5,10)
  • Elimina qualsiasi possibilità non valida o possibilità che non possono mai essere valide. (1,10) e (1,3,10) non sono validi, e (1) e (1,3) non saranno mai validi (ipoteticamente, (1,5) potrebbe essere valido, se questo 10 è seguito da un altro 10 ). Questo lascia (1,5), (1,5,10)
  • Per qualsiasi coppia di possibilità che finiscono nello stesso posto, elimina tutte tranne le più efficienti (nessuna trovata).
  • Passa alla voce successiva del tuo elenco - 15
  • Per ogni elemento del tuo elenco di possibilità, copialo, aggiungi l'elemento nell'array e aggiungilo all'elenco delle possibilità: (1,5), (1,5,10), (1,5 , 15), (1,5,10,15),
  • Elimina qualsiasi possibilità non valida o possibilità che non possono mai essere valide. (1,5,15) non è valido e (1,5) non sarà mai valido. Questo lascia (1,5,10), (1,5,10,15)
  • Per qualsiasi coppia di possibilità che finiscono nello stesso posto, elimina tutte tranne le più efficienti (nessuna trovata).
  • Lavare, risciacquare, ripetere.

Quindi il metodo generale è:

  • rende le cose un po 'più complicate
  • rimuovi quelli che puoi rimuovere
risposta data 07.03.2014 - 01:57
fonte

Leggi altre domande sui tag