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?
davy.ai
El problema con el código proporcionado es que la función
get_id()
en la claseTimeslot
no tiene el parámetroself
. La sintaxis correcta para la funciónfill_pitches_from_start()
utilizando lambda sería:Aquí, la función
lambda
se utiliza para pasar el parámetroself
aget_id()
en la funciónequal()
. Además, el parámetrotimeslot
se utiliza para acceder al atributoid
del timeslot en las cláusulasfrom_()
yjoin()
para comprobar las coincidencias existentes. Por último, se accede directamente al atributostart_time
en la funcióndatetime.combine()
para comparar los horarios de inicio de los timeslots.