我试图解决一个调度问题,它围绕着以下安排:
是否可以使用join()
和groupby()
实现约束?我尝试过以下路线:
private Constraint doNotOverbookEquipment(ConstraintFactory factory) {
return factory.from(ShiftAssignment.class)
// join shift assignments with the shifts they are assignments of
.join(Shift.class, equal(ShiftAssignment::getShiftId, Shift::getId))
// join with ALL pieces of equipment
.join(Equipment.class)
.groupBy([Shift and Equipment, summing the equipment-usage for each ShiftAssignment])
.filter([equipment usage greater than a constant])
.penalizeConfigurable("do not overbook Equipment");
我认为filter()
应该没有问题,但不确定如何获得这个groupby()
来实现我想要的。这里是否需要TriconStraintCollector
?还是有一个不同的、更好的整体方法?
作为参考,ShiftAssignment类可以很容易地拥有如下所示的方法:
public LinkedHashSet<Equipment, Integer> getEquipmentUsage()
我认为您的groupby()
应该如下所示:
.groupBy(
(shiftAssignment, shift, equipment) -> shift,
(shiftAssignment, shift, equipment) -> equipment,
ConstraintCollectors.sum((shiftAssignment, shift, equipment) ->
shiftAssignment.getUsage(shift, equipment)
)
在本例中,要求和的实际逻辑应该在ShiftAssignment.getUsage(...)
或您选择在其中使用的任何其他方法中实现。
我发现约束流无论如何都不适合我的目的,因为我无法在使用奖励或惩罚函数时控制基于匹配实体的分数级别。我将继续使用drools语法。
我正在评估OptaPlanner的一个规划问题。我已经看到了几个关于这个话题的回应,但没有一个完全像我正在寻找的。 似乎OptaPlanner在求解时需要静态数量的实体/变量。 如有任何指示,将不胜感激。
此约束是否在分数计算器()中。它是否可以检查一个解决方案中的进程组是否被分配到相同的CPU并给它打分? 有没有其他更好的方法,比如使用ValueSelector? 并且我在缺省情况下得到了一个解决方案,即使进程不能分配给CPU(因为限制)。计划者就是这样工作的吗?
我试图将规划实体和一个问题事实加入到约束流中,但我的IDE抛出了一个错误: 我的问题结构和运输问题很相似。我有节点和边,想要计算边的数量。 我的主要问题是: 和规划实体: 约束的代码为: 如果我尝试连接边与边,例如: 这不会出错。原因是,我尝试将节点连接到节点的Edge属性中的Edge中吗?有没有别的办法可以做我想做的事?
我想用optaplanner设计一个预订系统,按照我的商业模式: 要预订预约,客户将选择: null 由于我对optaplanner是个新手,你能告诉我这是不是该走的路吗? 更新1:出于设计目的,我已经将问题简化到最小。
我想为VRP创建一个过度约束规划的增量分数。我创建了一个传统的虚拟车辆,其中包括所有计划外的客户。 示例: Optaplanner将Customer1从Vehicle1移动到Vehicle2: 当我得到AfterVariableChanged:previousStandstill(Customer1)时,在Customer.getVehicle()中,我有旧车辆的价值,我不知道是否需要添加软成本(