Ho scritto un programma per risolvere un puzzle speciale, ma ora sono piuttosto bloccato al seguente problema: Ho circa 3200 punti / nodi / punti. Ciascuno di questi punti è collegato ad alcuni altri punti (di solito 2-5, il limite teorico è 1-26). Ho esattamente un punto di partenza e circa 30 punti di uscita (probabilmente tutti i punti di uscita sono collegati tra loro). Molti di questi 3200 punti non sono probabilmente collegati né ad inizio né a punto finale in alcun modo, come una rete separata, ma tutti i punti sono collegati ad almeno un altro punto.
Ho bisogno di trovare il numero più breve di hop per passare da entrata a uscita. Non c'è distanza tra i punti (a differenza del problema di routing su strada o treno), conta solo il numero di hop. Ho bisogno di trovare tutte le soluzioni con il minor numero di hop, e non solo una soluzione, ma tutte. E potenzialmente anche soluzioni con un altro hop ecc. Mi aspetto di avere una soluzione con circa 30-50 luppoli per andare dall'inizio alla fine.
Ho già provato:
1) provare casualmente le possibilità e ricominciare da capo quando il conteggio era più grande di una soluzione precedente. Ho ottenuto la prima soluzione con 3500 luppolo, dopo alcuni minuti è sceso a circa 97, ma guardando le soluzioni ho visto problemi come loop e cose inutili, quindi ho cercato di ottimizzare un po '(come non tornare da dove è venuto da ecc. .). Sono possibili ulteriori ottimizzazioni, ma questa cosa casuale non trova tutte le soluzioni migliori o richiede troppo tempo.
2) Passa in modo ricorsivo dall'inizio alla fine (come in una sorta di scacchi) e rompendo la prova quando ha raggiunto un punto precedente. Si trattava di un loop di circa 120 nodi, quindi cerca catene che sono (probabilmente) di gran lunga troppo lunghe. Se calcoliamo 4 possibilità e 120 nodi, stiamo raggiungendo 1,7E72 possibilità, che non è possibile calcolare attraverso. Questo è chiamato Depth-first search (DFS) come ho scoperto nel frattempo. Forse dovrei provare la ricerca di Breadth-first aggiungendo qualche coda?
Le connessioni tra i punti sono in realtà mosse che puoi effettuare nel gioco e i punti sono come apparirà il gioco dopo aver effettuato la mossa.
Quale sarebbe l'algoritmo da utilizzare per questo problema? Sto usando C # .NET, ma la lingua non dovrebbe avere importanza.