Планирование моделирования деятельности в Optaplanner - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь решить конкретную проблему в Optaplanner, и мне трудно понять, как лучше всего вписать ее в модель предметной области.

Моя проблема связана со многими «Групповыми» сущностями, причем каждая сущность имеет 3 периода в день, в течение которых они могут выполнять любое из нескольких действий. Кроме того, каждая группа предъявляет уникальные требования в отношении того, сколько из каждого мероприятия они могут иметь в двухнедельном расписании. Для этой проблемы я думал о четырех основных объектах: Группа, Деятельность, День и Период. Что я должен использовать в качестве моей PlanningEntity и PlanningVariable в этой ситуации?

1 Ответ

0 голосов
/ 05 июня 2018

Похоже, вам понадобится дополнительный класс, который будет служить вашим 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);
//...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...