【问题标题】:Optaplanner Value Range Provider not getting calledOptaplanner Value Range Provider 没有被调用
【发布时间】:2019-01-01 23:43:07
【问题描述】:

我想知道值范围提供程序是如何工作的。

我有一个名为Entity 的类,在该类中有多个实例,都映射在Solution 中,如下所示

@PlanningEntityCollectionProperty
public List<Entity> getEntityList() {
    return entityList;
}

现在我想为不同的Entity 对象设置不同的范围值。例如。一个会有 0 到 50 个,另一个可能有 20 到 100 个。所以我在Entity 类中实现了@ValueRangeProvider。

@PlanningEntity()
public class Entity {

@PlanningVariable(valueRangeProviderRefs = {"quantityRange"})
public Long getAllocatedWeight() {
    return allocatedWeight;
}

@ValueRangeProvider(id = "quantityRange")
public CountableValueRange<Long> getQuantityRange() {
    return ValueRangeFactory.createLongValueRange(minWeights, maxWeights);
}

}

getQuantityRange 处的断点永远不会被调用,Optaplanner 在生成结果时也没有考虑范围,但所有的流口水规则都按预期正常工作。我只需要为每个实体对象静态分配范围。

注意:我使用InvestmentQuantityTransferMove.java 进行步进 来自 optaplanner Repo 中的 investments 示例。自从 我的解决方案也类似,所有实体的总和应该是 完全等于特定值。

【问题讨论】:

    标签: drools optaplanner


    【解决方案1】:

    您的实体可能没有被 OptaPlanner 解析,或者您会得到一个明显的异常 - 或者断点会命中。所以这两个条件之一不满足:

    • 您的实体需要有一个@PlanningEntity 注释。这显然得到了满足。
    • 您的实体需要使用&lt;entityClass&gt; 在solverConfig.xml(或等效的java API)中注册。这可能是问题所在。

    (如果满足这两个条件并且您的断点未命中,那么这是一个错误。使用复制器创建 jira。)

    这是一个常见的陷阱,但不幸的是,OptaPlanner 无法检测到实体是否未注册(据我所知,不会产生沉重的 boostrap 性能成本)...

    【讨论】:

    • 感谢您的支持,我检查了我的 XML,它包含 下的完整类名。此外,所有其他功能(规则)都在这个实体之上运行,我相信它是我的版本中的一个错误,你知道没有这个问题的任何版本
    • 我从未见过这个错误,所以请使用复制者create a jira,以便我确认它是一个错误(并修复它)。
    猜你喜欢
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    • 1970-01-01
    • 2020-12-11
    相关资源
    最近更新 更多