11
11
import choco.cpmodel.CPModel
12
12
import choco.model.variables.integer.IntegerVariable
13
13
import com.pilango.workplan.services.TimeSlotService
14
import org.hibernate.criterion.CriteriaSpecification
15
16
import static choco.Choco.*
27
36
ChocoHelper(CPModel m) {
31
void setup(Site [] sites, Shift [] shifts, Worker [] workers, int daysInMonth) {
33
int [] siteIds = sites.collect { it.id }
34
int [] workerIds = workers.collect { it.id }
35
shiftVars = shifts.collect {
36
new ShiftVars(id++, siteIds, workerIds, daysInMonth)
40
40
void bestTimeSlots(TimeSlot [] emptySlots, TimeSlot [] preferredSlots) {
41
41
int NB_SLOTS = emptySlots.size()
42
42
slotIndices = new IntegerVariable [NB_SLOTS]
50
50
total = makeBoundIntVar("total", 0, TimeSlot.MAX_SLOT_DISTANCE * NB_SLOTS)
51
51
m.addConstraint(allDifferent(slotIndices))
52
m.addConstraint(eq(total, sum(slotDistances)))
52
m.addConstraint(eq(total, sum(slotDistances)))
55
void setupShiftVars(Worker [] workers, Shift [] shifts, int daysInMonth) {
56
int [] siteIds = (shifts.collect { it.site.id }).unique()
57
int [] workerIds = workers.collect { it.id }
58
int [] shiftIds = shifts.collect { it.id }
59
shiftVars = shifts.collect {
60
new ShiftVars(shiftIds, siteIds, workerIds, daysInMonth)
62
IntegerVariable [] vars = shiftVars.collect { it.id }
63
def feasTuples = shifts.collect { shift ->
64
int [] tuple = [shift.id, shift.site.id, shift.dayInMonth]
67
shiftVars.each { shiftVar ->
68
IntegerVariable [] feasVars = [shiftVar.id, shiftVar.siteId, shiftVar.dayInMonth]
69
m.addConstraint(feasTupleAC(feasTuples, feasVars))
71
IntegerVariable [] shiftIdVars = shiftVars.collect { it.id }
72
m.addConstraint(allDifferent(shiftIdVars))
55
75
void setWorkerDaysOffConstraints(Worker [] workers) {
56
76
workers.each { worker ->
57
77
worker.daysOff.each { dayOff ->
58
78
shiftVars.each { shiftVar ->
59
m.addConstraint(not(and(eq(shiftVar.workerId, worker.id), eq(shiftVar.dayOfMonth, dayOff))))
79
m.addConstraint(makeExpression(not(and(eq(var(shiftVar.workerId), var(worker.id)), eq(var(shiftVar.dayInMonth), var(dayOff))))))