Optaplanner - сравнивайте несколько решений в одном процессе решения - PullRequest
0 голосов
/ 14 июля 2020

При создании решения я хочу наложить некоторые ограничения на расписание нескольких классов. Например, я хочу проверить, нет ли у одного и того же учителя двух временных интервалов (на уроках) в двух расписаниях. Итак, я хочу сравнить два временных интервала (два урока) в двух разных расписаниях. Я не знаю как.

Я использую класс ConstraintProvider:

public class TimeTableConstraintsProvider implements ConstraintProvider {

    @Override
    public Constraint[] defineConstraints(ConstraintFactory constraintFactory) {
        return new Constraint[] {
                timeSlotConflictPenalty(constraintFactory),
        };
    }
   
    public Constraint timeSlotConflictPenalty(ConstraintFactory constraintFactory) {
        return constraintFactory
                .from(Lesson.class)
                .join(Lesson.class)
                .filter(Lesson::isOverlapping)
                .penalize("time slot conflict", HardSoftScore.ONE_HARD);
    }
}

У меня есть это решение для планирования:

@PlanningSolution
public class TimeTable {

    private String id;

    @PlanningEntityCollectionProperty
    private List<Lesson> lessons;

    @ValueRangeProvider(id = "timeSlotRange")
    private List<TimeSlot> timeSlots;

    @ProblemFactCollectionProperty
    private List<SchoolRoom> schoolRooms;

    @ProblemFactCollectionProperty
    private List<Course> courses;

    @ProblemFactCollectionProperty
    private List<Teacher> teachers;

    @ProblemFactCollectionProperty
    private List<SchoolClass> schoolClasses;

    @PlanningScore
    private HardSoftScore score;

    private SolverStatus solverStatus;
    //...
}

Вот сущность урока :

@PlanningEntity
public class Lesson {

    @PlanningId
    private Long id;
    private SchoolRoom schoolRoom;
    private Subject subject;
    private Teacher teacher;
    @PlanningVariable(valueRangeProviderRefs = "timeSlotRange")
    private TimeSlot timeSlot;   
    private SchoolClass schoolClass;
}

И часть метода решателя

schoolClasses.forEach(schoolClass -> {
    final TimeTable timeTable = new TimeTable(clientId, 
            schoolClass, schoolClasses, schoolRooms, subjects, teachers, lessons,
            lessons.stream().map(Lesson::getTimeSlot).collect(Collectors.toList()));

    final SolverJob<TimeTable, String> solverJob =
            solverManager.solveAndListen(schoolClassId, id -> timeTable, 
            this::saveTimeTable);
});

1 Ответ

1 голос
/ 15 июля 2020

«Я хочу проверить, нет ли у одного и того же учителя двух временных интервалов (на уроках) в двух расписаниях».

  • Либо это одна проблема планирования, поэтому одно большое расписание (объедините эти 2 расписания).

  • Или вы выполняете «многоэтапное планирование» (см. Документацию): в этом случае одно решение ограничивает следующее. Таким образом, после решения первого расписания, оно генерирует TeacherUnavailable(String teacher, Timeslot timeslot) фактов о проблемах во втором расписании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...