如何根据规划实体的价值使用OptaPlanner ValueRange?
How to use OptaPlanner ValueRange based on a planning entity's value?
嘿,optaplanner 还是个新手。我拥有的是一个流程规划实体,它有一个 "availability zone" 和一组也有分配的可用性区域的计算机。由于进程只能放在具有相同可用性区域的计算机上,我想使用 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());
}
如果有人知道我遗漏的内容或有任何想法,我将不胜感激。
据我所知,该代码确实有效。请参阅文档 "Value Range Provider from entity"(与 "from solution" 相对)。
话虽这么说,但它确实有局限性:某些功能不支持它,如果与值范围 "from entity" 结合使用会很快失败 - 现在大多数都支持,所以我不会担心。此外,它可以防止本地搜索打破硬约束以逃避局部最优,但这通常不是问题。
嘿,optaplanner 还是个新手。我拥有的是一个流程规划实体,它有一个 "availability zone" 和一组也有分配的可用性区域的计算机。由于进程只能放在具有相同可用性区域的计算机上,我想使用 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());
}
如果有人知道我遗漏的内容或有任何想法,我将不胜感激。
据我所知,该代码确实有效。请参阅文档 "Value Range Provider from entity"(与 "from solution" 相对)。
话虽这么说,但它确实有局限性:某些功能不支持它,如果与值范围 "from entity" 结合使用会很快失败 - 现在大多数都支持,所以我不会担心。此外,它可以防止本地搜索打破硬约束以逃避局部最优,但这通常不是问题。