Optaplanner-用于int数组约束的Drools



我正在尝试编写一个约束,以检查整数数组(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(用于任何可迭代集合,以尝试与该集合中的所有值进行匹配。

相关内容

  • 没有找到相关文章

最新更新