Похоже, вам понадобится дополнительный класс, который будет служить вашим PlanningEntity, который будет классом "многие" для многих "join".Что-то вроде ActivityAssignment, в котором будут поля Group, Period и Activity PlanningVariable.
Экземпляры действий будут представлять только список возможных действий.ActivityAssignment - это место, где действие связано с группой и временем (или периодом).
Классы Day и Period также немного сложнее.Вам нужно будет иметь экземпляр Day для каждого дня в расписании.Если это повторяющийся график, то Day может концептуально представлять что-то вроде понедельника, недели 1;Вторник, неделя 1;...;до пятницы, недели 2. Если не повторяющееся расписание, то каждый экземпляр Day будет представлять календарную дату.Независимо от этого, у класса Day могут быть три члена Period: Period1, Period2 и Period3 (или вы можете использовать коллекцию Periods, если она может вырасти в будущем. В зависимости от логики правила может быть проще или сложнее реализоватьправила в зависимости от того, используете ли вы коллекцию или три отдельных поля Period).
Period будет иметь двунаправленную связь с Day.Day будет иметь такие методы, как getPeriod1 (), getPeriod2 (), getPeriod3 ().Период будет иметь метод getDay ().Таким образом, вы можете определить, к какому периоду и дню относится конкретное ActivityAssignment, например activityAssignment.getPeriod (). GetDay ().
Чтобы подсчитать количество действий для группы, вы можете реализовать правило drools илизапрос, чтобы выбрать все ActivityAssignments ($ aa), где $ aa.group.id == "this_group" и $ aa.activity.id == "that_activity".Если число превышает максимально допустимое для группы (возможно, что-то вроде group.getMaxActivityCount ("that_activity")), то добавьте соответствующее штрафное значение для ScoreHolder.
РЕДАКТИРОВАТЬ: просто для полноты вы должны иметькласс аннотированного решения @PlanningSolution с коллекциями фактов проблем для групп, действий и периодов.Вы инициализируете все экземпляры Day с 3 экземплярами Period в цикле, но вы также добавляете каждый экземпляр Period в отдельный список, который вы затем устанавливаете в классе PlanningSolution.
У вас будет решение для планированияКласс что-то вроде этого:
@PlanningSolution
public class ActivitySchedule {
@ValueRangeProvider(id = "groupRange")
private List<Group> groups;
@ValueRangeProvider(id = "periodRange")
private List<Period> periods;
@ValueRangeProvider(id = "activityRange")
private List<Activity> activities;
private HardSoftScore score;
//...
}
При инициализации решения, сделать что-то вроде этого:
// Coded for clarity, not for efficiency ;)
for(int dayCount = 0; dayCount < 10; dayCount++){
Day day = new Day();
day.setIndex(dayCount);
//...
Period period1 = new Period(day);
day.setPeriod1(period1);
Period period2 = new Period(day);
day.setPeriod2(period1);
Period period3 = new Period(day);
day.setPeriod3(period3);
dayList.add(day);
periodList.add(period1);
periodList.add(period2);
periodList.add(period3);
}
activitySolution.setDays(dayList);
activitySolution.setPeriods(periodList);
activitySolution.setActivities(activityList);
//...