es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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)

Tags:  , ,

Answer

  1. Avatar for 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ón linear_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:

    import numpy as np
    from scipy.optimize import linear_sum_assignment
    
    # Genera una matriz de distancias aleatorias entre N x e M y pares
    N, M = 10, 5
    distancias = np.random.rand(N, M)
    
    # Aplica la restricción máxima de asignación (límite de 4 x a 1 y)
    max_asignaciones = 4
    for i in range(M):
        exceso = max(0, np.count_nonzero(distancias[:, i]) - max_asignaciones)
        if exceso > 0:
            distancias[:, i] += (exceso + 1) * np.max(distancias) # establece un costo alto
    
    # Utiliza el algoritmo de Hungría para encontrar la asignación óptima
    fila_ind, col_ind = linear_sum_assignment(distancias)
    
    # Filtra las asignaciones excesivas que violan el límite máximo de asignación
    for i in range(M):
        if np.count_nonzero(fila_ind == i) > max_asignaciones:
            # Elimina las asignaciones excesivas
            fila_ind[fila_ind == i][max_asignaciones:] = -1
            col_ind[fila_ind == i][max_asignaciones:] = -1
    
    # Imprime la matriz de asignación final
    asignacion = np.zeros((N, M), dtype=bool)
    asignacion[fila_ind, col_ind] = True
    print(asignacion)
    

    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.

Comments are closed.