【问题标题】:OptaPlanner Drools implementation errorOptaPlanner Drools 实施错误
【发布时间】:2014-06-09 07:47:32
【问题描述】:

您好,我刚开始将 OptaPlanner 与 drools 结合使用。但是我有两个问题。我相信这取决于我对语法的理解。

当我尝试实例化求解器时,以下规则会引发错误。

//Soft constraints
rule "waistedArea"
    when
        $sheet : Sheet($area: (area * 10000))
        $usedAreaTotal : Number (intValue > 0 && intValue < $area ) from accumulate(
            Part(
                    sheet == $sheet,
                    $usedArea : requiredArea * 10000
                ),
            sum($usedArea)
        ) 
        $waste : ($area - $usedAreaTotal)
        eval($waste > 0)
     then
        insertLogical(new IntConstraintOccurrence("waistedArea", constraintType.NEGATIVE_SOFT, $waste,$sheet)
    end

乘以 10000 是从 double 值到 int 的临时强制转换,但您还知道语法。

该规则旨在计算分配有许多组件的床单的腰围值。

规则抛出以下错误。

Message [id=1, level=ERROR, path=optaplanner-kie-namespace//Resources/DRLRools
/NestingRules.drl, line=71, column=0
   text=[ERR 102] Line 71:24 mismatched input '-' in rule "waistedArea"]
Message [id=2, level=ERROR, path=optaplanner-kie-namespace//Resources/DRLRools
/NestingRules.drl, line=0, column=0
   text=Parser returned a null Package]

任何解释都会有所帮助。

【问题讨论】:

    标签: drools optaplanner


    【解决方案1】:

    你不能这样写,因为它不是“条件元素”:

    $waste : ($area - $usedAreaTotal)
    

    这就足够了:

    eval($area > $usedAreaTotal)
    

    我看不出乘以 10000 的任何充分理由 - 最后,您比较两个值,乘以 10000 不会改变关系。 Number 也有doubleValue()

    而且:它被称为 waste - waist 是你的腰带所在的位置 :-)

    【讨论】:

    • 感谢您的 cmets,我已经发现了 eval 选项。我目前对另一条规则有困难(以及我的拼写:))。请您提供一个简单的演员表示例,因为从我所阅读的内容来看,软规则不适用于实数。这是正确的吗?
    • 是的,浮点数/双精度数是 inherently broken(但 OptaPlanner 仍然支持它们)。如果需要 3 个十进制数字精度,只需使用 long 和乘以 1000 的浮点数/双精度数,如果需要 4 则使用 10000 等。或者使用 BigDecimal。
    • @GeoffreyDeSmet 但是仅仅乘以 10 的幂不会从浮点数转换为整数。使用小但整体的面积单位可以避免这个问题,但这必须在数据模型、工作表和零件中实现。
    • 感谢您的 cmets。我通过在模型中设置一个可配置的精度值,然后提供一个访问实数整数表示的访问器来解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多