From 77b4b318dc140a18bb312562f8411e8f8c474fe7 Mon Sep 17 00:00:00 2001 From: Donato Marrazzo Date: Tue, 4 Sep 2018 17:43:32 +0200 Subject: [PATCH 1/2] introduced taxi rides in connect suitability (status) --- .../flightcrewscheduling/domain/Employee.java | 33 ++++++++++++++----- .../solver/flightCrewSchedulingScoreRules.drl | 5 ++- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/optaplanner-examples/src/main/java/org/optaplanner/examples/flightcrewscheduling/domain/Employee.java b/optaplanner-examples/src/main/java/org/optaplanner/examples/flightcrewscheduling/domain/Employee.java index 0b20bc8d0f6..98899ac32a1 100644 --- a/optaplanner-examples/src/main/java/org/optaplanner/examples/flightcrewscheduling/domain/Employee.java +++ b/optaplanner-examples/src/main/java/org/optaplanner/examples/flightcrewscheduling/domain/Employee.java @@ -27,6 +27,7 @@ @PlanningEntity public class Employee extends AbstractPersistable { + private static final int MAX_TAXI_TIME = 240; private String name; private Airport homeAirport; @@ -67,19 +68,26 @@ public boolean isLastAssignmentArrivingAtHome() { // TODO allow taking a taxi, but penalize it with a soft score instead return lastAssignment.getFlight().getArrivalAirport() == homeAirport; } - - public long countInvalidConnections() { - long count = 0L; + + public ConnectionStatus getConnectionStatus() { + ConnectionStatus healthCheck = new ConnectionStatus(); FlightAssignment previousAssignment = null; + for (FlightAssignment assignment : flightAssignmentSet) { - if (previousAssignment != null - && previousAssignment.getFlight().getArrivalAirport() - != assignment.getFlight().getDepartureAirport()) { - count++; + if (previousAssignment != null) { + Airport previousAirport = previousAssignment.getFlight().getArrivalAirport(); + Airport airport = assignment.getFlight().getDepartureAirport(); + if (previousAirport != airport) { + Long taxiTimeInMinutes = previousAirport.getTaxiTimeInMinutesTo(airport); + if (taxiTimeInMinutes == null || taxiTimeInMinutes > MAX_TAXI_TIME) + healthCheck.invalidConnection++; + else + healthCheck.taxiMinutes += taxiTimeInMinutes == null ? 0 : taxiTimeInMinutes; + } } previousAssignment = assignment; } - return count; + return healthCheck; } public long getFlightDurationTotalInMinutes() { @@ -95,6 +103,15 @@ public String toString() { return name; } + // ************************************************************************ + // Subclasses + // ************************************************************************ + + public class ConnectionStatus { + public long invalidConnection = 0; + public long taxiMinutes = 0; + } + // ************************************************************************ // Simple getters and setters // ************************************************************************ diff --git a/optaplanner-examples/src/main/resources/org/optaplanner/examples/flightcrewscheduling/solver/flightCrewSchedulingScoreRules.drl b/optaplanner-examples/src/main/resources/org/optaplanner/examples/flightcrewscheduling/solver/flightCrewSchedulingScoreRules.drl index e407fd6caa0..b5502fd4c37 100644 --- a/optaplanner-examples/src/main/resources/org/optaplanner/examples/flightcrewscheduling/solver/flightCrewSchedulingScoreRules.drl +++ b/optaplanner-examples/src/main/resources/org/optaplanner/examples/flightcrewscheduling/solver/flightCrewSchedulingScoreRules.drl @@ -56,10 +56,9 @@ end rule "Transfer between two flights" when - // TODO FIXME only allow arrival and departure from the same airport (no taxi's) - Employee($count : countInvalidConnections() > 0) + Employee($cs : connectionStatus) then - scoreHolder.addHardConstraintMatch(kcontext, - $count); + scoreHolder.addMultiConstraintMatch(kcontext, - $cs.invalidConnection, - $cs.taxiMinutes ); end rule "Employee unavailability" From 735e24e8b70acb7fb6f31e040d6373cd6dc422ee Mon Sep 17 00:00:00 2001 From: Donato Marrazzo Date: Tue, 4 Sep 2018 17:44:59 +0200 Subject: [PATCH 2/2] introduced excel based score verifier --- ...lightCrewSchedulingScoreRulesXlsxTest.java | 200 ++++++++++++++++++ .../testFlightCrewSchedulingScoreRules.xlsx | Bin 0 -> 38613 bytes 2 files changed, 200 insertions(+) create mode 100644 optaplanner-examples/src/test/java/org/optaplanner/examples/flightcrewscheduling/solver/FlightCrewSchedulingScoreRulesXlsxTest.java create mode 100644 optaplanner-examples/src/test/resources/org/optaplanner/examples/flightcrewscheduling/solver/testFlightCrewSchedulingScoreRules.xlsx diff --git a/optaplanner-examples/src/test/java/org/optaplanner/examples/flightcrewscheduling/solver/FlightCrewSchedulingScoreRulesXlsxTest.java b/optaplanner-examples/src/test/java/org/optaplanner/examples/flightcrewscheduling/solver/FlightCrewSchedulingScoreRulesXlsxTest.java new file mode 100644 index 00000000000..7e84e00dfb5 --- /dev/null +++ b/optaplanner-examples/src/test/java/org/optaplanner/examples/flightcrewscheduling/solver/FlightCrewSchedulingScoreRulesXlsxTest.java @@ -0,0 +1,200 @@ +/* + * Copyright 2018 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.optaplanner.examples.flightcrewscheduling.solver; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.TreeSet; +import java.util.function.Function; +import java.util.stream.Collectors; + +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.optaplanner.core.api.domain.solution.cloner.SolutionCloner; +import org.optaplanner.core.api.score.buildin.hardsoftlong.HardSoftLongScore; +import org.optaplanner.core.api.solver.SolverFactory; +import org.optaplanner.core.impl.domain.solution.descriptor.SolutionDescriptor; +import org.optaplanner.examples.common.persistence.AbstractXlsxSolutionFileIO; +import org.optaplanner.examples.flightcrewscheduling.app.FlightCrewSchedulingApp; +import org.optaplanner.examples.flightcrewscheduling.domain.Employee; +import org.optaplanner.examples.flightcrewscheduling.domain.FlightAssignment; +import org.optaplanner.examples.flightcrewscheduling.domain.FlightCrewSolution; +import org.optaplanner.examples.flightcrewscheduling.persistence.FlightCrewSchedulingXlsxFileIO; +import org.optaplanner.test.impl.score.buildin.hardsoftlong.HardSoftLongScoreVerifier; + +@RunWith(Parameterized.class) +public class FlightCrewSchedulingScoreRulesXlsxTest { + + public static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm", Locale.ENGLISH); + + private static final String testFileName = "testFlightCrewSchedulingScoreRules.xlsx"; + private static final HardSoftLongScore unassignedScore = HardSoftLongScore.ZERO; + + private String constraintPackage; + private String constraintName; + private HardSoftLongScore expectedScore; + private FlightCrewSolution solution; + private String testSheetName; + + private static HardSoftLongScoreVerifier scoreVerifier = new HardSoftLongScoreVerifier<>( + SolverFactory.createFromXmlResource(FlightCrewSchedulingApp.SOLVER_CONFIG)); + + public FlightCrewSchedulingScoreRulesXlsxTest(String constraintPackage, String constraintName, + HardSoftLongScore expectedScore, FlightCrewSolution solution, String testSheetName) { + this.constraintPackage = constraintPackage; + this.constraintName = constraintName; + this.expectedScore = expectedScore; + this.solution = solution; + this.testSheetName = testSheetName; + } + + @Parameterized.Parameters(name = "{4}") + public static Collection testSheetParameters() { + List parametersList = new ArrayList<>(); + + File testFile = new File( + FlightCrewSchedulingScoreRulesXlsxTest.class.getResource(testFileName).getFile()); + try (InputStream in = new BufferedInputStream(new FileInputStream(testFile))) { + XSSFWorkbook workbook = new XSSFWorkbook(in); + FlightCrewSolution initialSolution = new FlightCrewSchedulingXlsxFileIO().read(testFile); + + TestFlightCrewScoreRulesReader testFileReader = new TestFlightCrewScoreRulesReader( + workbook, initialSolution); + + Object[] currentParameterList; + while ((currentParameterList = testFileReader.nextTestSheetParameterList()) != null) { + parametersList.add(currentParameterList); + } + } catch (IOException | RuntimeException e) { + throw new IllegalStateException( + "Failed reading inputSolutionFile (" + testFile.getName() + ").", e); + } + + return parametersList; + } + + @Test + public void scoreRules() { + scoreVerifier.assertHardWeight(constraintPackage, constraintName, expectedScore.getHardScore(), solution); + scoreVerifier.assertSoftWeight(constraintPackage, constraintName, expectedScore.getSoftScore(), solution); + } + + private static class TestFlightCrewScoreRulesReader + extends AbstractXlsxSolutionFileIO.AbstractXlsxReader { + + private final SolutionCloner solutionCloner = + SolutionDescriptor.buildSolutionDescriptor(FlightCrewSolution.class, FlightAssignment.class, Employee.class) + .getSolutionCloner(); + + private int numberOfSheets, currentTestSheetIndex; + + private final FlightCrewSolution initialSolution; + + private TestFlightCrewScoreRulesReader(XSSFWorkbook workbook, + FlightCrewSolution initialSolution) { + super(workbook); + this.numberOfSheets = workbook.getNumberOfSheets(); + // Test sheets start after Flights sheet + this.currentTestSheetIndex = workbook.getSheetIndex("Flights") + 1; + this.initialSolution = initialSolution; + } + + @Override + public FlightCrewSolution read() { + return initialSolution; + } + + private Object[] nextTestSheetParameterList() { + String constraintPackage; + String constraintName; + HardSoftLongScore expectedScore; + FlightCrewSolution nextSheetSolution; + String testSheetName; + + if (currentTestSheetIndex >= numberOfSheets) { + return null; + } + + nextSheet(workbook.getSheetName(currentTestSheetIndex++)); + testSheetName = currentSheet.getSheetName(); + + nextRow(false); + readHeaderCell("Constraint package"); + constraintPackage = nextStringCell().getStringCellValue(); + nextRow(false); + readHeaderCell("Constraint name"); + constraintName = nextStringCell().getStringCellValue(); + nextRow(false); + nextRow(false); + readHeaderCell("Score"); + expectedScore = HardSoftLongScore.parseScore(nextStringCell().getStringCellValue()); + + nextSheetSolution = solutionCloner.cloneSolution(initialSolution); + + Map employeeMap = nextSheetSolution.getEmployeeList().stream() + .collect(Collectors.toMap(Employee::getName, Function.identity())); + + Map flightAssignmentMap = nextSheetSolution.getFlightAssignmentList() + .stream() + .collect(Collectors.toMap(f -> { + return f.getFlight() + .getFlightNumber() + + "_" + + f.getFlight() + .getDepartureUTCDateTime() + + "_" + + f.getIndexInFlight(); + }, Function.identity())); + + scoreVerifier.assertHardWeight(constraintPackage, constraintName, unassignedScore.getHardScore(), nextSheetSolution); + scoreVerifier.assertSoftWeight(constraintPackage, constraintName, unassignedScore.getSoftScore(), nextSheetSolution); + + nextRow(); + + while (nextRow()) { + String flightNumber = nextStringCell().getStringCellValue(); + LocalDateTime departureUTCDateTime = LocalDateTime.parse(nextStringCell().getStringCellValue(), DATE_TIME_FORMATTER); + String employeeString = nextStringCell().getStringCellValue(); + String[] employeeNames = employeeString.split(", "); + for (int i = 0; i < employeeNames.length; i++) { + Employee employee = employeeMap.get(employeeNames[i]); + if (employee == null) break; + FlightAssignment flightAssignment = flightAssignmentMap.get(flightNumber + "_" + + departureUTCDateTime + "_" + i); + flightAssignment.setEmployee(employee); + // reverse relationship + employee.getFlightAssignmentSet().add(flightAssignment); + } + } + + return new Object[] { constraintPackage, constraintName, expectedScore, + nextSheetSolution, testSheetName }; + } + } +} diff --git a/optaplanner-examples/src/test/resources/org/optaplanner/examples/flightcrewscheduling/solver/testFlightCrewSchedulingScoreRules.xlsx b/optaplanner-examples/src/test/resources/org/optaplanner/examples/flightcrewscheduling/solver/testFlightCrewSchedulingScoreRules.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c49c5924e5aa5f4c5d4d07f7d08b0c3b2bf07d21 GIT binary patch literal 38613 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 EAM&QMTmS$7 literal 0 HcmV?d00001