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 isEqual esIgual noEsIgual en python.

Estoy tratando de programar partidos deportivos en franjas horarias y me gustaría no tener franjas horarias vacías durante el día (para terminar lo más temprano posible). Creo que isEqual y isNotEqual deberían ayudar, pero estoy atascado en la sintaxis de la versión de Python. Creo que estoy cerca (código relevante a continuación)

en domain.py

@problem_fact
class Timeslot:
def init(self, id, match_date, date_str, start_time, end_time):
self.id = id
self.match_date = match_date
self.date_str = date_str # java no tiene un equivalente de fecha o fecha y hora, por lo que también se necesita una cadena
self.start_time = start_time
self.end_time = end_time

@planning_id
def get_id(self):
    return self.id

def __str__(self):
    return (
            f"Timeslot("
            f"id={self.id}, "
            f"match_date={self.match_date}, "
            f"date_str={self.date_str}, "
            f"start_time={self.start_time}, "
            f"end_time={self.end_time})"

)

en constraints.py

def fill_pitches_from_start(constraint_factory):
# Un campo no debería estar vacío si es posible
return constraint_factory \
.from_(TimeslotClass).ifNotExists(MatchClass, Joiners.equal(Timeslot.get_id(), Match.get_timeslot() ) ) \
.join(TimeslotClass).ifExists(MatchClass, Joiners.equal(Timeslot.get_id(), Match.get_timeslot())) \
.filter(lambda slot1, slot2: datetime.combine(slot1.date_str, slot1.timeslot.start_time) < datetime.combine(slot2.date_str, slot2.start_time) ) \
.penalize(“Campo vacío con campos posteriores completos”, HardSoftScore.ofSoft(10))

Esto genera un error esperado:
TypeError: get_id() falta 1 argumento posicional requerido: ‘self’

Pero no puedo descifrar la sintaxis correcta, ¿tal vez usando lambda?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con el código proporcionado es que la función get_id() en la clase Timeslot no tiene el parámetro self. La sintaxis correcta para la función fill_pitches_from_start() utilizando lambda sería:

    def fill_pitches_from_start(constraint_factory):
        # Un pitch no debe estar vacío si es posible
        return constraint_factory \
            .from_(Timeslot).ifNotExists(Match, Joiners.equal(lambda timeslot: timeslot.get_id(), Match.get_timeslot() ) )  \
            .join(Timeslot).ifExists(Match, Joiners.equal(lambda timeslot: timeslot.get_id(), Match.get_timeslot())) \
            .filter(lambda slot1, slot2: datetime.combine(slot1.date_str, slot1.start_time) < datetime.combine(slot2.date_str, slot2.start_time) ) \
            .penalize("Pitch vacío con pitches posteriores completados", HardSoftScore.ofSoft(10))
    

    Aquí, la función lambda se utiliza para pasar el parámetro self a get_id() en la función equal(). Además, el parámetro timeslot se utiliza para acceder al atributo id del timeslot en las cláusulas from_() y join() para comprobar las coincidencias existentes. Por último, se accede directamente al atributo start_time en la función datetime.combine() para comparar los horarios de inicio de los timeslots.

Comments are closed.