2016-03-28 2 views
1

Есть ли способ поставить пользовательский шаг в эвристическом дизайне? Я работаю над проектом, который близок к проблеме загрузки медсестер в optaplanner, но, кроме того, чтобы просто отправить работника в задание на смену, мне также нужно поставить работника на небольшие задания, которые требуются в течение смены. Поэтому, когда я кладу сотрудника в смену, мне нужно поставить работника во все небольшие задания, над которыми он может работать (обладает навыками для них). Я не хочу, чтобы это была вторая планирующая сущность, а сотрудник - переменная планирования, я просто хочу, чтобы я назначил сотрудника сдвигу, затем перебираю все небольшие задания, находящиеся в этом сдвиге (находятся между началом и концом времена сдвига) и либо назначить его, либо нет, поэтому, если у него есть навык, он должен быть назначен, иначе нет. У меня возникли проблемы с этим пользовательским движением в эвристике конструкции. Есть ли способ?Custom Move in construction эвристический

EDIT: Будет ли полезно размещать «ценник» в каждой смене, я имею в виду пробег по эвристике до optaplanner (до начала запуска), которая подсчитывает количество вхождений небольших заданий в каждый смену. Затем позже используйте эту информацию, чтобы решить, будет ли сотрудник хорош для этой смены или нет, допустим, что он может быть назначен на заданный сдвиг, если у него есть навыки, чтобы встретить как минимум 70% небольших заданий. Например, у нас есть следующие небольшие присвоения (SA), которые происходят во время сдвига: SA1 4 вхождения, SA2 4 вхождения, SA3 2 появления, и у нас есть сотрудник1, у которого есть навыки для SA1 и SA2 и employee2, у которых есть только умение SA1, тогда employee1 может быть назначена на смену, потому что он встречает более 70% небольших заданий, но employee2 не может, потому что он встречает только 40%. Затем, после того как сотрудник получает «в», он просто назначает его всем заданиям, которые он может работать (если у него есть навык для небольшого задания, он будет работать над ним, не будет ограничений для небольших заданий, кроме работника, требуется навык). Не будет решения о том, какой сотрудник должен выполнить небольшое задание, каждый сотрудник будет таким же, если бы он был назначен на смену и имел навык. Это хорошая идея?

А также может ли быть несколько значений планирования, назначенных одному экземпляру объекта планирования? В этом случае может быть несколько сотрудников, назначенных одному экземпляру присваивания сдвига (я просто беру его в качестве примера, я не планирую это делать)?

ответ

1

Проверьте расширенную конфигурацию эвристики конструкции в документах. Строительная эвристика работает только с ChangeMove и комбинациями (декартово, союз, последовательность). Например, если у вас есть 2 сущностей А и В (каждой с 1 переменными) с 10 A экземпляров и 7 B экземпляров, можно:

  • Чтобы иметь 2 CH: первый CH назначает все А-х и впоследствии второй присваивает все B. Таким образом, он присваивает в этом порядке: A1, A2, A3, ..., A10, B1, B2, ..., B7 (и каждый из них пытается каждое значение планирования).
  • Чтобы иметь 1 CH, который присваивает смесь A и B. Поэтому он присваивает в смешанном порядке (определяется сортировщиком сущностей): A1, B1, B2, A2, B4, A3, ..., B7, A10 ,
  • (Если есть только один класс объектов, но 2 переменные, то можно сделать декартово произведение или последовательное присвоение.)

Во всяком случае, если это не режет его, реализовать CustomPhaseCommand для полной свободы (см. Документы и примеры, которые имеют класс ...Initializer).

к тому же просто поставить работник на присвоение сдвига я также необходим поставить сотрудник на небольшие задания, которые требуются в смене

звучит как ваша модель может быть неэффективной. Рассмотрим альтернативные модели, чтобы иметь переменную только 1 планирования:

class Employee {} 
class Shift {} 
@PlanningEntity class SmallAssignment { 
    Shift shift; 
    @PlanningVariable Employee employee; 
} 

Или лучше определить, что такое «сдвиг»: если 2 человека работают в то же время, они используют один и тот же экземпляр сдвига? Как ваш бизнес сложность может понадобиться эта модель:

class Employee {} 
class ShiftWithDateTime {} 
@PlanningEntity lass ShiftWithDateTimeAndEmployee { 
    ShiftWithDateTime shiftWithDateTime; 
    @PlanningVariable Employee employee; 
} 
@PlanningEntity class SmallAssignment { 
    ShiftWithDateTime shiftWithDateTime; 
    @PlanningVariable Employee employee; 
} 

Но в этом случае, я мог бы проверить, если это refactorable как это (что возможно только в том случае, если небольшие задания могут быть совершенно назначены твоё жадно, так что их ограничения Арен 't NP-hard):

class Employee {} 
@PlanningEntity class ShiftWithDateTime { // shadow entity 
    @InverseRelationShadow List<ShiftWithDateTimeAndEmployee> assignments; 
    boolean hasEnoughEmployeesToFulfillAllSmallAssignments() { ... } 
} 
@PlanningEntity lass ShiftWithDateTimeAndEmployee { 
    ShiftWithDateTime shiftWithDateTime; 
    @PlanningVariable Employee employee; 
} 
+0

Спасибо, что это было действительно полезно. Я задал другой вопрос как редактирование, которое является дополнением к тому же вопросу. –