如何根据计划实体的价值使用OptaPlanner ValueRange?



嘿,对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());
}

如果有人知道我错过的事情或有任何想法,我将非常感谢您的帮助。

该代码实际上可以说明。参见文档"实体的价值范围提供商"(而不是"解决方案")。

话虽如此,它确实有局限性:某些功能不支持它,并且如果与"实体"相结合的价值范围会很快失败 - 这些天大多数都这样做,所以我不必担心。此外,它可以防止本地搜索破坏那些硬限制以逃脱局部优点,但这通常不是问题。

最新更新