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.

Optaplanner drools, penalizar una entidad 1.

Utilizo OptaPlanner para crear un plan de tiempo con diferentes lecciones.
Una regla importante para la que necesito ayuda para resolver es minimizar/cortar los descansos entre cada lección.
Utilizo el patrón de granos de tiempo, por lo que básicamente necesito una regla que minimice la cantidad de granos de tiempo entre 2 lecciones.

Así que supongamos que tengo una lección A. ¿Cómo puedo encontrar la lección B más cercana previamente (en términos de cantidad de granos de tiempo)?

Mi solución temporal ha sido utilizar una regla que empareje la lección A y una colección de lecciones que se llevan a cabo el mismo día (y antes que la lección A). Parece funcionar, pero cuando penalizo la lección, también penaliza todas las lecciones de la colección.

Así que mi siguiente pregunta es:
¿Basándome en una regla de emparejamiento que empareje múltiples entradas, puedo penalizar solo una de ellas?
Aquí hay un ejemplo de lo que quiero lograr:

regla “Conflicto horizontal”
cuando
$reina1: Reina($id: id, fila != null, $i: índiceDeFila)
$reina2: Reina(id > $id, índiceDeFila == $i)
entonces
//scoreHolder.addConstraintMatch(kcontext, -1);
solamente penalizar a $reina1
fin

Tags:  

Answer

  1. Avatar for davy.ai

    Para encontrar la lección previamente más cercana B en cantidad de granos de tiempo a la lección A, puedes crear una regla que coincida con la lección B y busque la lección realizada justo antes de la lección A (basándose en sus horarios de inicio). La regla puede calcular la diferencia de tiempo (en granos de tiempo) entre la lección A y la lección B y usarla como puntaje a minimizar.

    Para penalizar solo una de las entradas que coinciden con una regla, puedes usar la palabra clave “solo” seguida de la entrada específica que quieres penalizar. Por ejemplo, en la regla de “conflicto horizontal” proporcionada, podrías reemplazar “solo penaliza a $queen1” con “scoreHolder.addConstraintMatch(kcontext, -1, $queen1);” para solo penalizar $queen1 y no $queen2.

Comments are closed.