Calcolare percorso più breve su scacchiera

di il
2 risposte

Calcolare percorso più breve su scacchiera

Salve,
per un progetto a cui sto lavorando ho bisogno di calcolare il percorso più veloce da una casella all'altra su una scacchiera. La "pedina" si può muovere solo verticalmente e orizzontalmente (non diagonalmente) e sulla scacchiera ci sono delle caselle occupate (che rappresentano gli ostacoli) che la pedina non può attraversare.
Esistono algoritmi per questo tipo di situazioni o sapete suggerirmi delle soluzioni?
Ho pensato di lavorare cercando di avvicinare le coordinate della pedina a quelle del punto di arrivo ma quando ci sono ostacoli di mezzo questo non funziona. Vi allego un esempio di una situazione del genere nel caso non mi fossi spiegato bene.

Grazie in anticipo

2 Risposte

  • Re: Calcolare percorso più breve su scacchiera

    Ciao,

    se non ho capito male il tuo problema è questo:
    https://www.geeksforgeeks.org/find-minimum-numbers-moves-needed-move-one-cell-matrix-another/
    Mi spiace per il codice in C++ o Python, ma credo sia traducibile

    Comunque si tratta di algoritmi BFS
    https://it.wikipedia.org/wiki/Ricerca_in_ampiezz

    Magari trovi qualcosa di più approfondito online (onestamente non è il mio campo - ho sempre usato la "pappa pronta")
  • Re: Calcolare percorso più breve su scacchiera

    Credo tu debba implementare un algortmo di tipo greedy, cioè basato su step successivi e ad ognuno verifichi che il parametro che tu stai utilizzando stia migliorando o meno.
    Quindi in sostanza ti serve una funziona che ti dia la "distanza" dal tuo obiettivo senza considerare le caselle occupate. Per la regola del tassista, ti basta fare la differenza delle cordinate, senza badare al fatto che si avanzi a zig zag o no.
    Parti dalla posizione blu e testi tale distanza sulle posizioni vicine e "scegli" quella che diminuisce maggiormente la distanza dall'obiettivo e ti segni i valori ottenuti. A parità di distanza scegli a caso. Ti sposti nella posizione scelta e fai lo stesso test e ti sposti nuovamente ovviamente sempre scartando le posizioni occupate

    Prima o poi così arriverai a destinazione e ti segni il risultato.

    Dopo torni indietro al "branch" precedente e scegli la seconda alternativa migliore e prosegui con l'algoritmo anche per questa seconda strada. Se ottieni un risultato finale migliore aggiorni la best route.

    Ora, secondo me, trovere una soluzione "ottima" con un numero di iterazioni basse è impossibile, perchè dovresti testarle tutte. L'algoritmo greedy però ti permette di raggiungere un risultato buono (magari ottimo) prefissando un numero di route ragionevolmente basso: tipo decidi di fare una decine di possibili rotte e poi ti fermi.
Devi accedere o registrarti per scrivere nel forum
2 risposte