2017-03-07 4 views
0

私はプロジェクトのようなnurserosterで働いています。私はルールの提案が必要です。問題は、すべての従業員が1日のフライト以上の作業をすることができ、フライトの開始時間と終了時間が異なることです。 すべての従業員は、飛行中の飛行に割り当てられています。 最初のフライトの開始時刻と最後のフライトの終了時刻を考慮して合計勤務時間を計算するルールはありますか?例:flightAssignment1従業員1は、8:00に10:00に終了し、2番目の従業員は、12:00に15:00に終了します。従業員1の総勤務時間は8:00〜15:00(7時間)です。プロジェクトのようなNurseRosterの総労働時間

は、私はこの1つをしようとしているが、それは返すのObjectType 'CheckinRoster.getEmployeeTotalHours'エラーを解決することができません:

rule "test" 
when 
    $employee : Employee() 
    accumulate(
     FlightAssignment(employee == $employee, $start : minWorkedHour, $end : maxWorkedHour), 
     $max : max($end), 
     $min : min($start) 
     ) 
then 
    System.out.println($employee.getLabel() + " MIN: " + $min.intValue() + " --- MAX: " + $max.intValue()); 
    scoreHolder.addSoftConstraintMatch(kcontext, -($max.intValue() - $min.intValue())); 
end 

:私はこのようにルールを変更

rule "insertEmployeeAssignmentTotal" 
    salience 1 // Do these rules first (optional, for performance) 
when 
    $employee : Employee() 
    $assignmentTotal : CheckinRoster.getEmployeeTotalHours($employee) 
then 
    insertLogical(new EmployeeAssignmentTotal($employee, $assignmentTotal.intValue())); 
end 

OKこの2つのような良い結果を得る:

Employee 1 MIN: 7 --- MAX: 21 
Employee 2 MIN: 6 --- MAX: 21 

しかし、また、私は、整数変換、または他の事

Employee 3 MIN: 2147483647 --- MAX: -2147483648 

に何か問題に関連し、このような悪い結果がminWorkedHourとmaxWorkedHourがクラスFlightAssignemntに整数であり、アキュムレータは、ダブルまたはフロートのようです。どうしたの?

rule "dailyWorkedUp" 
when 
    $employee : Employee() 
    $dailyTotalHours : Number(intValue > 7) from accumulate(
       $assignmentEmployee: FlightAssignment(employee == $employee), 
       sum($assignmentEmployee.getTotalWorkedHours()) 
     ) 
then 
    //System.out.println($employee.getLabel() + " " + (7-$dailyTotalHours.intValue())); 
    scoreHolder.addHardConstraintMatch(kcontext, (7-$dailyTotalHours.intValue())); 
end 


rule "dailyWorkedDown" 
when 
    $employee : Employee() 
    $dailyTotalHours : Number(intValue < 5) from accumulate(
       $assignmentEmployee: FlightAssignment(employee == $employee), 
       sum($assignmentEmployee.getTotalWorkedHours()) 
     ) 
then 
    //System.out.println("dailyWorkedDown " + $employee.getLabel() + " " + ($dailyTotalHours.intValue() - 5)); 
    scoreHolder.addHardConstraintMatch(kcontext, ($dailyTotalHours.intValue() - 5)); 
end 

しかし、私が得るスコアは解決策と一致していない:私は私の問題のために修正液によるrecent postを見つける持っているフォーラムで

+0

accumulate関数を使用します。他のoptaplannerの例を参照してください。 –

+0

最大時間と最小時間を得るための最大値と最小値はありますか? – Giancarlo

答えて

0

チェックイン。私は-21の得点を得るが、解決は-40のスコアを持つべきである。何が問題なの?

これは総に関する結果は時間を働いている:

Employee 1 total hours: 7 
    Employee 2 total hours: 9 
    Employee 3 total hours: 9 
    Employee 4 total hours: 12 
    Employee 5 total hours: 9 
    Employee 6 total hours: 11 
    Employee 7 total hours: 11 
    Employee 8 total hours: 13 
    Employee 9 total hours: 5 
    Employee 10 total hours: 5 
    Employee 11 total hours: 2 
    Employee 12 total hours: 2 
    Employee 13 total hours: 1 
    Employee 14 total hours: 1 
    Employee 15 total hours: 0 
0

これは一つの問題を除いて、私のためのソリューションです...

rule "test" 
salience 1 
when 
    $employee : Employee() 
    accumulate(
     FlightAssignment(employee == $employee, $start : minWorkedHour, $end : maxWorkedHour), 
     $max : max($end), 
     $min : min($start) 
     ) 
then 
    System.out.println($employee.getLabel() + " ---DIFFERENCE MIN MAX: " + ($max.intValue() - $min.intValue()) + " --- MIN: " + $min + " --- MAX: " + $max); 
    //scoreHolder.addSoftConstraintMatch(kcontext, -($max.intValue() - $min.intValue())); 
    insertLogical(new EmployeeAssignmentTotal($employee, ($max.intValue() - $min.intValue()))); 
end 

// Minimum number of assignments 
rule "minimumTotalAssignments" 
    when 
     EmployeeAssignmentTotal(total < 5, 
      $total : total) 
    then 
     scoreHolder.addSoftConstraintMatch(kcontext, ($total - 5)); 
end 

// Maximum number of assignments 
rule "maximumTotalAssignments" 
    when 
     EmployeeAssignmentTotal(total > 7, 
      $total : total) 
    then 
     scoreHolder.addSoftConstraintMatch(kcontext, (7 - $total)); 
end 

与えられた結果は、いくつかの奇妙なを除いて良いです値:

良い結果

Employee 1 ---DIFFERENCE MIN MAX: 11 --- MIN: 7.0 --- MAX: 18.0 
Employee 2 ---DIFFERENCE MIN MAX: 7 --- MIN: 12.0 --- MAX: 19.0 

BAD結果

Employee 3 ---DIFFERENCE MIN MAX: 1 --- MIN: 1.7976931348623157E308 --- MAX: -1.7976931348623157E308 

この奇妙な値のための任意の手がかり?それらからintValueを取得すると、2147483647と-2147483648が返され、1の差を返します

関連する問題