DRL文件的方法,以启用强制的班次计数和连续/实时计划

问题描述 投票:1回答:2

我正在寻找有关以下DRL文件的改进方法以强制执行一定数量的转换的任何建议。我当前的方法通过int totalInt值将员工的ShiftAssignment总数合计。需要一个基于计划要素进展的乘数。这样看来可以很好地确保满足员工每两周所需的轮班时间。例如,员工1-x必须每两周做10次粪便,而员工x-20必须每两周进行9次轮班,以此类推。在连续进行计划时,这是正确的。不幸的是,这是DRL文件中的硬编码方法。我不确定如何通过Java类和方法来实现此目的。任何建议,不胜感激。

 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
java optaplanner
2个回答
0
投票

你不能改变数学吗?似乎您正在检查totalInt的间隔时间。除了检查28个场景外,您可能只需除以$constractLine.getMaximumValue()即可获得系数。

例如

coefficient = Math.ceil(totalInt/$contractLine.getMaximumValue());
score = (coefficient *  $contractLine.getMaximumvalue() - totalInt ) * coefficient;
scoreHolder.addSoftConstraintMatch(kcontext, score);

我尚未检查所有边缘情况,但这应该与您使用28个间隔进行的操作相同(并且范围更广)。


0
投票

感谢您提供建议的方法。我得到它满足我的要求,如下所示:

 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
© www.soinside.com 2019 - 2024. All rights reserved.