diff --git a/jsprit-io/src/main/java/com/graphhopper/jsprit/io/algorithm/VehicleRoutingAlgorithms.java b/jsprit-io/src/main/java/com/graphhopper/jsprit/io/algorithm/VehicleRoutingAlgorithms.java index 07ebaa97..23a73527 100644 --- a/jsprit-io/src/main/java/com/graphhopper/jsprit/io/algorithm/VehicleRoutingAlgorithms.java +++ b/jsprit-io/src/main/java/com/graphhopper/jsprit/io/algorithm/VehicleRoutingAlgorithms.java @@ -364,11 +364,11 @@ public class VehicleRoutingAlgorithms { * @return {@link com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm} */ public static VehicleRoutingAlgorithm createAlgorithm(final VehicleRoutingProblem vrp, final AlgorithmConfig algorithmConfig) { - return createAlgo(vrp, algorithmConfig.getXMLConfiguration(), 0, null); + return createAlgo(vrp, algorithmConfig.getXMLConfiguration(), 0, null, null); } public static VehicleRoutingAlgorithm createAlgorithm(final VehicleRoutingProblem vrp, int nThreads, final AlgorithmConfig algorithmConfig) { - return createAlgo(vrp, algorithmConfig.getXMLConfiguration(), nThreads, null); + return createAlgo(vrp, algorithmConfig.getXMLConfiguration(), nThreads, null, null); } /** @@ -382,14 +382,14 @@ public class VehicleRoutingAlgorithms { AlgorithmConfig algorithmConfig = new AlgorithmConfig(); AlgorithmConfigXmlReader xmlReader = new AlgorithmConfigXmlReader(algorithmConfig); xmlReader.read(configURL); - return createAlgo(vrp, algorithmConfig.getXMLConfiguration(), 0, null); + return createAlgo(vrp, algorithmConfig.getXMLConfiguration(), 0, null, null); } public static VehicleRoutingAlgorithm readAndCreateAlgorithm(final VehicleRoutingProblem vrp, int nThreads, final URL configURL) { AlgorithmConfig algorithmConfig = new AlgorithmConfig(); AlgorithmConfigXmlReader xmlReader = new AlgorithmConfigXmlReader(algorithmConfig); xmlReader.read(configURL); - return createAlgo(vrp, algorithmConfig.getXMLConfiguration(), nThreads, null); + return createAlgo(vrp, algorithmConfig.getXMLConfiguration(), nThreads, null, null); } /** @@ -403,28 +403,35 @@ public class VehicleRoutingAlgorithms { AlgorithmConfig algorithmConfig = new AlgorithmConfig(); AlgorithmConfigXmlReader xmlReader = new AlgorithmConfigXmlReader(algorithmConfig); xmlReader.read(configFileName); - return createAlgo(vrp, algorithmConfig.getXMLConfiguration(), 0, null); + return createAlgo(vrp, algorithmConfig.getXMLConfiguration(), 0, null, null); } public static VehicleRoutingAlgorithm readAndCreateAlgorithm(final VehicleRoutingProblem vrp, final String configFileName, StateManager stateManager) { AlgorithmConfig algorithmConfig = new AlgorithmConfig(); AlgorithmConfigXmlReader xmlReader = new AlgorithmConfigXmlReader(algorithmConfig); xmlReader.read(configFileName); - return createAlgo(vrp, algorithmConfig.getXMLConfiguration(), 0, stateManager); + return createAlgo(vrp, algorithmConfig.getXMLConfiguration(), 0, stateManager, null); } public static VehicleRoutingAlgorithm readAndCreateAlgorithm(final VehicleRoutingProblem vrp, int nThreads, final String configFileName, StateManager stateManager) { AlgorithmConfig algorithmConfig = new AlgorithmConfig(); AlgorithmConfigXmlReader xmlReader = new AlgorithmConfigXmlReader(algorithmConfig); xmlReader.read(configFileName); - return createAlgo(vrp, algorithmConfig.getXMLConfiguration(), nThreads, stateManager); + return createAlgo(vrp, algorithmConfig.getXMLConfiguration(), nThreads, stateManager, null); } public static VehicleRoutingAlgorithm readAndCreateAlgorithm(VehicleRoutingProblem vrp, int nThreads, String configFileName) { AlgorithmConfig algorithmConfig = new AlgorithmConfig(); AlgorithmConfigXmlReader xmlReader = new AlgorithmConfigXmlReader(algorithmConfig); xmlReader.read(configFileName); - return createAlgo(vrp, algorithmConfig.getXMLConfiguration(), nThreads, null); + return createAlgo(vrp, algorithmConfig.getXMLConfiguration(), nThreads, null, null); + } + + public static VehicleRoutingAlgorithm readAndCreateAlgorithm(VehicleRoutingProblem vrp, int nThreads, String configFileName, SolutionCostCalculator solutionCostCalculator) { + AlgorithmConfig algorithmConfig = new AlgorithmConfig(); + AlgorithmConfigXmlReader xmlReader = new AlgorithmConfigXmlReader(algorithmConfig); + xmlReader.read(configFileName); + return createAlgo(vrp, algorithmConfig.getXMLConfiguration(), nThreads, null, solutionCostCalculator); } private static class OpenRouteStateVerifier implements StateUpdater, ReverseActivityVisitor { @@ -459,7 +466,7 @@ public class VehicleRoutingAlgorithms { } - private static VehicleRoutingAlgorithm createAlgo(final VehicleRoutingProblem vrp, XMLConfiguration config, int nuOfThreads, StateManager stateMan) { + private static VehicleRoutingAlgorithm createAlgo(final VehicleRoutingProblem vrp, XMLConfiguration config, int nuOfThreads, StateManager stateMan, SolutionCostCalculator solutionCostCalculator) { //create state-manager final StateManager stateManager; if (stateMan != null) { @@ -485,7 +492,7 @@ public class VehicleRoutingAlgorithms { constraintManager.addSkillsConstraint(); constraintManager.addConstraint(new SwitchNotFeasible(stateManager)); - return readAndCreateAlgorithm(vrp, config, nuOfThreads, null, stateManager, constraintManager, true, true); + return readAndCreateAlgorithm(vrp, config, nuOfThreads, solutionCostCalculator, stateManager, constraintManager, true, true); } public static VehicleRoutingAlgorithm readAndCreateAlgorithm(final VehicleRoutingProblem vrp, AlgorithmConfig config, @@ -584,11 +591,17 @@ public class VehicleRoutingAlgorithms { stateManager.addStateUpdater(new UpdateActivityTimes(vrp.getTransportCosts(), activityPolicy, vrp.getActivityCosts())); stateManager.addStateUpdater(new UpdateVariableCosts(vrp.getActivityCosts(), vrp.getTransportCosts(), stateManager, activityPolicy)); - final SolutionCostCalculator costCalculator; - if (solutionCostCalculator == null) costCalculator = getDefaultCostCalculator(stateManager); - else costCalculator = solutionCostCalculator; PrettyAlgorithmBuilder prettyAlgorithmBuilder = PrettyAlgorithmBuilder.newInstance(vrp, vehicleFleetManager, stateManager, constraintManager); + final SolutionCostCalculator costCalculator; + if (solutionCostCalculator == null) { + costCalculator = getDefaultCostCalculator(stateManager); + } + else { + costCalculator = solutionCostCalculator; + prettyAlgorithmBuilder.withObjectiveFunction(solutionCostCalculator); + } + if(addCoreConstraints) prettyAlgorithmBuilder.addCoreStateAndConstraintStuff(); //construct initial solution creator @@ -873,7 +886,7 @@ public class VehicleRoutingAlgorithms { String initialNumberJobsToRemoveString = moduleConfig.getString("ruin.initRemoveJobs"); if (initialNumberJobsToRemoveString == null) throw new IllegalStateException("module.ruin.initRemoveJobs is missing."); int initialNumberJobsToRemove = Integer.valueOf(initialNumberJobsToRemoveString); - ruin = getClusterRuin(vrp, routeStates, definedClasses, ruinKey, initialNumberJobsToRemove); + ruin = getClusterRuin(vrp, routeStates, definedClasses, ruinKey, initialNumberJobsToRemove); } else throw new IllegalStateException("ruin[@name] " + ruin_name + " is not known. Use either randomRuin or radialRuin."); String insertionName = moduleConfig.getString("insertion[@name]"); @@ -916,12 +929,12 @@ public class VehicleRoutingAlgorithms { } private static RuinStrategy getClusterRuin(final VehicleRoutingProblem vrp, final StateManager routeStates, TypedMap definedClasses, ModKey modKey, int initialNumberJobsToRemove) { - JobNeighborhoods jobNeighborhoods = new JobNeighborhoodsFactory().createNeighborhoods(vrp, new AvgServiceAndShipmentDistance(vrp.getTransportCosts())); - RuinStrategyKey stratKey = new RuinStrategyKey(modKey); + JobNeighborhoods jobNeighborhoods = new JobNeighborhoodsFactory().createNeighborhoods(vrp, new AvgServiceAndShipmentDistance(vrp.getTransportCosts())); + RuinStrategyKey stratKey = new RuinStrategyKey(modKey); RuinStrategy ruin = definedClasses.get(stratKey); if (ruin == null) { - ruin = new ClusterRuinStrategyFactory(initialNumberJobsToRemove, jobNeighborhoods).createStrategy(vrp); - definedClasses.put(stratKey, ruin); + ruin = new ClusterRuinStrategyFactory(initialNumberJobsToRemove, jobNeighborhoods).createStrategy(vrp); + definedClasses.put(stratKey, ruin); } return ruin; } diff --git a/jsprit-io/src/test/java/com/graphhopper/jsprit/io/algorithm/TestAlgorithmReader.java b/jsprit-io/src/test/java/com/graphhopper/jsprit/io/algorithm/TestAlgorithmReader.java index 3c69ab6e..48209465 100644 --- a/jsprit-io/src/test/java/com/graphhopper/jsprit/io/algorithm/TestAlgorithmReader.java +++ b/jsprit-io/src/test/java/com/graphhopper/jsprit/io/algorithm/TestAlgorithmReader.java @@ -30,6 +30,7 @@ import com.graphhopper.jsprit.core.algorithm.selector.SelectBest; import com.graphhopper.jsprit.core.algorithm.selector.SolutionSelector; import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem; import com.graphhopper.jsprit.core.problem.job.Job; +import com.graphhopper.jsprit.core.problem.solution.SolutionCostCalculator; import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution; import com.graphhopper.jsprit.core.problem.solution.route.VehicleRoute; import com.graphhopper.jsprit.io.algorithm.VehicleRoutingAlgorithms.ModKey; @@ -42,6 +43,7 @@ import junit.framework.Assert; import org.apache.commons.configuration.ConfigurationException; import org.junit.Before; import org.junit.Test; +import org.mockito.Mockito; import java.util.ArrayList; import java.util.Collection; @@ -283,4 +285,12 @@ public class TestAlgorithmReader { } + @Test + public void testWithVehicleRoutingAlgorithm() { + SolutionCostCalculator solutionCostCalculator = Mockito.mock(SolutionCostCalculator.class); + VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, 10, getClass().getResource("algorithmConfig_withoutIterations.xml").getFile(), solutionCostCalculator); + vra.getObjectiveFunction().equals(solutionCostCalculator); + } + + }