From 41c983184ecc85dfc146a52088c833198bcaab36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Wed, 3 Feb 2010 11:35:22 +0100 Subject: [PATCH] ItEr46S12CUVisualizacionResponsabilidadesTRaballoNaPlanificacion: Changing assignation algorithm. Calculating the hours corresponding for each allocation at the start instead of on each algorithm's iteration --- ...orForSpecifiedResourcesPerDayAndHours.java | 44 ++++++++++++------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/AllocatorForSpecifiedResourcesPerDayAndHours.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/AllocatorForSpecifiedResourcesPerDayAndHours.java index d97331e9d..1fd907a93 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/AllocatorForSpecifiedResourcesPerDayAndHours.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/allocationalgorithms/AllocatorForSpecifiedResourcesPerDayAndHours.java @@ -57,17 +57,33 @@ public abstract class AllocatorForSpecifiedResourcesPerDayAndHours { } public LocalDate untilAllocating(int hoursToAllocate) { + int i = 0; + int maxDaysElapsed = 0; + for (Integer each : hoursForEachAllocation(hoursToAllocate)) { + ResourcesPerDayModification currentAllocation = allocations.get(i); + int daysElapsedForCurrent = untilAllocating(currentAllocation, each); + maxDaysElapsed = Math.max(maxDaysElapsed, daysElapsedForCurrent); + i++; + } + setAssignmentsForEachAllocation(); + LocalDate start = LocalDate.fromDateFields(task.getStartDate()); + return start.plusDays(maxDaysElapsed); + } + + private int untilAllocating( + ResourcesPerDayModification resourcesPerDayModification, + Integer hoursToAllocate) { int hoursRemaining = hoursToAllocate; LocalDate start = new LocalDate(task.getStartDate().getTime()); int day = 0; while (hoursRemaining > 0) { LocalDate current = start.plusDays(day); - int taken = assignForDay(current, hoursRemaining); + int taken = assignForDay(resourcesPerDayModification, current, + hoursRemaining); hoursRemaining = hoursRemaining - taken; day++; } - setAssignmentsForEachAllocation(); - return start.plusDays(day); + return day; } private void setAssignmentsForEachAllocation() { @@ -89,21 +105,17 @@ public abstract class AllocatorForSpecifiedResourcesPerDayAndHours { protected abstract List createAssignmentsAtDay( ResourcesPerDayModification allocation, LocalDate day, Integer limit); - private int assignForDay(LocalDate day, int toBeAssigned) { - int i = 0; - int total = 0; - List maxPerAllocations = calculateLimits(toBeAssigned); - for (ResourcesPerDayModification each : allocations) { - List assignments = createAssignmentsAtDay(each, day, - maxPerAllocations.get(i)); - resultAssignments.get(each).addAll(assignments); - total += DayAssignment.sum(assignments); - i++; - } - return total; + private int assignForDay( + ResourcesPerDayModification resourcesPerDayModification, + LocalDate day, int remaining) { + List newAssignments = createAssignmentsAtDay( + resourcesPerDayModification, day, remaining); + resultAssignments.get(resourcesPerDayModification).addAll( + newAssignments); + return DayAssignment.sum(newAssignments); } - private List calculateLimits(int toBeAssigned) { + private List hoursForEachAllocation(int toBeAssigned) { BigDecimal[] limits = new BigDecimal[allocations.size()]; BigDecimal sumAll = sumAll(); for (int i = 0; i < limits.length; i++) {