Ho implementato qualcosa come questo here per risolvere un enigma noto come "Il giro del cavaliere". Credo che il problema dovrebbe coinvolgere quasi la stessa logica con alcune modifiche minori.
Piuttosto che parlare di traversate, cercherò di renderlo più accessibile - Da un punto qualsiasi, per rispondere alla domanda "qual è la prossima mossa migliore?" vuoi fare un passo in più e chiedi: "qual è il fattore più limitante?" In questo caso, il fattore più limitante, in base alle tue prossime mosse disponibili, è quanti mosse sono disponibili da ciascuna di quelle mosse. Ognuna delle tue prossime mosse disponibili avrà il suo set di mosse disponibili. La prossima mossa disponibile (s) con il minor numero di mosse disponibili successive sono i fattori più limitanti.
Quindi, per esempio, diciamo che ho mosse x, yez disponibili. Sia x che z hanno 2 mosse disponibili e y hanno 3 mosse disponibili successive - vuoi spostarti su xoz (non dovrebbe importare quale tu decida in modo da poterlo randomizzare come ho fatto nel mio codice).
Perché ha senso? Pensaci in un altro modo: le prossime mosse disponibili (x, yez nel nostro esempio) sono tutte le macchie che devi raggiungere ad un certo punto! Le prossime mosse disponibili per x, y e z potrebbero anche essere considerate come ottenere INDIETRO su x, yoz. Dal momento che ci sono un minor numero di modi per tornare a x e z, si potrebbe anche andare a uno di essi ora. Se x, ad esempio, avesse solo 1 mossa successiva disponibile (tutte le altre condizioni invariate), x sarebbe la tua unica opzione valida (e come ottimizzazione potresti immediatamente passare alla prossima mossa disponibile di x perché sai che c'è solo 1).
Il codice che ho fornito ha un sacco di cose di cui non devi preoccuparti, ma dovrebbe essere autonomo, quindi dovresti essere in grado di inserirlo in una pagina JSFiddle o html e dovrebbe funzionare. Le funzioni relative alla tua domanda sono getPossibleMoves
, getAvailableMoves
e getBestNextMove
(e tutte le funzioni che chiamano queste funzioni). I punti di interpolazione nella funzione getPossibleMoves
sono correlati a D3 e non qualcosa di cui devi preoccuparti. La funzione calcola semplicemente tutte le mosse possibili, in base alle regole di come un cavaliere può muoversi, da un punto (con le proprietà xey) e poi valuta semplicemente ognuno di questi punti per vedere se sono in conflitto. Non dovrebbe essere troppo difficile modificare questa funzione per adattarsi alle mosse consentite dal tuo robot e dovrai anche aggiornare la funzione che controlla se il punto è in grado di disabilitare anche i punti in cui ci sono muri.
di responsabilità: ho buttato questo codice insieme per divertimento quindi non è ottimizzato o con qualsiasi mezzo un ottimo esempio di pratiche di codifica in JavaScript
notare anche questo è solo un modo per risolvere questo problema. Ci sono certamente altri modi per risolverlo, ma questo è il modo più diretto che conosco per farlo.
Probabilmente stai cercando qualcosa come un [algoritmo di fill flood] (https://en.wikipedia.org/wiki/Flood_fill). –
Ho intenzione di dare un'occhiata più da vicino a questo, ma sembra essere giusto. – Cludch
Come si muove il bot? 1 cella per passaggio in 4 direzioni? 1 cella per passo in 8 direzioni? – vish4071