Ho un numero di punti su una griglia bidimensionale relativamente piccola, che si avvolge in entrambe le dimensioni. Le coordinate possono essere solo numeri interi. Ho bisogno di dividerli in gruppi di N punti al massimo vicini, dove N sarà un bel po 'tagliato, sospetto che al massimo 10.Raggruppamento di coordinate intere da 2d in serie di N al massimo
Sto progettando un'intelligenza artificiale per un gioco, e sono sicuro al 99% che usare minimix su tutti i pezzi del gioco mi darà un aspetto utilizzabile di circa 1 mossa, se è così. Comunque i pezzi di gioco distanti non dovrebbero influenzarsi a vicenda fino a quando non guardiamo avanti da un numero elevato di mosse, quindi voglio dividere il gioco in un numero di sotto-giochi di N pezzi alla volta. Tuttavia, ho bisogno di assicurarmi di selezionare un ragionevole N pezzi alla volta, cioè quelli che sono vicini tra loro.
Non mi interessa se i valori anomali vengono lasciati soli o raggruppati con il cluster meno distante. Rompere i gruppi naturali più grandi di N è inevitabile, e deve solo essere abbastanza ragionevole. Poiché viene utilizzato in un AI di gioco con un tempo di risposta limitato, sto cercando un algoritmo il più veloce possibile e disposto a scambiare la precisione per le prestazioni.
Qualcuno ha qualche suggerimento per gli algoritmi di guardare all'adattamento? K-means e parenti non sembrano appropriati, dato che non so quanti cluster voglio trovare ma ho un limite su quanto grandi cluster voglio. Ho visto alcune prove che l'approssimazione di una soluzione mediante l'aggancio di punti a una griglia può aiutare alcuni algoritmi di clustering, quindi spero che le coordinate intere rendano il problema più semplice. Il clustering gerarchico basato sulla distanza sarà facile da adattare alle coordinate del wrap-around, in quanto inserisco semplicemente una funzione di distanza diversa e anche relativamente facile da limitare la dimensione dei cluster. Ci sono altre idee che dovrei guardare?
Sono più interessato agli algoritmi che alle librerie, anche se le biblioteche con una buona documentazione di come funzionano sarebbero benvenute.
EDIT: Originariamente ho posto questa domanda mentre stavo lavorando su una voce per lo Fall 2011 AI Challenge, che purtroppo non ho mai finito. La pagina a cui mi sono collegato ha una descrizione ragionevolmente breve e di alto livello del gioco.
I due punti chiave sono:
- Ogni giocatore ha un numero potenzialmente elevato di formiche
- Ogni formica è dato ordini di ogni turno, spostando 1 quadrato o nord, sud, est o ovest; questo significa che il fattore di ramificazione del gioco è O (4 formiche).
Nel concorso c'erano anche rigidi limiti di tempo per ogni turno del robot. Avevo pensato di avvicinarmi al gioco usando minimax (i turni sono davvero simultanei, ma come euristica pensavo che sarebbe andato tutto bene), ma temevo che non ci sarebbe stato il tempo di guardare avanti molte mosse se considerassi l'intero gioco subito. Ma siccome ogni form si muove di un solo quadrato per turno, due formiche non possono N spazi separati per la via più breve che possono interferire tra loro fino a quando non guardiamo avanti N/2 mosse.
Quindi la soluzione che stavo cercando era un buon modo per selezionare gruppi più piccoli di formiche alla volta e minimax ogni gruppo separatamente. Speravo che questo mi avrebbe permesso di cercare più in profondità nell'albero di spostamento senza perdere molta precisione. Ma ovviamente non ha senso usare un algoritmo di clustering molto costoso come un'euristica che fa risparmiare tempo!
Sono ancora interessato alla risposta a questa domanda, anche se più in quello che posso imparare dalle tecniche che in questa particolare competizione, dato che è finita!Grazie per tutte le risposte finora.
Quanto è grande la griglia? 10 "chiudi" significa tutti adiacenti o con spazi vuoti, ad es. gruppi su un tabellone? – denis
La griglia varia. Credo che facciano centinaia. Da vicino intendo idealmente più vicini tra loro che non pezzi nella partizione. Se ci sono solo 10 pezzi sulla scacchiera, una singola partizione può coprire l'intera scacchiera. Ma se c'è un gruppo di 20, deve essere diviso in due gruppi di 10; non dovrebbe esserci un gruppo che includa parte del gruppo e alcuni pezzi più distanti. – Ben
Penso che dovresti pubblicare maggiori dettagli sulle regole del gioco e su come i pezzi interagiscono tra loro.La tua ipotesi sulla necessità di creare questi gruppi in primo luogo potrebbe essere errata. – Fantius