Se stai cercando una soluzione semplice, posso suggerire un po 'di randomizzazione?
Ciò che intendo è questo: nell'esempio di codice cokeandcode, esiste il nested-for-loops che genera gli "stati successivi" (per utilizzare il termine AI). Mi riferisco al punto in cui circola sul quadrato 3x3 attorno allo stato "corrente", aggiungendo nuove posizioni sulla pila da considerare.
Una correzione relativamente semplice dovrebbe (dovrebbe :)) essere isolare quel codice un po 'e farlo, ad esempio, generare un elenco di nodi collegato prima del resto della fase di elaborazione. Quindi Containers.Shuffle (o è Generics.Shuffle?) Quell'elenco collegato e continua l'elaborazione lì. Fondamentalmente, dire una routine, "createNaiveNeighbors (node)" che restituisce una LinkedList = {(node.x-1, node.y), (node.x, node.y-1) ...} (per favore perdonare il pidgin Java, sto cercando (e sempre fallendo) di essere breve
Una volta creato l'elenco collegato, tuttavia, dovresti essere in grado di fare un "for (Node n: myNewLinkedList)" invece di il
for (int x=-1;x<2;x++) {
for (int y=-1;y<2;y++) {
e continuare a utilizzare lo stesso codice esatto corpo!
cosa questo avrebbe fatto, idealmente, è una sorta di percorsi "scuotere" l'ordine dei nodi considerati, e creare più vicino al la diagonale, ma senza dover cambiare l'euristica. I percorsi saranno comunque i più efficienti, ma di solito più vicino alla diagonale.
Lo svantaggio è, ovviamente, se si passa da A a B più volte, può essere preso un percorso diverso. Se ciò è inaccettabile, potrebbe essere necessario prendere in considerazione una modifica più drastica.
Spero che questo aiuti! -Agor
+1 per il video –
D'accordo, il video è un'idea eccellente. –
Yeh, Screenjelly è fantastico per cose come questa! – Relequestual