Genera en Python combinaciones de n elementos de una lista tomados de r en r y verifica el cumplimiento de las restricciones.
Supongamos que tenemos la siguiente lista que representa IDs de candidatos:
candidates = list(range(1,37))
Me gustaría generar, en un tiempo computacional asequible, una lista que contenga 6 listas de tuplas, que son las combinaciones de estos 36 candidatos tomados de 6 en 6, sin que ningún candidato coincida con otro candidato en cualquiera de las listas anteriores.
resul = []
Consideremos un ejemplo. La primera combinación válida se puede obtener de la siguiente manera:
ex1 = [(1, 2, 3, 4, 5, 6), (7, 8, 9, 10, 11, 12), (13, 14, 15, 16, 17, 18),
(19, 20, 21, 22, 23, 24), (25, 26, 27, 28, 29, 30), (31, 32, 33, 34, 35, 36)]
Entonces, podemos agregar ex1
a la lista:
resul.append(ex1)
Ahora me gustaría comenzar a generar combinaciones, por ejemplo, ex2
sería una combinación válida, ya que no se repiten elementos en cada tupla de la lista de tuplas de resul
:
ex2 = [(1, 8, 18, 23, 28, 33), (3, 7, 14, 24, 29, 34), (4, 9, 13, 20, 30, 35),
(5, 10, 15, 19, 26, 36), (6, 11, 16, 21, 25, 32), (2, 12, 17, 22, 27, 31)]
Entonces, ex2
también se puede agregar:
resul.append(ex2)
Otro caso, ex3
, no se podría agregar, ya que el 1 y el 5 ya están juntos en la primera tupla del primer elemento de la lista (ex1
):
ex3 = [(1, 12, 5, 25, 30, 35), ..., ..., ..., ..., ...]
Entonces, como mencioné, me gustaría obtener solo 6 elementos que cumplan con las restricciones anteriores y para esto me gustaría saber cómo generar estas combinaciones de 36 elementos tomados de a 6 y verificar el cumplimiento de las restricciones.
davy.ai
Para generar las combinaciones deseadas, podemos utilizar la función combinations del módulo itertools en Python. Esta función genera todas las combinaciones posibles de longitud 6 a partir de la lista dada de 36 candidatos. Podemos utilizar esta función para generar combinaciones y luego verificar si los ID de los candidatos ya están presentes en las listas anteriores de tuplas.
Un enfoque para verificar la viabilidad de una combinación generada es iterar sobre cada tupla en las listas anteriores de tuplas en resul y verificar si los ID de los candidatos en la tupla actual no se repiten. La siguiente función implementa este enfoque y devuelve solo las combinaciones viables:
Comenzamos inicializando una lista vacía resul para contener las combinaciones viables. Luego utilizamos un bucle for para generar todas las combinaciones de longitud 6 a partir de la lista de candidatos. Para cada combinación generada, verificamos si es viable iterando sobre las listas anteriores de tuplas en resul y verificando si los ID de los candidatos en la tupla actual no se repiten. Si la combinación es viable, la convertimos en una lista y luego en una lista de tuplas de longitud 6. Finalmente, agregamos esta lista de tuplas a resul. También dejamos de generar más combinaciones una vez que obtengamos 6 listas viables.
Al ejecutar la función generate_combinations(), debería devolver una lista que contiene 6 listas viables de tuplas, sin que ningún candidato coincida con otro candidato en ninguna de las listas anteriores.