È possibile provare un approccio euristico utilizzando gli strumenti AI esistenti per le ottimizzazioni, ad esempio Genetic Algorithms o Hill Climbing.
Darò più dettagli sull'arrampicata in collina, dato che è il mio preferito.
rappresentare il vostro problema come stati graphG = (V,E)
tale che V = {all possible states }
e E = {(u,v) | swapping one player you can move from u to v }
.
Inoltre, sia u:V->R
una funzione di utilità per una formazione.
Dal momento che non vogliamo per generare il grafico, cerchiamo next:V->2^V
essere una funzione tale che next(v) = {all possible formation that you can get by changing one player }
L'idea di hill climbing è quello di inizio da una formazione a caso, e avidamente fare il miglior cambio possibile, quando si è bloccato - riavviare l'algoritmo da una nuova formazione casuale.
1. best<- -INFINITY
2. while there is more time
3. choose a random matching
4. NEXT <- next(s)
5. if max{ u(v) | for each v in NEXT} < u(s): //s is a local maximum
5.1. if u(s) > best: best <- u(s) //if s is better then the previous result - store it.
5.2. go to 2. //restart the hill climbing from a different random point.
6. else:
6.1. s <- max { NEXT }
6.2. goto 4.
7. return best //when out of time, return the best solution found so far.
Si noti che questa variazione di hill climbing (collina arrampicata con riavvii casuali) è un any time algorithm - il che significa che diventerà migliore quando viene dato più tempo, e quando viene dato un tempo infinito - si fonda la massima globale .
Puzza NP-Hard (anche se non ho in mente la riduzione) Vorresti un approccio euristico? – amit
Sì, per favore, qualsiasi cosa faccia il lavoro velocemente! –
Se è "semplice" come mettere i giocatori con il punteggio più alto in ogni posizione della formazione, allora un algoritmo avido dovrebbe comportarsi abbastanza bene. Sono d'accordo con l'approccio euristico poiché non c'è bisogno di guardare * ogni * combinazione diversa. – Zairja