嘿,对optaplanner来说很新。我所拥有的是一个流程规划实体,它具有“可用区”和一组也具有已分配可用区的计算机。由于进程只能放在具有相同可用区的计算机上,我想使用ValueRangeProvider来缩小可能的选择以仅包括那些计算机(类似于文档中的示例如何根据教师部门缩小房间) 。但是,从可用区域到较低级别实体(即计算机)没有直接连接,我正在使用的对象目前仅指向。
我原以为我可以将计算机列表传递到每个进程,只是创建一个基于类似于我在下面所做的值列表,但我希望有一个更优雅的解决方案。我正在查看过滤器,但我无法弄清楚如何根据计划实体和该实体的计划变量创建过滤器以限制可能的移动。
@PlanningVariable(strengthComparatorClass = ComputerStrengthComparator.class)
public Computer getComputer() {
return computer;
}
@ValueRangeProvider(id="computerRange")
public List<Computer> getPossibleComputers(){
return computers.stream().filter(computer -> computer.getAvalibilityZone().equals(this.getAvalibilityZone())).collect(Collectors.toList());
}
如果有人知道我错过的或有任何想法,我会非常感谢你的帮助。
答案 0 :(得分:1)
据我所知,该代码实际上是有效的。请参阅文档“实体的值范围提供者”(而不是“来自解决方案”)。
话虽如此,它确实有局限性:某些功能不支持它,并且如果与“实体”的值范围结合将会快速失败 - 这些天大多数都这样做,所以我不担心它。此外,它阻止本地搜索破坏那些硬约束以逃避局部最优,但这通常不是问题。