Puede probar un enfoque heurístico utilizando las herramientas de IA existentes para optimizaciones, como Genetic Algorithms o Hill Climbing.
Daré más detalles sobre la escalada, ya que es mi favorita.
representar a su problema, ya que los estados graficarG = (V,E)
tal que V = {all possible states }
y E = {(u,v) | swapping one player you can move from u to v }
.
Además, deje que u:V->R
sea una función de utilidad para una formación.
Dado que no queremos para generar el gráfico, vamos next:V->2^V
ser una función tal que next(v) = {all possible formation that you can get by changing one player }
La idea de la escalada es inicio de una formación al azar, y con avidez hacer el mejor cambio posible, cuando esté atascado - reinicie el algoritmo de una nueva formación aleatoria.
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.
Tenga en cuenta que esta variación de subida de pendientes (Hill escalada con reinicios aleatorios) es un any time algorithm - lo que significa que llegará a ser mejor cuando se le da más tiempo, y cuando se da un tiempo infinito - se funda el máximo global .
Huele a NP-Hard (aunque no tengo una reducción en mi mente) ¿Te gustaría el enfoque heurístico? – amit
Sí, por favor, lo que sea que haga el trabajo rápido! –
Si es tan "simple" como poner a los jugadores mejor calificados en cada posición de la formación, entonces un algoritmo codicioso debería funcionar bastante bien. Estoy de acuerdo con tomar el enfoque heurístico ya que no hay necesidad de ver * cada * combinación diferente. – Zairja