OptaPlanner Drools实现错误

OptaPlanner Drools实现错误,drools,optaplanner,Drools,Optaplanner,嗨,我刚刚开始将OptaPlanner与drools结合使用。然而,我有两个问题。我相信这取决于我对语法的理解 当我尝试实例化解算器时,以下规则引发了一个错误 //Soft constraints rule "waistedArea" when $sheet : Sheet($area: (area * 10000)) $usedAreaTotal : Number (intValue > 0 && intValue < $ar

嗨,我刚刚开始将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

任何解释都会很有帮助。

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

这就足够了:

eval($area > $usedAreaTotal)
我看不出乘以10000有什么好的理由——最后,比较两个值,乘以10000不会改变关系<代码>数字还有
双值()


而且:它被称为废品-腰围是你的腰带所在的位置:-)

谢谢你的评论,我已经发现了eval选项。我目前对另一条规则(以及我的拼写:)有困难。请您提供一个简单的cast示例,正如我所读到的,软规则不能有效地处理实数。这是正确的吗?是的,浮点/双精度浮点是正确的(但OptaPlanner仍然支持它们)。如果需要3个十进制数的精度,只需使用长整数乘以浮点数/双数1000,如果需要4个十进制数的精度,则使用10000,等等。或者使用BigDecimal。@GeoffreyDeSmet,但仅仅用10的幂进行乘法并不能将浮点数转换为整数。使用面积较小但不可分割的单位可以避免此问题,但这必须在数据模型、工作表和零件中实现。感谢您的评论。我通过在模型中设置一个可配置的精度值,然后为实数的整数表示提供一个访问器来解决这个问题
$waste : ($area - $usedAreaTotal)
eval($area > $usedAreaTotal)