2017-03-07 55 views
0

我正在从事像nurseroster这样的项目,我需要一个建议。问题是:每个员工每天可以工作在不止一个航班上,而且这些航班有不同的开始时间和结束时间。每个员工都被分配到飞行中的飞行协助。 考虑到第一班航班的开始时间和最后一班航班的结束时间,是否有规则能够计算总工作时间?例如:flightAssignment1 employee1在8:00结束于10:00,flightAssigment2 employee1从12:00结束于15:00。员工1的总工作时间是8:00 - 15:00(7小时)。NurseRoster的总工作时间,如项目

我想这一个,但它返回一个无法解析对象类型 'CheckinRoster.getEmployeeTotalHours'错误:

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我改变了这样的规则:

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 

获得如下两个好结果:

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

个而且像这样的,我与在整数变换一些错误或其他东西坏的结果

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

的minWorkedHour和maxWorkedHour是在类FlightAssignemnt整数,蓄能器似乎是双人或浮动。有什么问题?

+0

使用累积函数,请参阅其他optaplanner示例 –

+0

使用max和min获取最大时间和最短时间? – Giancarlo

回答

0

签在论坛上我找到一个recent post与我修改我的问题的解决方案:

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 

但比分我得到的是不符合的解决方案是一致的。我得到-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 

坏的结果

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

任何线索这一奇怪的值?从它们中获取intValue,然后返回2147483647和-2147483648给出差异1

相关问题