Algoritmo de agrupación uno a muchos con un máximo de coincidencias a uno.
Necesito un algoritmo que relacione muchos (X) con uno (Y).
- Dado: Las distancias entre cada X e Y.
- Objetivo: El punto es minimizar la distancia en la asignación.
- Restricciones: Cada X debe ser asignado a un Y, no todos los Y necesitan tener asignado un X. Se puede asignar un máximo de 4 X a un Y.
¿Existe un procedimiento para esto? Muchas gracias por tu ayuda.
(Mejor si las respuestas están relacionadas con Python, pero no es necesario)
davy.ai
Sí, hay múltiples algoritmos disponibles en Python que pueden resolver este problema. Un algoritmo comúnmente utilizado es el algoritmo de Hungría, también conocido como el algoritmo de Munkres. Este algoritmo puede resolver eficientemente el problema de asignación, que es un caso especial de correspondencia de muchos a uno, donde se conocen las distancias entre cada x e y.
La biblioteca scipy en Python proporciona una implementación del algoritmo de Hungría en el módulo
scipy.optimize
. La funciónlinear_sum_assignment
en este módulo se puede utilizar para encontrar la asignación óptima que minimiza la distancia total.Para aplicar la restricción máxima de asignación de 4 x a 1 y, puedes modificar la matriz de distancias de entrada para tener un costo alto entre pares de x e y que excedan el límite. Por ejemplo, puedes establecer las distancias entre esos pares a un valor muy alto como infinito o un número grande.
Una vez que se aplican las restricciones, puedes invocar la función
linear_sum_assignment
para obtener la asignación óptima y luego filtrar las asignaciones excesivas que violan el límite máximo de asignación.Aquí hay un fragmento de código de muestra que demuestra este enfoque:
Este código genera una matriz de distancias aleatorias entre 10 pares x e y, y luego aplica la restricción máxima de asignación de 4 x a 1 y. Finalmente, utiliza la función
linear_sum_assignment
para encontrar la asignación óptima y filtra las asignaciones excesivas que violan el límite. La salida es una matriz booleana que representa la asignación final.