如何动态定义PlanningVariable,例如地图?

问题描述 投票:0回答:1

我的 OptaPlanner 有问题。我需要设计一个具有动态 PlanningVariables 的 PlanningEntity。这样我就可以在不同的项目中重用PlanningEntity。 也许像这样:


import org.optaplanner.core.api.domain.entity.PlanningEntity;
import org.optaplanner.core.api.domain.variable.PlanningVariable;

import java.util.Map;

@PlanningEntity
public class Lesson {

    private Long id;
    /**
     * key: room value: Room Object
     * key: timeslot value: TimeSlot Object
     */
    @PlanningVariable(valueRangeProviderRefs = "planningVariableMapRange")
    private Map<String, Object> planningVariableMap;


    @Override
    public String toString() {
        return "Lesson" + "(" + id + ")";
    }

    // ********************************
    // Getters and setters
    // ********************************

    public Long getId() {
        return id;
    }


    public void setId(Long id) {
        this.id = id;
    }

    public Map<String, Object> getPlanningVariableMap() {
        return planningVariableMap;
    }

    public void setPlanningVariableMap(Map<String, Object> planningVariableMap) {
        this.planningVariableMap = planningVariableMap;
    }
}

我怎样才能实现这一目标?

我还写了一个如下所示的规划解决方案。


import org.optaplanner.core.api.domain.solution.PlanningEntityCollectionProperty;
import org.optaplanner.core.api.domain.solution.PlanningScore;
import org.optaplanner.core.api.domain.solution.PlanningSolution;
import org.optaplanner.core.api.domain.solution.ProblemFactProperty;
import org.optaplanner.core.api.domain.valuerange.ValueRangeProvider;
import org.optaplanner.core.api.score.buildin.hardsoft.HardSoftScore;

import java.util.List;
import java.util.Map;

@PlanningSolution
public class TimeTable {

    @ValueRangeProvider(id = "planningVariableMapRange")
    @ProblemFactProperty
    private Map<String, List<Object>> valueProvider;

    @PlanningEntityCollectionProperty
    private List<Lesson> lessonList;

    @PlanningScore
    private HardSoftScore score;


    public HardSoftScore getScore() {
        return score;
    }


    public void setScore(HardSoftScore score) {
        this.score = score;
    }


    public Map<String, List<Object>> getValueProvider() {
        return valueProvider;
    }

    public void setValueProvider(Map<String, List<Object>> valueProvider) {
        this.valueProvider = valueProvider;
    }
}

然后我就不知道该怎么办了。显然,这是行不通的。

optaplanner
1个回答
0
投票

确实,这是行不通的。 OptaPlanner(也不是Timefold)的设计目的并非如此。您必须找出一种在实体之间共享逻辑的方法,最终每个实体只有它需要的变量,并且每个实体都单独注释。

继承可能是最好的方法。您可以在超类型上拥有所有方法,然后在具体子类型上为该特定问题所需的变量注释 getter。这将确保您的大部分代码不重复,但一些样板文件将保留。 (例如具体的解决方案和实体子类型。)我认为这是一个很小的成本。

© www.soinside.com 2019 - 2024. All rights reserved.