[英]Optaplanner : Initializing planning variable problem
我是 Optaplanner 的新手,为了熟悉它,我尝试运行一个简单的代码。 这个想法是我有一个 integer 类型的单一计划变量,它的范围在 1 到 30 之间,我试图最大化。 所以通常求解器应该给我一个 30 的值。
我的代码如下:
计划实体和计划变量:
@PlanningEntity
public class variable {
@PlanningVariable(valueRangeProviderRefs = "xRange")
private Integer x;
public variable() {
}
public Integer getX() {
return x;
}
public void setX(Integer x) {
this.x = x;
}
}
规划解决方案
@PlanningSolution 公共 class Planningsolution {
@PlanningEntityProperty
private variable variable;
@ValueRangeProvider(id="xRange")
public CountableValueRange<Integer> getxRange(){
return ValueRangeFactory.createIntValueRange(1, 30);
}
@PlanningScore
private HardSoftScore score;
public Planningsolution() {
}
public variable getVariable() {
return variable;
}
public void setVariable(variable variable) {
this.variable = variable;
}
public HardSoftScore getScore() {
return score;
}
public void setScore(HardSoftScore score) {
this.score = score;
}
}
约束提供者
public class SimpleConstraintProvider implements ConstraintProvider {
@Override
public Constraint[] defineConstraints(ConstraintFactory constraintFactory) {
return new Constraint[] {
// Hard constraints
maxValue(constraintFactory),
};
}
private Constraint maxValue (ConstraintFactory constraintFactory) {
return constraintFactory.forEach(variable.class)
.reward("maximum", HardSoftScore.ONE_SOFT,variable::getX);
}
}
主要的:
public class SimpleApp {
private static final Logger LOGGER = LoggerFactory.getLogger(SimpleApp.class);
public static void main(String[] args) {
SolverFactory<Planningsolution> solverFactory = SolverFactory.create(new SolverConfig()
.withSolutionClass(Planningsolution.class)
.withEntityClasses(variable.class)
.withConstraintProviderClass(SimpleConstraintProvider.class)
.withTerminationSpentLimit(Duration.ofSeconds(10)));
// Load the problem
Planningsolution problem = new Planningsolution();
// Solve the problem
Solver<Planningsolution> solver = solverFactory.buildSolver();
Planningsolution solution = solver.solve(problem);
// Visualize the solution
System.out.println("solution: " + display(solution) + "\n" + "score: " + solution.getScore());;
}
public static Integer display(Planningsolution solution) {
variable var = new variable();
return var.getX();
}
}
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="appender" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d [%t] %-5p %m%n</pattern>
</encoder>
</appender>
<logger name="org.optaplanner" level="info"/>
<root level="warn">
<appender-ref ref="appender"/>
</root>
</configuration>
我得到的 output 是:
解决方案:null 得分:0hard/0soft
为了使计划变量可初始化,它们必须能够接受null
作为值。 Java 原始类型(例如int
)无法做到这一点,因此您的计划变量需要是Integer
。 错误消息甚至告诉您这样做,尽管措辞有点神秘。
作为旁注,我认为我们应该能够更好地处理这种情况。 如果人们不想要null
在那里,我们不应该强迫他们。 未来发展需要考虑的事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.