¿Cómo podemos maximizar las parejas para 12 golfistas jugando 3 rondas?

Tengo buenas y malas noticias para ti. La mala noticia es que su solución ya es óptima. ¡La buena noticia es que podemos probarlo, usando tecnología realmente genial!

En lugar de alimentar el problema al gran martillo de recocido simulado como lo hice la última vez, vamos a alimentarlo al martillo aún más grande de los solucionadores de restricciones pseudo-booleanos . Un solucionador PB es una generalización de un solucionador SAT; se necesita un conjunto de variables booleanas (por ejemplo, [matemáticas] x_1, x_2, x_3 \ in \ {0, 1 \} [/ matemáticas]) y un sistema lineal en estas variables con coeficientes enteros (por ejemplo, [matemáticas] x_1 – x_3 \ ge 0 [/ math], [math] x_2 – x_3 \ ge 0 [/ math], [math] x_1 + x_2 – x_3 \ le 1 [/ math]) e intenta optimizar una función lineal dada de las variables ( diga [math] 2 \ cdot x_1 – x_3 [/ math]) dadas estas restricciones.

Vamos a utilizar clasp, un solucionador PB gratuito y de código abierto:
http://www.cs.uni-potsdam.de/clasp/
(Este código debería funcionar con cualquier solucionador PB que acepte el formato OPB estándar; otro es MiniSat +).

Aquí hay un script de Python que genera las variables y restricciones que representan este problema de programación de golf, ejecuta el cierre para calcular el horario óptimo e interpreta la salida en un formato que podamos leer. Funciona durante aproximadamente 8 segundos y calcula el siguiente horario óptimo, en el que 27 de los 36 pares de jugadores opuestos juegan juntos (como su primera solución):

AB12 CD34 EF56
AC26 DE13 BF45
AE35 BC16 DF24

#!/usr/bin/python from subprocess import Popen, PIPE from tempfile import NamedTemporaryFile # Define the variables we're going to use. num_vars = 0 def new_var(): global num_vars num_vars += 1 return 'x' + str(num_vars) plays = {(p, r, g): new_var() for p in xrange(12) for r in xrange(3) for g in xrange(3)} constraints = [] # together_game[p1, p2, r, g] = plays[p1, r, g] AND plays[p2, r, g]. together_game = {} for p1 in xrange(12): for p2 in xrange(p1 + 1, 12): for r in xrange(3): for g in xrange(3): together_game[p1, p2, r, g] = new_var() constraints += [ ([[1, plays[p1, r, g]], [-1, together_game[p1, p2, r, g]]], '>=', 0), ([[1, plays[p2, r, g]], [-1, together_game[p1, p2, r, g]]], '>=', 0), ([[-1, plays[p1, r, g]], [-1, plays[p2, r, g]], [1, together_game[p1, p2, r, g]]], '>=', -1), ] # together[p1, p2] = exists r, g: together_game[p1, p2, r, g]. together = {} for p1 in xrange(6): for p2 in xrange(6, 12): together[p1, p2] = new_var() for r in xrange(3): for g in xrange(3): constraints.append( ([[1, together[p1, p2]], [-1, together_game[p1, p2, r, g]]], '>=', 0)) constraints.append( ([[1, together_game[p1, p2, r, g]] for r in xrange(3) for g in xrange(3)] + [[-1, together[p1, p2]]], '>=', 0)) # Each player plays in one game per round. for r in xrange(3): for p in xrange(12): constraints.append( ([[1, plays[p, r, g]] for g in xrange(3)], '=', 1)) # Assume each game has two players from each team. for r in xrange(3): for g in xrange(3): for t in xrange(2): constraints.append( ([[1, plays[p, r, g]] for p in xrange(t*6, (t + 1)*6)], '=', 2)) # Team members shouldn't play with each other more than once. for t in xrange(2): for p1 in xrange(t*6, (t + 1)*6): for p2 in xrange(p1 + 1, (t + 1)*6): constraints.append( ([[-1, together_game[p1, p2, r, g]] for r in xrange(3) for g in xrange(3)], '>=', -1)) # No one should play anyone else in all three rounds. for p1 in xrange(6): for p2 in xrange(6, 12): constraints.append( ([[-1, together_game[p1, p2, r, g]] for r in xrange(3) for g in xrange(3)], '>=', -2)) # Without loss of generality, round 1 is AB12 CD34 EF56. for g in xrange(3): for t in xrange(2): for p in xrange(t*6 + g*2, t*6 + (g + 1)*2): constraints.append( ([[1, plays[p, 0, g]]], '=', 1)) # Maximize the number of pairs of opposing players that play with each other. opt = [[-1, together[p1, p2]] for p1 in xrange(6) for p2 in xrange(6, 12)] # Run PB solver. f = NamedTemporaryFile() print >>f, '* #variable=', num_vars, '#constraint=', len(constraints) print >>f, 'min:', ' '.join(' '.join(str(s) for s in c) for c in opt), ';' for lhs, op, rhs in constraints: print >>f, ' '.join(' '.join(str(s) for s in c) for c in lhs), op, rhs, ';' f.flush() pr = Popen(['clasp', f.name], stdout=PIPE) # Interpret the output. s = set() for l in iter(pr.stdout.readline, ''): print l, if l.startswith('v '): s.update(l.split()[1:]) pr.wait() for r in xrange(3): for g in xrange(3): print ''.join("ABCDEF123456"[p] for p in xrange(12) if plays[p, r, g] in s), print 

