我正在尝试编写一个约束,以检查整数数组(binUsedArray(的任何元素是否大于绑定(dailyMaxNb(。
rule "BinResourceConstraint"
when
BinResource($array : binUsedArray, $dailyMaxNb : dailyMaxNb)
$x : Integer() from $array
$x > $dailyMaxNb
then
scoreHolder.addHardConstraintMatch(kcontext, -1);
end
我读了drowls文档5.1.8,并试图写一个类似的规则,比如这个
rule "Iterate the numbers"
when
$xs : List()
$x : Integer() from $xs
then
$x matches and binds to each Integer in the collection
end
但出现了一些错误:
Caused by: java.lang.RuntimeException: [Message [id=1, kieBase=defaultKieBase, level=ERROR, path=com/cttq/aps/solver/taskScheduleConstraint.drl, line=78, column=0
text=[ERR 102] Line 78:11 mismatched input '>' in rule "BinResourceConstraint"], Message [id=2, kieBase=defaultKieBase, level=ERROR, path=com/cttq/aps/solver/taskScheduleConstraint.drl, line=0, column=0
text=Parser returned a null Package]]
=====使用BinResource类更新,binUsedArray
是一个大小为30的int数组,用于保持未来30天使用的bin数。
@PlanningEntity
public class BinResource {
private String index;
private String binType;
private String binArea;
private int dailyMaxNb;
@CustomShadowVariable(variableListenerRef = @PlanningVariableReference(entityClass = TaskAssignment.class, variableName = "modifiedProcessTimeInShift"))
private int[] binUsedArray;
简单的解决方案是将数组转换为List,然后它就可以工作了。可以在LHS上调用Arrays.asList( array )
来转换数组。。。类似于:
BinResource($array : binUsedArray, $dailyMaxNb : dailyMaxNb)
$binUsed: List() from Arrays.asList($array)
然后,您可以从第二条规则中执行相同的逻辑,以找到符合您的标准的值:
$x : Integer(this > $dailyMaxNb) from $binUsed
这样,您的规则将为数组/列表中大于dailyMaxNb
值的每个值($x
(触发一次。
rule "BinResourceConstraint"
when
BinResource($array : binUsedArray, $dailyMaxNb : dailyMaxNb)
$binUsed: List() from Arrays.asList($array)
$x : Integer(this > $dailyMaxNb) from $binUsed
then
// this will trigger once PER MATCH ...
// eg if there are 3 values that > dailyMaxNb, this will trigger 3 times
scoreHolder.addHardConstraintMatch(kcontext, -1);
end
但是,如果您的binUsedArray
实际上是ArrayList
,则可以省略转换,只使用$x: Integer(this > $dailyMaxNb) from $array
。我之所以提到这一点,是因为有时当人们问起";阵列";它们实际上是指一个数组列表,而您还没有提供BinResource类的代码。话虽如此,您可以将此模式(MyType( <condition> ) from $collection
(用于任何可迭代集合,以尝试与该集合中的所有值进行匹配。