Quindi sto implementando l'algoritmo A * in C. Ecco la procedura.Implementazione algoritmo A *
Sto usando la coda prioritaria [usando la matrice] per tutti i nodi aperti. Dato che avrò distanze duplicate, cioè più di un nodo con la stessa distanza/priorità, quindi mentre si inserisce un nodo in PQ, se il genitore del nodo inserito ha la stessa priorità, lo scambio ancora entrambi, in modo che il mio più recente il membro inserito rimane in alto (o il più alto possibile), in modo da continuare a seguire una particolare direzione. Inoltre, durante la rimozione, quando scambio l'elemento più in alto con l'ultimo, poi di nuovo, se l'ultimo elemento scambiato ha lo stesso di uno dei suoi figli, allora viene scambiato verso il basso. (Non sono sicuro che questo influenzerà in ogni modo).
Ora il problema è dire che ho una matrice 100 * 100 e ho ostacoli da (0,20) a (15,20) dell'array 2D, in cui mi sto muovendo. Ora per una posizione di partenza (2,2) e una posizione di fine (16,20) ottengo un percorso rettilineo, cioè, prima di tutto andiamo a destra, poi scendo fino a 15 poi muovo di una destra e ho finito.
Ma, se ho iniziato come (2,2) e ultimo come (12,78) cioè i punti sono separati dagli ostacoli e il percorso deve aggirarlo, continuo a passare (16,20) e il mio percorso dopo (16,20) è ancora dritto, ma il mio percorso fino a (16,20) è a zig zag, cioè vado un po 'in basso, poi a destra, poi a destra e così via, raggiungendo infine (16 , 20) e andando subito dopo.
Perché questo percorso a zig zag per la prima metà della distanza, cosa posso fare per assicurarmi che il mio percorso sia dritto, così com'è, quando la mia destinazione è (16,20) e non (12,78) .
Grazie.
void findPath(array[ROW][COLUMN],sourceX,sourceY,destX,destY) {
PQ pq[SIZE];
int x,y;
insert(pq,sourceX,sourceY);
while(!empty(pq)) {
remove(pq);
if(removedIsDestination)
break; //Path Found
insertAdjacent(pq,x,y,destX,destY);
}
}
void insert(PQ pq[SIZE],element){
++sizeOfPQ;
PQ[sizeOfPQ]==element
int i=sizeOfPQ;
while(i>0){
if(pq[i].priority <= pq[(i-1)/2].priority){
swapWithParent
i=(i-1)/2;
}
else
break;
}
}
mostrare le parti pertinenti (!) Del codice. Il codice dice più di mille parole. – Femaref
@Femaref Fatto questo, fammi sapere se è d'aiuto. –
Questo probabilmente ha a che fare con il tuo punteggio - che non mostri. – Hogan