0

使用 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;
        }
    }
4

1 回答 1

2

TSP 和 Vehicle Routing 示例已经具有作为计划实体的计划值,尽管它们都使用chained=true变量。因为chained=true,这意味着没有 2 个规划实体具有相同的规划变量(并且都直接或间接连接到锚点)。请参阅文档部分“链式计划变量”。

我怀疑在您的情况下,您不需要链,而是需要树、有向图或无向图。无向图(= 允许循环的图)对于构造启发式算法是有问题的,因为开箱即用它们无法构造带有循环的图。至于树和有向图:理论上它应该有效,但您可能需要自定义移动(请参阅文档)以使移动有效。将来,我们希望支持类似于我们支持链的树结构(用于作业车间调度)。

无论如何:您目前不能拥有一个@PlanningVariable计划List实体。您需要将 many2many 关系转换为 many2one 和 one2many 关系。

于 2014-05-23T06:46:16.957 回答