Quero impor que os grupos de alunos da mesma série de alunos estejam no mesmo intervalo de tempo e na mesma sala para um tipo de curso.
Esta é minha tentativa:
Constraint seminarsGroupedInTheSameTimeslot(ConstraintFactory constraintFactory){
return constraintFactory
//select each 2 pair of different lessons
.forEachUniquePair(Lesson.class,
//with the same group
Joiners.equal((lesson) -> lesson.getStudentGroup().getGroup()),
//with the same series
Joiners.equal((lesson) -> lesson.getStudentGroup().getName()),
//with the same subject
Joiners.equal(Lesson::getSubject),
//with the same Seminar type
Joiners.equal((lesson) -> lesson.getType().equals(LessonType.SEMINAR))
)
//check if the lessons have different timeslots and rooms
.filter(((lesson, lesson2) -> {
return !(lesson.getTimeslot().equals(lesson2.getTimeslot()) &&
lesson.getRoom().equals(lesson2.getRoom()));
}))
.penalize(HardSoftScore.ONE_HARD)
.asConstraint("Seminars should be grouped in the same timeslot and room");
}
Eu sei que esta não é a melhor solução porque não é escalável e dá penalidade a cada par de aulas que quebra a restrição (ou seja, no caso de 10 aulas que são analisadas e apenas uma instância das aulas quebra a restrição, a pontuação será ser -9 em vez de -1).
Tentei adicionar um método ifNotExists() para levar em conta apenas o ID de lições consecutivas, mas recebi o seguinte aviso: Criação de matriz genérica não verificada para o parâmetro varargs.
Como posso escrever melhor esse tipo de restrição?
O mais simples que consegui pensar seria algo assim:
A parte principal a ser entendida é
groupBy
: vocêstudentGroup
esubject
juntos formam uma chave de grupo. Todas as lições com a mesma tonalidade caem no mesmo grupo. Dentro desse grupo, ocountDistinct
coletor calculará quantas instâncias diferentes existem de pares detimeslot
eroom
. (Observação: você mesmo precisa implementarPair
. Pode ser tão simples quanto Java de uma linharecord
.)Você pode ficar tentado a substituir
countDistinct
portoList
, dando acesso aos pares reais. Eu não faria isso. As coleções não são incrementais e a incrementalidade é fundamental para o desempenho do solucionador.