【问题标题】:Optaplanner : Planning entity and Planning variable at the same time?Optaplanner:同时规划实体和规划变量?
【发布时间】:2014-05-22 14:16:57
【问题描述】:

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

【问题讨论】:

    标签: java constraint-programming optaplanner


    【解决方案1】:

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

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

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

    【讨论】:

    • 非常感谢您的回答。
    • 我不确定我是否可以在我的情况下使用 many2one 关系。我正在使用一种有向树图(每个节点可以有多个父节点和子节点)。每个节点代表一个特定的任务。整个图表示任务之间的依赖关系。我必须考虑多个约束来安排任务(尽量减少过程的总时间,永远不要使用比任何时候可用的资源更多的资源......)。为此,计划者必须修改每个节点的父节点(many2many),直到找到最佳解决方案。您认为我的问题有解决方法吗?
    • OptaPlanner 目前不完全支持您提议的模型(使用 List 的)。但在我看来,您正在处理一个项目作业调度案例,我们有一个完整实施的示例。见video
    猜你喜欢
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多