Anders, eso es extremadamente impresionante. Ahora, por favor ve a construir una nave espacial y avanza nuestra especie.

La mejor manera de maximizar los emparejamientos y la DIVERSIÓN es otorgar puntos por cada nueve hoyos (usando un formato Ryder Cup). Así que todos juegan un partido de 9 hoyos contra todos los jugadores del otro equipo. Esperemos que el campo de golf no esté lleno y que tenga tiempo en el turno para cambiar los grupos (Grupo delantero uno AB12 y grupo2 CD34 – Atrás AB34 y CD12). Tendrás suerte un par de veces y los partidos del grupo 2 se decidirán antes de que comiencen el 9, por lo que no hay demora en el turno. Anders resolverá las matemáticas y proporcionará los grupos y cuando cambien.

Si tienes un chico que abandona, házmelo saber. Mi índice es un 8.4.

Tener 12 golfistas jugando 2 rondas, ¿podría hacerlo para que nadie juegue con la persona persona?

More Interesting

1 * 1 = 1 ¿probarlo prácticamente o resolverlo con cualquier aplicación en tiempo real?

¿Existe un protocolo de seguridad alternativo que pueda reemplazar semipreciosos grandes en caso de que se resuelva la factorización en tiempo polinómico?

¿Cuántos valores de C en la ecuación [matemáticas] x ^ 2-5x + c [/ matemáticas] dan como resultado raíces racionales, que son enteros?

Comisión de Servicio Público de la Unión (India): ¿Cómo son las matemáticas como un curso opcional para CSE 2014?

¿Hay más juegos Zero Sum o no Zero Sum?

¿Existe una ganancia real en la transmisión de información por medio de dos o más canales de ruido paralelos?

Cómo demostrar que la complejidad del espacio es en la mayoría de los casos complejidad

¿Qué es una versión simplificada de transformadas de Laplace?

¿Cómo se encuentra la longitud de la curva descrita por las ecuaciones paramétricas [matemáticas] x = e ^ t \ sen t [/ matemáticas] y [matemáticas] y = e ^ t \ cos t [/ matemáticas] para [matemáticas] 0 \ le t \ le \ pi [/ math]?

¿Cómo podemos demostrar que el eje xy el eje y son perpendiculares si el producto de sus pendientes no es igual a -1?

¿Cómo debo convertirme en un genio matemático en la clase 11?

Cómo resolver este problema de optimización usando el multiplicador de Lagrange: Dado x + y + z = 1, x-y + 2z = 2 y encontrar min, max de f (x, y, z) = {x} ^ {2} + 2 {y} ^ {2} + {z} ^ {2}

¿Qué símbolo matemático es equivalente a la palabra inglesa "is"?

¿Qué es la prueba de línea horizontal para funciones?

Si la suma de cuadrados está dada por k (k + 1) (2k + 1) / 6, entonces ¿cuál es el valor más pequeño de k para el cual la suma de los cuadrados será divisible por 100?