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.

OptaPy Constraint para agrupar por 2 variables para el mismo objetivo

Estoy tratando de agregar una fábrica de restricciones utilizando OptaPy, la variante de OptaPlanner en Python (utilizando el inicio rápido de Planificación de Horarios Escolares como base) para programar partidos deportivos. Cada partido tiene 2 equipos, por lo que hay 2 variables en la clase Match: equipo1 y equipo2, junto con un intervalo de tiempo y una cancha.

¿Cómo puedo tener una restricción donde pueda recompensar o penalizar si un equipo (en cualquiera de las variables equipo1 o equipo2) ha sido asignado más de 2 partidos en un día?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para agregar esta restricción, puedes definir una nueva función en tu fábrica de restricciones que tome una lista de partidos y verifique la cantidad de partidos que se le ha asignado a cada equipo en un día.

    Aquí tienes un ejemplo de implementación:

    from optapy import ConstraintFactory, constraint
    
    @constraint(weight = "soft")
    def max_matches_per_day(matches):
        """Asegura que ningún equipo juegue más de 2 partidos por día"""
        partidos_equipo = {}
        for partido in partidos:
            for equipo in [partido.equipo1, partido.equipo2]:
                if equipo not in partidos_equipo:
                    partidos_equipo[equipo] = []
                partidos_equipo[equipo].append(partido.horario.fecha)
    
        for equipo, fechas_partidos in partidos_equipo.items():
            if len(set(fechas_partidos)) > 2:
                return len(fechas_partidos) - 2
        return 0
    
    cf = ConstraintFactory()
    cf.fromAnnotations()
    cf.addConstraint(max_matches_per_day)
    

    En este ejemplo, definimos una función max_matches_per_day que toma una lista de partidos y verifica cuántas veces ha jugado cada equipo en un día. Luego iteramos sobre cada equipo, verificamos la cantidad de fechas únicas en las que han jugado y devolvemos la diferencia entre eso y 2 (el máximo permitido de partidos por día) si es mayor que 0.

    Agregamos esta restricción a la fábrica de restricciones utilizando el método addConstraint(). El argumento weight="soft" indica que esta restricción es una restricción suave, lo que significa que no necesita cumplirse perfectamente, sino que se utiliza para guiar la búsqueda hacia mejores soluciones.

    Con esta restricción en su lugar, el algoritmo de búsqueda tratará de evitar asignar más de 2 partidos a un equipo en un día, pero puede romper esta restricción si hacerlo conduce a una solución mejor en general.

Comments are closed.