58 lines
2.4 KiB
Java
Raw Normal View History

2023-11-21 14:09:04 +01:00
package com.baeldung.timefoldsolver;
import java.time.Duration;
import java.time.LocalDate;
import java.util.List;
import java.util.Set;
2023-11-25 21:09:32 +01:00
import org.junit.jupiter.api.Test;
2023-11-24 21:40:29 +01:00
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
2023-11-21 14:09:04 +01:00
import ai.timefold.solver.core.api.solver.Solver;
import ai.timefold.solver.core.api.solver.SolverFactory;
import ai.timefold.solver.core.config.solver.SolverConfig;
2023-11-25 21:09:32 +01:00
import ai.timefold.solver.core.config.solver.termination.TerminationConfig;
2023-11-21 14:09:04 +01:00
2023-11-25 21:09:32 +01:00
public class ShiftScheduleSolverUnitTest {
2023-11-21 14:09:04 +01:00
2023-11-25 21:09:32 +01:00
private static final Logger logger = LoggerFactory.getLogger(ShiftScheduleSolverUnitTest.class);
2023-11-24 21:01:28 +01:00
2023-11-25 21:09:32 +01:00
@Test
public void solve() {
2023-11-24 21:40:29 +01:00
SolverFactory<ShiftSchedule> solverFactory = SolverFactory.create(new SolverConfig().withSolutionClass(ShiftSchedule.class)
.withEntityClasses(Shift.class)
.withConstraintProviderClass(ShiftScheduleConstraintProvider.class)
2023-11-25 14:15:27 +01:00
// The solver runs only for 2 seconds on this tiny dataset.
// It's recommended to run for at least 5 minutes ("5m") on large datasets.
.withTerminationSpentLimit(Duration.ofSeconds(2)));
2023-11-21 14:09:04 +01:00
Solver<ShiftSchedule> solver = solverFactory.buildSolver();
ShiftSchedule problem = loadProblem();
ShiftSchedule solution = solver.solve(problem);
printSolution(solution);
}
2023-11-25 21:09:32 +01:00
private ShiftSchedule loadProblem() {
2023-11-21 14:09:04 +01:00
LocalDate monday = LocalDate.of(2030, 4, 1);
LocalDate tuesday = LocalDate.of(2030, 4, 2);
2023-11-24 21:40:29 +01:00
return new ShiftSchedule(
List.of(new Employee("Ann", Set.of("Bartender")), new Employee("Beth", Set.of("Waiter", "Bartender")), new Employee("Carl", Set.of("Waiter"))),
List.of(new Shift(monday.atTime(6, 0), monday.atTime(14, 0), "Waiter"), new Shift(monday.atTime(9, 0), monday.atTime(17, 0), "Bartender"),
new Shift(monday.atTime(14, 0), monday.atTime(22, 0), "Bartender"), new Shift(tuesday.atTime(6, 0), tuesday.atTime(14, 0), "Waiter"),
new Shift(tuesday.atTime(14, 0), tuesday.atTime(22, 0), "Bartender")));
2023-11-21 14:09:04 +01:00
}
2023-11-25 21:09:32 +01:00
private void printSolution(ShiftSchedule solution) {
2023-11-24 21:01:28 +01:00
logger.info("Shift assignments");
2023-11-21 14:09:04 +01:00
for (Shift shift : solution.getShifts()) {
2023-11-24 21:40:29 +01:00
logger.info(" " + shift.getStart()
.toLocalDate() + " " + shift.getStart()
.toLocalTime() + " - " + shift.getEnd()
.toLocalTime() + ": " + shift.getEmployee()
.getName());
2023-11-21 14:09:04 +01:00
}
}
}