Provo a spiegarmi più dettagliatamente...

L'approccio che ho bisogno di dare al problema del commesso viaggiatore è quello di tipo Nearest Neighbor. Più nel dettaglio su un piano cartesiano ho una lista di "n" (compreso tra 50 e 100) nodi (x,y).
Il mio scopo è trovare un algoritmo che possa toccarli tutti nel minor cammino possibile tenendo in considerazione che il nodo n+1 dev'essere adiacente al nodo n.

Ora sulla base di questa premessa proseguo con l'esempio pratico. Ho una mappa di nodi ordinati come si vede in questa figura e vorrei invece trovare un algoritmo di ordinamento degli stessi che mi produca un'output come questo o qualcosa di molto simile.

Nel primo caso il routing è chiaramente poco ottimizzato, nel secondo invece vorrei riuscire a creare un algoritmo euristico con la logica del "vicino più vicino".

Per lo scopo ho costruito un array aventi come chiave la coordinata del nodo "n"esimo e come valore la lista di nodi adiacenti:

codice:
Node [124,110] : Nearest are [124,106] , [128,106] , [128,110] , [124,114] , [128,114]
Node [124,106] : Nearest are [124,110] , [125,102] , [128,106] , [128,110]
Node [125,102] : Nearest are [124,106] , [127,100] , [128,106] , [129,102]
Node [127,100] : Nearest are [125,102] , [129,102] , [129,97] , [131,98]
Node [128,106] : Nearest are [124,110] , [124,106] , [125,102] , [128,110] , [132,106] , [129,102] , [132,110]
Node [128,110] : Nearest are [124,110] , [124,106] , [128,106] , [132,106] , [132,110] , [124,114] , [128,114] , [132,114]
Node [132,106] : Nearest are [128,106] , [128,110] , [129,102] , [132,110] , [136,106] , [133,102] , [136,110]
Node [129,102] : Nearest are [125,102] , [127,100] , [128,106] , [132,106] , [131,98] , [133,102]
Node [129,97] : Nearest are [127,100] , [131,98] , [133,94]
Node [131,98] : Nearest are [127,100] , [129,102] , [129,97] , [133,102] , [135,98] , [133,94]
Node [132,110] : Nearest are [128,106] , [128,110] , [132,106] , [136,106] , [136,110] , [128,114] , [132,114] , [136,114]
Node [136,106] : Nearest are [132,106] , [132,110] , [133,102] , [136,110] , [137,102] , [140,110] , [140,106]
Node [133,102] : Nearest are [132,106] , [129,102] , [131,98] , [136,106] , [135,98] , [137,102]
Node [135,98] : Nearest are [131,98] , [133,102] , [133,94] , [137,102] , [137,94] , [139,98]
Node [133,94] : Nearest are [129,97] , [131,98] , [135,98] , [137,94]
Node [124,118] : Nearest are [124,114] , [128,114] , [128,118] , [126,122]
Node [124,114] : Nearest are [124,110] , [128,110] , [124,118] , [128,114] , [128,118]
Node [136,110] : Nearest are [132,106] , [132,110] , [136,106] , [132,114] , [136,114] , [140,110] , [140,106] , [140,114]
Node [137,102] : Nearest are [136,106] , [133,102] , [135,98] , [140,106] , [141,102] , [139,98]
Node [137,94] : Nearest are [135,98] , [133,94] , [139,98] , [141,94]
Node [128,114] : Nearest are [124,110] , [128,110] , [132,110] , [124,118] , [124,114] , [128,118] , [132,114] , [132,118]
Node [128,118] : Nearest are [124,118] , [124,114] , [128,114] , [126,122] , [132,114] , [132,118] , [130,122]
Node [126,122] : Nearest are [124,118] , [128,118] , [128,123] , [129,126] , [130,122]
Node [128,123] : Nearest are [126,122] , [129,126] , [130,122]
Node [129,126] : Nearest are [126,122] , [128,123] , [130,122] , [133,126] , [133,128]
Node [132,114] : Nearest are [128,110] , [132,110] , [136,110] , [128,114] , [128,118] , [132,118] , [136,114] , [136,118]
Node [132,118] : Nearest are [128,114] , [128,118] , [132,114] , [130,122] , [136,114] , [136,118] , [134,122]
Node [130,122] : Nearest are [128,118] , [126,122] , [128,123] , [129,126] , [132,118] , [133,126] , [134,122]
Node [133,126] : Nearest are [129,126] , [130,122] , [133,128] , [134,122] , [137,126] , [137,128]
Node [133,128] : Nearest are [129,126] , [133,126] , [137,126] , [137,128]
Node [136,114] : Nearest are [132,110] , [136,110] , [132,114] , [132,118] , [136,118] , [140,110] , [140,114] , [140,118]
Node [136,118] : Nearest are [132,114] , [132,118] , [136,114] , [134,122] , [140,114] , [140,118] , [138,122]
Node [134,122] : Nearest are [132,118] , [130,122] , [133,126] , [136,118] , [137,126] , [138,122]
Node [137,126] : Nearest are [133,126] , [133,128] , [134,122] , [137,128] , [138,122] , [141,126] , [141,129]
Node [137,128] : Nearest are [133,126] , [133,128] , [137,126] , [141,126] , [141,129]
Node [140,110] : Nearest are [136,106] , [136,110] , [136,114] , [140,106] , [144,106] , [144,110] , [140,114] , [144,114]
Node [140,106] : Nearest are [136,106] , [136,110] , [137,102] , [140,110] , [141,102] , [144,106] , [144,110]
Node [141,102] : Nearest are [137,102] , [140,106] , [139,98] , [143,98] , [145,102] , [144,106]
Node [139,98] : Nearest are [135,98] , [137,102] , [137,94] , [141,102] , [141,94] , [143,96] , [143,98]
Node [141,94] : Nearest are [137,94] , [139,98] , [143,96] , [143,98]
Node [143,96] : Nearest are [139,98] , [141,94] , [143,98] , [147,98]
Node [143,98] : Nearest are [141,102] , [139,98] , [141,94] , [143,96] , [145,102] , [147,98]
Node [145,102] : Nearest are [141,102] , [143,98] , [144,106] , [147,98] , [148,101] , [149,102] , [148,106]
Node [144,106] : Nearest are [140,110] , [140,106] , [141,102] , [145,102] , [144,110] , [148,106] , [148,110]
Node [144,110] : Nearest are [140,110] , [140,106] , [144,106] , [148,106] , [148,110] , [140,114] , [144,114] , [148,114]
Node [147,98] : Nearest are [143,96] , [143,98] , [145,102] , [148,101] , [149,102]
Node [148,101] : Nearest are [145,102] , [147,98] , [149,102] , [151,105]
Node [149,102] : Nearest are [145,102] , [147,98] , [148,101] , [148,106] , [151,105]
Node [148,106] : Nearest are [145,102] , [144,106] , [144,110] , [149,102] , [148,110] , [151,105] , [151,109]
Node [148,110] : Nearest are [144,106] , [144,110] , [148,106] , [151,109] , [144,114] , [148,114] , [151,113]
Node [151,105] : Nearest are [148,101] , [149,102] , [148,106] , [151,109]
Node [151,109] : Nearest are [148,106] , [148,110] , [151,105] , [151,113]
Node [140,114] : Nearest are [136,110] , [136,114] , [136,118] , [140,110] , [144,110] , [140,118] , [144,114] , [144,118]
Node [140,118] : Nearest are [136,114] , [136,118] , [140,114] , [138,122] , [144,114] , [142,122] , [144,118]
Node [138,122] : Nearest are [136,118] , [134,122] , [137,126] , [140,118] , [142,122] , [141,126]
Node [144,114] : Nearest are [140,110] , [144,110] , [148,110] , [140,114] , [140,118] , [144,118] , [148,118] , [148,114]
Node [142,122] : Nearest are [140,118] , [138,122] , [141,126] , [145,126] , [146,122] , [144,118]
Node [141,126] : Nearest are [137,126] , [137,128] , [138,122] , [142,122] , [142,127] , [141,129] , [145,126]
Node [142,127] : Nearest are [141,126] , [141,129] , [145,126]
Node [141,129] : Nearest are [137,126] , [137,128] , [141,126] , [142,127] , [145,126]
Node [145,126] : Nearest are [142,122] , [141,126] , [142,127] , [141,129] , [146,122] , [148,124]
Node [146,122] : Nearest are [142,122] , [145,126] , [144,118] , [148,118] , [148,124] , [150,121]
Node [144,118] : Nearest are [140,114] , [140,118] , [144,114] , [142,122] , [146,122] , [148,118] , [148,114]
Node [148,118] : Nearest are [144,114] , [146,122] , [144,118] , [148,114] , [150,121] , [151,117]
Node [148,114] : Nearest are [144,110] , [148,110] , [144,114] , [144,118] , [148,118] , [151,117] , [151,113]
Node [148,124] : Nearest are [145,126] , [146,122] , [150,121]
Node [150,121] : Nearest are [146,122] , [148,118] , [148,124] , [151,117]
Node [151,117] : Nearest are [148,118] , [148,114] , [150,121] , [151,113]
Node [151,113] : Nearest are [148,110] , [151,109] , [148,114] , [151,117]
Posto che uno degli nodi adiacenti dev'esser sequenzialmente successivo al nodo corrente, come posso calcolare la lista di possibili combinazioni che mi permettando di toccare tutti i nodi (una sola volta naturalmente?!?).
Sulla base delle possibili combinazioni calcolo la distanza di ciascuna ed estraggo la minima.

Detto questo vi ringrazio per aver iniziato ad approcciare il mio problema.

Ciao,
Stefano