属性依赖于事实值的场景
Scenario where properties have a dependency on the Fact values
需要澄清问题事实 class 被分数约束使用,但在计划期间不会改变(只要问题保持不变)的陈述。
Optaplanner 能否处理问题属性依赖于事实值的场景(和 return 优化解决方案)?
例如:在车辆路径问题中,optaplanner 引擎 return 可以根据 Vehicle_1 比 Vehicle_0 花费更多时间(比如多 1.2 倍)的事实优化解决方案从 Location_A 到 Location_B。
与 Project Job Scheduling 示例类似,Resource_X 需要 1.2 天才能完成一项任务,而 Resource_Y 需要 .9 天才能完成同一任务。
是的,它可以。 有几个例子实际上是这样做的。
design/implement 有几种方法。这是我比较喜欢的:
@PlanningEntity class TaskAssignment {
Task task;
@PlanningVariable Employee employee;
public int getDuration() {
// Warning: If affinity's or task types would change during planning (except during real-time planning ProblemFactChange of course),
// we would need to do this through DRL or break incremental score calculation.
return employee.getAffinityTo(task.getType()).getDuration();
}
}
rule affinityBasedDuration
when
TaskAssignment(employee != null, $d : duration)
then
// addSoft(-$d)
end
你甚至可以传入参数:
when
$a : TaskAssignment($id : id)
$b : TaskAssignment($id < id, $d: calculateOverlap($a))
then
// addSoft(-$d)
end
@PlanningEntity class TaskAssignment {
...
public int calculateOverlap(TaskAssignment other) {
// calculate overlap with this.startTimestamp vs other.startTimestamp
// and this.endTimestamp vs other.endTimestamp
}
}
需要澄清问题事实 class 被分数约束使用,但在计划期间不会改变(只要问题保持不变)的陈述。
Optaplanner 能否处理问题属性依赖于事实值的场景(和 return 优化解决方案)?
例如:在车辆路径问题中,optaplanner 引擎 return 可以根据 Vehicle_1 比 Vehicle_0 花费更多时间(比如多 1.2 倍)的事实优化解决方案从 Location_A 到 Location_B。
与 Project Job Scheduling 示例类似,Resource_X 需要 1.2 天才能完成一项任务,而 Resource_Y 需要 .9 天才能完成同一任务。
是的,它可以。 有几个例子实际上是这样做的。 design/implement 有几种方法。这是我比较喜欢的:
@PlanningEntity class TaskAssignment {
Task task;
@PlanningVariable Employee employee;
public int getDuration() {
// Warning: If affinity's or task types would change during planning (except during real-time planning ProblemFactChange of course),
// we would need to do this through DRL or break incremental score calculation.
return employee.getAffinityTo(task.getType()).getDuration();
}
}
rule affinityBasedDuration
when
TaskAssignment(employee != null, $d : duration)
then
// addSoft(-$d)
end
你甚至可以传入参数:
when
$a : TaskAssignment($id : id)
$b : TaskAssignment($id < id, $d: calculateOverlap($a))
then
// addSoft(-$d)
end
@PlanningEntity class TaskAssignment {
...
public int calculateOverlap(TaskAssignment other) {
// calculate overlap with this.startTimestamp vs other.startTimestamp
// and this.endTimestamp vs other.endTimestamp
}
}