我的 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(也不是Timefold)的设计目的并非如此。您必须找出一种在实体之间共享逻辑的方法,最终每个实体只有它需要的变量,并且每个实体都单独注释。
继承可能是最好的方法。您可以在超类型上拥有所有方法,然后在具体子类型上为该特定问题所需的变量注释 getter。这将确保您的大部分代码不重复,但一些样板文件将保留。 (例如具体的解决方案和实体子类型。)我认为这是一个很小的成本。