Java 采用DRL文件实现强制轮班计数和连续/实时计划
我正在寻找任何关于以下DRL文件的改进方法的建议,以强制执行一定数量的转换。我当前的方法是通过int totalInt值对员工的班次分配总数进行分级。需要一个基于规划要素进展的乘数。这似乎可以很好地确保员工每两周所需的班次得到满足。例如,员工1-x必须每两周拉屎10次,员工x-20必须每两周拉屎9次,等等。这在持续的计划推进过程中是正确的。不幸的是,这是DRL文件中的硬编码方法。我不确定如何通过Java类和方法实现这一点。非常感谢您的建议Java 采用DRL文件实现强制轮班计数和连续/实时计划,java,optaplanner,Java,Optaplanner,我正在寻找任何关于以下DRL文件的改进方法的建议,以强制执行一定数量的转换。我当前的方法是通过int totalInt值对员工的班次分配总数进行分级。需要一个基于规划要素进展的乘数。这似乎可以很好地确保员工每两周所需的班次得到满足。例如,员工1-x必须每两周拉屎10次,员工x-20必须每两周拉屎9次,等等。这在持续的计划推进过程中是正确的。不幸的是,这是DRL文件中的硬编码方法。我不确定如何通过Java类和方法实现这一点。非常感谢您的建议 rule "Minimum and maximum n
rule "Minimum and maximum number of assignments"
salience 1
when
$contractLine : MinMaxContractLine(contractLineType == ContractLineType.TOTAL_ASSIGNMENTS, enabled == true, $contract : contract) && BooleanContractLine(contractLineType == ContractLineType. IS_LOADBALANCED, enabled == false,contract == $contract)&& BooleanContractLine(contractLineType == ContractLineType.IS_CASUAL, enabled == false,contract == $contract)
$employee : Employee(contract == $contract)
accumulate(
$assignment : ShiftAssignment(employee == $employee);
$total : count($assignment)
)
then
int totalInt = $total.intValue();
if ($contractLine.isMaximumEnabled() && totalInt > ($contractLine.getMaximumValue() ) && totalInt < ($contractLine.getMaximumValue()* 2 )){
scoreHolder.addSoftConstraintMatch(kcontext,
($contractLine.getMaximumValue() - totalInt) * $contractLine.getMaximumWeight());
}
else if ($contractLine.isMaximumEnabled() && totalInt > ($contractLine.getMaximumValue()* 2 ) && totalInt < ($contractLine.getMaximumValue()* 3 )){
scoreHolder.addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue() *2 )- (totalInt)) * $contractLine.getMaximumWeight());
}
else if ($contractLine.isMaximumEnabled() && totalInt > ($contractLine.getMaximumValue()* 3 ) && totalInt < ($contractLine.getMaximumValue()* 4 )){
scoreHolder.addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue() *3 )- (totalInt)) * $contractLine.getMaximumWeight());
}
else if ($contractLine.isMaximumEnabled() && totalInt > ($contractLine.getMaximumValue()* 4 ) && totalInt < ($contractLine.getMaximumValue()* 5 )){
scoreHolder.addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue() *4 )- (totalInt)) * $contractLine.getMaximumWeight());
}
else if ($contractLine.isMaximumEnabled() && totalInt > ($contractLine.getMaximumValue()* 5 ) && totalInt < ($contractLine.getMaximumValue()* 6 )){
scoreHolder.addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue() *5 )- (totalInt)) * $contractLine.getMaximumWeight());
}
else if ($contractLine.isMaximumEnabled() && totalInt > ($contractLine.getMaximumValue()* 6 ) && totalInt < ($contractLine.getMaximumValue()* 7 )){
scoreHolder.addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue() *6 )- (totalInt)) * $contractLine.getMaximumWeight());
}
else if ($contractLine.isMaximumEnabled() && totalInt > ($contractLine.getMaximumValue()* 7 ) && totalInt < ($contractLine.getMaximumValue()* 8 )){
scoreHolder.addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue() *7 )- (totalInt)) * $contractLine.getMaximumWeight());
}
else if ($contractLine.isMaximumEnabled() && totalInt > ($contractLine.getMaximumValue()* 8 ) && totalInt < ($contractLine.getMaximumValue()* 9 )){
scoreHolder.addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue() *8 )- (totalInt)) * $contractLine.getMaximumWeight());
}
else if ($contractLine.isMaximumEnabled() && totalInt > ($contractLine.getMaximumValue()* 9 ) && totalInt < ($contractLine.getMaximumValue()* 10 )){
scoreHolder.addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue() *9 )- (totalInt)) * $contractLine.getMaximumWeight());
}
else if ($contractLine.isMaximumEnabled() && totalInt > ($contractLine.getMaximumValue()* 10 ) && totalInt < ($contractLine.getMaximumValue()* 11 )){
scoreHolder.addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue() * 10 )- (totalInt)) * $contractLine.getMaximumWeight());
}
else if ($contractLine.isMaximumEnabled() && totalInt > ($contractLine.getMaximumValue()* 11 ) && totalInt < ($contractLine.getMaximumValue()* 12 )){
scoreHolder.addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue() * 11 )- (totalInt)) * $contractLine.getMaximumWeight());
}
else if ($contractLine.isMaximumEnabled() && totalInt > ($contractLine.getMaximumValue()* 12 ) && totalInt < ($contractLine.getMaximumValue()* 13 )){
scoreHolder.addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue() * 12 )- (totalInt)) * $contractLine.getMaximumWeight());
}
else if ($contractLine.isMaximumEnabled() && totalInt > ($contractLine.getMaximumValue()* 13 ) && totalInt < ($contractLine.getMaximumValue()* 14 )){
scoreHolder.addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue() * 13 )- (totalInt)) * $contractLine.getMaximumWeight());
}
else if ($contractLine.isMaximumEnabled() && totalInt > ($contractLine.getMaximumValue()* 14 ) && totalInt < ($contractLine.getMaximumValue()* 15 )){
scoreHolder.addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue() * 14 )- (totalInt)) * $contractLine.getMaximumWeight());
}
else if ($contractLine.isMaximumEnabled() && totalInt > ($contractLine.getMaximumValue()* 15 ) && totalInt < ($contractLine.getMaximumValue()* 16 )){
scoreHolder.addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue() * 15 )- (totalInt)) * $contractLine.getMaximumWeight());
}
else if ($contractLine.isMaximumEnabled() && totalInt > ($contractLine.getMaximumValue()* 16 ) && totalInt < ($contractLine.getMaximumValue()* 17 )){
scoreHolder.addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue() * 16 )- (totalInt)) * $contractLine.getMaximumWeight());
}
else if ($contractLine.isMaximumEnabled() && totalInt > ($contractLine.getMaximumValue()* 17 ) && totalInt < ($contractLine.getMaximumValue()* 18 )){
scoreHolder.addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue() * 17 )- (totalInt)) * $contractLine.getMaximumWeight());
}
else if ($contractLine.isMaximumEnabled() && totalInt > ($contractLine.getMaximumValue()* 18 ) && totalInt < ($contractLine.getMaximumValue()* 19 )){
scoreHolder.addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue() * 18 )- (totalInt)) * $contractLine.getMaximumWeight());
}
else if ($contractLine.isMaximumEnabled() && totalInt > ($contractLine.getMaximumValue()* 19 ) && totalInt < ($contractLine.getMaximumValue()* 20 )){
scoreHolder.addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue() * 19 )- (totalInt)) * $contractLine.getMaximumWeight());
}
else if ($contractLine.isMaximumEnabled() && totalInt > ($contractLine.getMaximumValue()* 20 ) && totalInt < ($contractLine.getMaximumValue()* 21 )){
scoreHolder.addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue() * 20 )- (totalInt)) * $contractLine.getMaximumWeight());
}
else if ($contractLine.isMaximumEnabled() && totalInt > ($contractLine.getMaximumValue()* 21 ) && totalInt < ($contractLine.getMaximumValue()* 22 )){
scoreHolder.addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue() * 21 )- (totalInt)) * $contractLine.getMaximumWeight());
}
else if ($contractLine.isMaximumEnabled() && totalInt > ($contractLine.getMaximumValue()* 22 ) && totalInt < ($contractLine.getMaximumValue()* 23 )){
scoreHolder.addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue() * 22 )- (totalInt)) * $contractLine.getMaximumWeight());
}
else if ($contractLine.isMaximumEnabled() && totalInt > ($contractLine.getMaximumValue()* 23 ) && totalInt < ($contractLine.getMaximumValue()* 24 )){
scoreHolder.addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue() * 23 )- (totalInt)) * $contractLine.getMaximumWeight());
}
else if ($contractLine.isMaximumEnabled() && totalInt > ($contractLine.getMaximumValue()* 24 ) && totalInt < ($contractLine.getMaximumValue()* 25 )){
scoreHolder.addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue() * 24 )- (totalInt)) * $contractLine.getMaximumWeight());
}
else if ($contractLine.isMaximumEnabled() && totalInt > ($contractLine.getMaximumValue()* 25 ) && totalInt < ($contractLine.getMaximumValue()* 26 )){
scoreHolder.addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue() * 25 )- (totalInt)) * $contractLine.getMaximumWeight());
}
else if ($contractLine.isMaximumEnabled() && totalInt > ($contractLine.getMaximumValue()* 26 ) && totalInt < ($contractLine.getMaximumValue()* 27 )){
scoreHolder.addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue() * 26 )- (totalInt)) * $contractLine.getMaximumWeight());
}
else if ($contractLine.isMaximumEnabled() && totalInt > ($contractLine.getMaximumValue()* 27 ) && totalInt < ($contractLine.getMaximumValue()* 28 )){
scoreHolder.addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue() * 27 )- (totalInt)) * $contractLine.getMaximumWeight());
}
else if ($contractLine.isMaximumEnabled() && totalInt > ($contractLine.getMaximumValue()* 28 ) && totalInt < ($contractLine.getMaximumValue()* 29 )){
scoreHolder.addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue() * 28 )- (totalInt)) * $contractLine.getMaximumWeight());
}
else {
// Workaround for https://issues.jboss.org/browse/PLANNER-761
scoreHolder.addSoftConstraintMatch(kcontext, 0);
}
end
rule "Minimum and maximum number of assignments with Casuals"
//salience
when
$contractLine : MinMaxContractLine(contractLineType == ContractLineType.TOTAL_ASSIGNMENTS, enabled == false, $contract : contract)&& BooleanContractLine(contractLineType == ContractLineType.IS_CASUAL, enabled == true, contract == $contract)
$employee : Employee(contract == $contract)
accumulate(
$assignment : ShiftAssignment(employee == $employee);
$total : count($assignment)
)
then
int totalInt = $total.intValue();
scoreHolder.addSoftConstraintMatch(kcontext,- totalInt);
end
/*rule "fairAssignmentCountPerEmployee"
salience 2
when //$contractLine : BooleanContractLine(contractLineType == ContractLineType. IS_LOADBALANCED, enabled == true, $contract : contract)
$e : Employee()
$result : loadBalance() from accumulate(
ShiftAssignment(employee == $e),
count()
);
then
scoreHolder.addSoftConstraintMatch(kcontext, -(int)$result.getMeanDeviationSquaredSumRootMillis());
end*/
rule "fairAssignmentCountPerEmployee"
when $contractLine : BooleanContractLine(contractLineType == ContractLineType. IS_LOADBALANCED, enabled == true, $contract : contract)
accumulate(
ShiftAssignment(employee != null, $e : employee, contract == $contract, $shift:shift);
$total : loadBalanceByCount($e)
)
then
scoreHolder.addSoftConstraintMatch(kcontext, - (int) $total.getZeroDeviationSquaredSumRootMillis());
end
规则“分配的最小和最大数量”
显著性1
什么时候
$contractLine:MinMaxContractLine(contractLineType==contractLineType.TOTAL_ASSIGNMENTS,enabled==true,$contract:contract)&&BooleanContactLine(contractLineType==contractLineType.IS_LOADBALANCED,enabled==false,contract==$contract)&&BooleanContactLine(contractLineType==contractLineType.IS_CASUAL,enabled==false,contract==$contract)
$employee:employee(合同==$contract)
积累(
$assignment:shiftasignment(employee==$employee);
$total:计数($assignment)
)
然后
int totalInt=$total.intValue();
如果($contractLine.isMaximumEnabled()&&totalInt>($contractLine.getMaximumValue())&&totalInt<($contractLine.getMaximumValue()*2)){
记分员。addSoftConstraintMatch(kcontext,
($contractLine.getMaximumValue()-totalInt)*$contractLine.getMaximumWeight());
}
如果($contractLine.isMaximumEnabled()&&totalInt>($contractLine.getMaximumValue()*2)和&totalInt<($contractLine.getMaximumValue()*3)){
记分员。addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue()*2)-(totalInt))*$contractLine.getMaximumWeight());
}
如果($contractLine.isMaximumEnabled()&&totalInt>($contractLine.getMaximumValue()*3)和&totalInt<($contractLine.getMaximumValue()*4)){
记分员。addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue()*3)-(totalInt))*$contractLine.getMaximumWeight());
}
如果($contractLine.isMaximumEnabled()&&totalInt>($contractLine.getMaximumValue()*4)和&totalInt<($contractLine.getMaximumValue()*5)){
记分员。addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue()*4)-(totalInt))*$contractLine.getMaximumWeight());
}
如果($contractLine.isMaximumEnabled()&&totalInt>($contractLine.getMaximumValue()*5)和&totalInt<($contractLine.getMaximumValue()*6)){
记分员。addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue()*5)-(totalInt))*$contractLine.getMaximumWeight());
}
如果($contractLine.isMaximumEnabled()&&totalInt>($contractLine.getMaximumValue()*6)和&totalInt<($contractLine.getMaximumValue()*7)){
记分员。addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue()*6)-(totalInt))*$contractLine.getMaximumWeight());
}
如果($contractLine.isMaximumEnabled()&&totalInt>($contractLine.getMaximumValue()*7)和&totalInt<($contractLine.getMaximumValue()*8)){
记分员。addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue()*7)-(totalInt))*$contractLine.getMaximumWeight());
}
如果($contractLine.isMaximumEnabled()&&totalInt>($contractLine.getMaximumValue()*8)和&totalInt<($contractLine.getMaximumValue()*9)){
记分员。addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue()*8)-(totalInt))*$contractLine.getMaximumWeight());
}
如果($contractLine.isMaximumEnabled()&&totalInt>($contractLine.getMaximumValue()*9)和&totalInt<($contractLine.getMaximumValue()*10)){
记分员。addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue()*9)-(totalInt))*$contractLine.getMaximumWeight());
}
如果($contractLine.isMaximumEnabled()&&totalInt>($contractLine.getMaximumValue()*10)和&totalInt<($contractLine.getMaximumValue()*11)){
记分员。addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue()*10)-(totalInt))*$contractLine.getMaximumWeight());
}
如果($contractLine.isMaximumEnabled()&&totalInt>($contractLine.getMaximumValue()*11)和&totalInt<($contractLine.getMaximumValue()*12)){
记分员。addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue()*11)-(totalInt))*$contractLine.getMaximumWeight());
}
如果($contractLine.isMaximumEnabled()&&totalInt>($contractLine.getMaximumValue()*12)和&totalInt<($contractLine.getMaximumValue()*13)){
记分员。addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue()*12)-(totalInt))*$contractLine.getMaximumWeight());
}
如果($contractLine.isMaximumEnabled()&&totalInt>($contractLine.getMaximumValue()*13)和&totalInt<($contractLine.getMaximumValue()*14)){
记分员。addSoftConstraintMatch(kcontext,
(($contractLine.getMaximumValue()*13)-(totalInt))*$contractLine.getMaximumWeight());
}
如果($contractLine.isMaximumEnabled()&&totalInt>($contractLine.getMaximumValue()*14)和&totalInt<($contractLine.getMaximumV
coefficient = Math.ceil(totalInt/$contractLine.getMaximumValue());
score = (coefficient * $contractLine.getMaximumvalue() - totalInt ) * coefficient;
scoreHolder.addSoftConstraintMatch(kcontext, score);
rule "Minimum and maximum number of assignments"
salience 1
when
$contractLine : MinMaxContractLine(contractLineType == ContractLineType.TOTAL_ASSIGNMENTS, enabled == true, $contract : contract) && BooleanContractLine(contractLineType == ContractLineType. IS_LOADBALANCED, enabled == false,contract == $contract)&& BooleanContractLine(contractLineType == ContractLineType.IS_CASUAL, enabled == false,contract == $contract)
$employee : Employee(contract == $contract)
accumulate(
$assignment : ShiftAssignment(employee == $employee);
$total : count($assignment)
)
then
int totalInt = $total.intValue();
if ($contractLine.isMaximumEnabled() && totalInt > $contractLine.getMaximumValue()) {
double coefficient = Math.ceil(totalInt/$contractLine.getMaximumValue());
double score = (((coefficient * $contractLine.getMaximumValue() - totalInt ) * coefficient) * $contractLine.getMaximumWeight());
scoreHolder.addSoftConstraintMatch(kcontext, (int) score);
}
else {
// Workaround for https://issues.jboss.org/browse/PLANNER-761
scoreHolder.addSoftConstraintMatch(kcontext, 0);
}
end