私はプロジェクトのような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を見つける持っているフォーラムで
accumulate関数を使用します。他のoptaplannerの例を参照してください。 –
最大時間と最小時間を得るための最大値と最小値はありますか? – Giancarlo