Optaplanner: объект планирования и переменная планирования одновременно?

Можно ли с помощью Optaplanner определить класс как объект планирования и переменную планирования одновременно?

Пример :

  @PlanningEntity(difficultyComparatorClass = NodeDifficultyComparator.class)
    public class Node extends ProcessChain {
       // Planning variables: changes during planning, between score calculations.
        private List<Node>  parents;
        private List<Node>  childs;


        @PlanningVariable(valueRangeProviderRefs = {"nodeRange"})
        public List<Node> getParents() {
            return parents;
        }

        @PlanningVariable(valueRangeProviderRefs = {"nodeRange"})
        public List<Node> getChilds() {
            return childs;
        }

        public void setParents(List<Node> parents) {
            this.parents = parents;
        }

        public void setChilds(List<Node> childs) {
            this.childs = childs;
        }
    }

person Jack Kass    schedule 22.05.2014    source источник


Ответы (1)


В примере TSP и Vehicle Routing уже есть значения планирования, которые также являются объектами планирования, хотя они оба используют переменную chained=true. Поскольку chained=true, это означает, что никакие 2 объекта планирования не имеют одну и ту же переменную планирования (и все они прямо или косвенно связаны с привязкой). См. раздел документации «связанные переменные планирования».

Я подозреваю, что в вашем случае вам нужны не цепочки, а дерево, ориентированный граф или неориентированный граф. Неориентированный граф (= граф, который допускает циклы) проблематичен для построения эвристик, потому что стандартно они не могут построить граф с циклом. Что касается дерева и ориентированного графа: это должно работать в теории, но вам могут потребоваться пользовательские ходы (см. документы), чтобы ходы были эффективными. В будущем мы хотели бы поддерживать древовидную структуру аналогично тому, как мы поддерживаем цепочки (для планирования мастерской).

В любом случае: в настоящее время у вас не может быть @PlanningVariable на List объектов планирования. Вам нужно будет преобразовать отношения «многие-многие» в отношения «многие-один» и «один-много».

person Geoffrey De Smet    schedule 23.05.2014
comment
Большое спасибо за ваш ответ. - person Jack Kass; 23.05.2014
comment
Однако я не уверен, что могу использовать отношения many2one в моем случае. Я использую своего рода направленную древовидную диаграмму (каждый узел может иметь несколько родителей и детей). Каждый узел представляет определенную задачу. Весь график представляет зависимости между задачами. я должен планировать задачи с учетом нескольких ограничений (минимизировать общее время процесса, никогда не использовать больше ресурсов, чем доступно в любое время...). Для этого планировщик должен изменять родителей каждого узла (many2many), пока не найдет наилучшее решение. Как вы думаете, есть обходной путь для моей проблемы? - person Jack Kass; 23.05.2014
comment
В настоящее время OptaPlanner не полностью поддерживает предлагаемую вами модель (со списками‹Node›). Но мне кажется, что вы имеете дело со случаем планирования работы по проекту, и у нас есть полностью реализованный пример этого. См. видео. - person Geoffrey De Smet; 23.05.2014