From ee418afa9356e9adf0dd994ae1a0c85ea8fbd8d9 Mon Sep 17 00:00:00 2001 From: oblonski Date: Sat, 12 Sep 2015 00:46:11 +0200 Subject: [PATCH] add updater --- .../algorithm/PrettyAlgorithmBuilder.java | 18 ++-- .../VariableStartAndWaitingTimeExample2.java | 96 ------------------- ...meExample.java => WaitingTimeExample.java} | 89 ++++++++--------- .../jsprit/examples/WaitingTimeExample2.java | 90 +++++++++++++++++ 4 files changed, 142 insertions(+), 151 deletions(-) delete mode 100644 jsprit-examples/src/main/java/jsprit/examples/VariableStartAndWaitingTimeExample2.java rename jsprit-examples/src/main/java/jsprit/examples/{VariableStartAndWaitingTimeExample.java => WaitingTimeExample.java} (56%) create mode 100644 jsprit-examples/src/main/java/jsprit/examples/WaitingTimeExample2.java diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/PrettyAlgorithmBuilder.java b/jsprit-core/src/main/java/jsprit/core/algorithm/PrettyAlgorithmBuilder.java index 41b33089..84df59c6 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/PrettyAlgorithmBuilder.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/PrettyAlgorithmBuilder.java @@ -91,17 +91,17 @@ public class PrettyAlgorithmBuilder { constraintManager.addSkillsConstraint(); stateManager.updateLoadStates(); stateManager.updateTimeWindowStates(); - UpdateVehicleDependentPracticalTimeWindows tw_updater = new UpdateVehicleDependentPracticalTimeWindows(stateManager, vrp.getTransportCosts()); - tw_updater.setVehiclesToUpdate(new UpdateVehicleDependentPracticalTimeWindows.VehiclesToUpdate() { + UpdateVehicleDependentPracticalTimeWindows twUpdater = new UpdateVehicleDependentPracticalTimeWindows(stateManager, vrp.getTransportCosts()); + twUpdater.setVehiclesToUpdate(new UpdateVehicleDependentPracticalTimeWindows.VehiclesToUpdate() { - Map uniqueTypes = new HashMap(); + Map uniqueTypes = new HashMap(); @Override public Collection get(VehicleRoute vehicleRoute) { - if(uniqueTypes.isEmpty()){ - for( Vehicle v : vrp.getVehicles()){ - if(!uniqueTypes.containsKey(v.getVehicleTypeIdentifier())){ - uniqueTypes.put(v.getVehicleTypeIdentifier(),v); + if (uniqueTypes.isEmpty()) { + for (Vehicle v : vrp.getVehicles()) { + if (!uniqueTypes.containsKey(v.getVehicleTypeIdentifier())) { + uniqueTypes.put(v.getVehicleTypeIdentifier(), v); } } } @@ -109,12 +109,14 @@ public class PrettyAlgorithmBuilder { vehicles.addAll(uniqueTypes.values()); return vehicles; } + }); - stateManager.addStateUpdater(tw_updater); + stateManager.addStateUpdater(twUpdater); stateManager.updateSkillStates(); stateManager.addStateUpdater(new UpdateEndLocationIfRouteIsOpen()); stateManager.addStateUpdater(new UpdateActivityTimes(vrp.getTransportCosts(), ActivityTimeTracker.ActivityPolicy.AS_SOON_AS_TIME_WINDOW_OPENS)); stateManager.addStateUpdater(new UpdateVariableCosts(vrp.getActivityCosts(), vrp.getTransportCosts(), stateManager)); + stateManager.addStateUpdater(new UpdateFutureWaitingTimes(stateManager,vrp.getTransportCosts())); } VehicleRoutingAlgorithm vra = new VehicleRoutingAlgorithm(vrp,searchStrategyManager); vra.addListener(stateManager); diff --git a/jsprit-examples/src/main/java/jsprit/examples/VariableStartAndWaitingTimeExample2.java b/jsprit-examples/src/main/java/jsprit/examples/VariableStartAndWaitingTimeExample2.java deleted file mode 100644 index fe29c99f..00000000 --- a/jsprit-examples/src/main/java/jsprit/examples/VariableStartAndWaitingTimeExample2.java +++ /dev/null @@ -1,96 +0,0 @@ -package jsprit.examples; - -import jsprit.analysis.toolbox.AlgorithmSearchProgressChartListener; -import jsprit.analysis.toolbox.Plotter; -import jsprit.core.algorithm.VehicleRoutingAlgorithm; -import jsprit.core.algorithm.box.Jsprit; -import jsprit.core.algorithm.state.StateManager; -import jsprit.core.algorithm.state.UpdateFutureWaitingTimes; -import jsprit.core.problem.Location; -import jsprit.core.problem.VehicleRoutingProblem; -import jsprit.core.problem.constraint.ConstraintManager; -import jsprit.core.problem.job.Service; -import jsprit.core.problem.solution.SolutionCostCalculator; -import jsprit.core.problem.solution.VehicleRoutingProblemSolution; -import jsprit.core.problem.solution.route.VehicleRoute; -import jsprit.core.problem.solution.route.activity.TimeWindow; -import jsprit.core.problem.solution.route.activity.TourActivity; -import jsprit.core.problem.vehicle.VehicleImpl; -import jsprit.core.problem.vehicle.VehicleTypeImpl; -import jsprit.core.reporting.SolutionPrinter; -import jsprit.core.util.Solutions; - -/** - * Created by schroeder on 23/07/15. - */ -public class VariableStartAndWaitingTimeExample2 { - - static interface AlgorithmFactory { - VehicleRoutingAlgorithm createAlgorithm(VehicleRoutingProblem vrp); - } - - public static void main(String[] args) { - - VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("type").setCostPerDistance(1.5).setCostPerWaitingTime(1.).build(); -// VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("type1").setCostPerDistance(1.5).setCostPerWaitingTime(.0).build(); - - VehicleImpl v2 = VehicleImpl.Builder.newInstance("v2").setType(type).setReturnToDepot(true) - .setStartLocation(Location.newInstance(0, 0)).build(); - - VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance(); - - - Service s1 = Service.Builder.newInstance("s12").setLocation(Location.newInstance(-1, 5)).setTimeWindow(TimeWindow.newInstance(100, 110)).build(); - Service s4 = Service.Builder.newInstance("s13").setLocation(Location.newInstance(0, 10)).build(); - Service s2 = Service.Builder.newInstance("s10").setLocation(Location.newInstance(1, 12)).build(); - Service s3 = Service.Builder.newInstance("s11").setLocation(Location.newInstance(4, 10)).build(); - Service s5 = Service.Builder.newInstance("s14").setLocation(Location.newInstance(6, 5)).setTimeWindow(TimeWindow.newInstance(110,220)).build(); - vrpBuilder.addJob(s1).addJob(s2).addJob(s3).addJob(s4).addJob(s5).addVehicle(v2); - vrpBuilder.setFleetSize(VehicleRoutingProblem.FleetSize.FINITE); - final VehicleRoutingProblem vrp = vrpBuilder.build(); - - AlgorithmFactory algorithmFactory = new AlgorithmFactory() { - @Override - public VehicleRoutingAlgorithm createAlgorithm(final VehicleRoutingProblem vrp) { - StateManager stateManager = new StateManager(vrp); - stateManager.addStateUpdater(new UpdateFutureWaitingTimes(stateManager,vrp.getTransportCosts())); - ConstraintManager constraintManager = new ConstraintManager(vrp,stateManager); - - return Jsprit.Builder.newInstance(vrp) - .addCoreStateAndConstraintStuff(true) - .setStateAndConstraintManager(stateManager, constraintManager) -// .setProperty(Jsprit.Parameter.THRESHOLD_INI, "0.1") -// .setProperty(Jsprit.Parameter.THRESHOLD_ALPHA, "0.3") -// .setProperty(Parameter.) -// .setProperty(Jsprit.Parameter.CONSTRUCTION, Jsprit.Construction.BEST_INSERTION.toString()) - .setObjectiveFunction(new SolutionCostCalculator() { - @Override - public double getCosts(VehicleRoutingProblemSolution solution) { - double costs = 0.; - for (VehicleRoute route : solution.getRoutes()) { - costs += route.getVehicle().getType().getVehicleCostParams().fix; - TourActivity prevAct = route.getStart(); - for (TourActivity act : route.getActivities()) { - costs += vrp.getTransportCosts().getTransportCost(prevAct.getLocation(), act.getLocation(), prevAct.getEndTime(), route.getDriver(), route.getVehicle()); - costs += vrp.getActivityCosts().getActivityCost(act, act.getArrTime(), route.getDriver(), route.getVehicle()); - prevAct = act; - } - costs += vrp.getTransportCosts().getTransportCost(prevAct.getLocation(), route.getEnd().getLocation(), prevAct.getEndTime(), route.getDriver(), route.getVehicle()); - } - costs += solution.getUnassignedJobs().size() * 200; - return costs; - } - }) - .buildAlgorithm(); - } - }; - VehicleRoutingAlgorithm vra = algorithmFactory.createAlgorithm(vrp); - vra.setMaxIterations(1000); - vra.addListener(new AlgorithmSearchProgressChartListener("output/search")); - VehicleRoutingProblemSolution solution = Solutions.bestOf(vra.searchSolutions()); - System.out.println("c: " + solution.getCost()); - SolutionPrinter.print(vrp, solution, SolutionPrinter.Print.VERBOSE); - - new Plotter(vrp,solution).setLabel(Plotter.Label.ID).plot("output/plot","plot"); - } -} diff --git a/jsprit-examples/src/main/java/jsprit/examples/VariableStartAndWaitingTimeExample.java b/jsprit-examples/src/main/java/jsprit/examples/WaitingTimeExample.java similarity index 56% rename from jsprit-examples/src/main/java/jsprit/examples/VariableStartAndWaitingTimeExample.java rename to jsprit-examples/src/main/java/jsprit/examples/WaitingTimeExample.java index 7e9c80ae..6ee8e975 100644 --- a/jsprit-examples/src/main/java/jsprit/examples/VariableStartAndWaitingTimeExample.java +++ b/jsprit-examples/src/main/java/jsprit/examples/WaitingTimeExample.java @@ -4,19 +4,13 @@ import jsprit.analysis.toolbox.AlgorithmSearchProgressChartListener; import jsprit.analysis.toolbox.Plotter; import jsprit.core.algorithm.VehicleRoutingAlgorithm; import jsprit.core.algorithm.box.Jsprit; -import jsprit.core.algorithm.state.StateManager; -import jsprit.core.algorithm.state.UpdateFutureWaitingTimes; import jsprit.core.analysis.SolutionAnalyser; import jsprit.core.problem.Location; import jsprit.core.problem.VehicleRoutingProblem; -import jsprit.core.problem.constraint.ConstraintManager; import jsprit.core.problem.cost.TransportDistance; import jsprit.core.problem.job.Service; -import jsprit.core.problem.solution.SolutionCostCalculator; import jsprit.core.problem.solution.VehicleRoutingProblemSolution; -import jsprit.core.problem.solution.route.VehicleRoute; import jsprit.core.problem.solution.route.activity.TimeWindow; -import jsprit.core.problem.solution.route.activity.TourActivity; import jsprit.core.problem.vehicle.VehicleImpl; import jsprit.core.problem.vehicle.VehicleTypeImpl; import jsprit.core.reporting.SolutionPrinter; @@ -28,7 +22,7 @@ import java.util.Random; /** * Created by schroeder on 23/07/15. */ -public class VariableStartAndWaitingTimeExample { +public class WaitingTimeExample { static interface AlgorithmFactory { VehicleRoutingAlgorithm createAlgorithm(VehicleRoutingProblem vrp); @@ -36,15 +30,15 @@ public class VariableStartAndWaitingTimeExample { public static void main(String[] args) { - VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("type").setCostPerDistance(4.).setCostPerWaitingTime(2.0).build(); - VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("type1").setCostPerDistance(4.).setCostPerWaitingTime(2.0).build(); + VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("type").setCostPerDistance(4.).setCostPerWaitingTime(1.0).build(); + VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("type1").setCostPerDistance(4.).setCostPerWaitingTime(1.0).build(); // VehicleTypeImpl type2 = VehicleTypeImpl.Builder.newInstance("type2").setCostPerDistance(4.).setCostPerWaitingTime(2.0).build(); - VehicleImpl v2 = VehicleImpl.Builder.newInstance("v2").setType(type).setReturnToDepot(false) + VehicleImpl v2 = VehicleImpl.Builder.newInstance("v2").setType(type).setReturnToDepot(true) .setStartLocation(Location.newInstance(0, 0)) .setEarliestStart(0).setLatestArrival(220) .build(); - VehicleImpl v3 = VehicleImpl.Builder.newInstance("v3").setType(type1).setReturnToDepot(false) + VehicleImpl v3 = VehicleImpl.Builder.newInstance("v3").setType(type1).setReturnToDepot(true) .setStartLocation(Location.newInstance(0, 10)) .setEarliestStart(200).setLatestArrival(450) .build(); @@ -61,47 +55,48 @@ public class VariableStartAndWaitingTimeExample { Service s1 = Service.Builder.newInstance("s12").setLocation(Location.newInstance(-3, 15)).setTimeWindow(TimeWindow.newInstance(290, 600)).build(); Service s4 = Service.Builder.newInstance("s13").setLocation(Location.newInstance(0,20)).setTimeWindow(TimeWindow.newInstance(290, 340)).build(); Service s2 = Service.Builder.newInstance("s10").setLocation(Location.newInstance(-1, 15)).setTimeWindow(TimeWindow.newInstance(300, 350)).build(); - Service s3 = Service.Builder.newInstance("s11").setLocation(Location.newInstance(10, 10)).setTimeWindow(TimeWindow.newInstance(300, 600)).build(); + Service s3 = Service.Builder.newInstance("s11").setLocation(Location.newInstance(10, 10)).setTimeWindow(TimeWindow.newInstance(400, 600)).build(); vrpBuilder.addJob(s1).addJob(s2).addJob(s3).addJob(s4).addVehicle(v2).addVehicle(v3); vrpBuilder.setFleetSize(VehicleRoutingProblem.FleetSize.FINITE); final VehicleRoutingProblem vrp = vrpBuilder.build(); - AlgorithmFactory algorithmFactory = new AlgorithmFactory() { - @Override - public VehicleRoutingAlgorithm createAlgorithm(final VehicleRoutingProblem vrp) { - StateManager stateManager = new StateManager(vrp); - stateManager.addStateUpdater(new UpdateFutureWaitingTimes(stateManager,vrp.getTransportCosts())); - ConstraintManager constraintManager = new ConstraintManager(vrp,stateManager); +// AlgorithmFactory algorithmFactory = new AlgorithmFactory() { +// @Override +// public VehicleRoutingAlgorithm createAlgorithm(final VehicleRoutingProblem vrp) { +// StateManager stateManager = new StateManager(vrp); +// stateManager.addStateUpdater(new UpdateFutureWaitingTimes(stateManager,vrp.getTransportCosts())); +// ConstraintManager constraintManager = new ConstraintManager(vrp,stateManager); +// +// return Jsprit.Builder.newInstance(vrp) +// .addCoreStateAndConstraintStuff(true) +// .setStateAndConstraintManager(stateManager, constraintManager) +// .setProperty(Jsprit.Parameter.THRESHOLD_INI, "0.1") +//// .setProperty(Jsprit.Parameter.THRESHOLD_ALPHA, "0.3") +//// .setProperty(Parameter.) +//// .setProperty(Jsprit.Parameter.CONSTRUCTION, Jsprit.Construction.BEST_INSERTION.toString()) +// .setObjectiveFunction(new SolutionCostCalculator() { +// @Override +// public double getCosts(VehicleRoutingProblemSolution solution) { +// double costs = 0.; +// for (VehicleRoute route : solution.getRoutes()) { +// costs += route.getVehicle().getType().getVehicleCostParams().fix; +// TourActivity prevAct = route.getStart(); +// for (TourActivity act : route.getActivities()) { +// costs += vrp.getTransportCosts().getTransportCost(prevAct.getLocation(), act.getLocation(), prevAct.getEndTime(), route.getDriver(), route.getVehicle()); +// costs += vrp.getActivityCosts().getActivityCost(act, act.getArrTime(), route.getDriver(), route.getVehicle()); +// prevAct = act; +// } +// costs += vrp.getTransportCosts().getTransportCost(prevAct.getLocation(), route.getEnd().getLocation(), prevAct.getEndTime(), route.getDriver(), route.getVehicle()); +// } +// costs += solution.getUnassignedJobs().size() * 200; +// return costs; +// } +// }) +// .buildAlgorithm(); +// } +// }; - return Jsprit.Builder.newInstance(vrp) - .addCoreStateAndConstraintStuff(true) - .setStateAndConstraintManager(stateManager, constraintManager) - .setProperty(Jsprit.Parameter.THRESHOLD_INI, "0.1") -// .setProperty(Jsprit.Parameter.THRESHOLD_ALPHA, "0.3") -// .setProperty(Parameter.) -// .setProperty(Jsprit.Parameter.CONSTRUCTION, Jsprit.Construction.BEST_INSERTION.toString()) - .setObjectiveFunction(new SolutionCostCalculator() { - @Override - public double getCosts(VehicleRoutingProblemSolution solution) { - double costs = 0.; - for (VehicleRoute route : solution.getRoutes()) { - costs += route.getVehicle().getType().getVehicleCostParams().fix; - TourActivity prevAct = route.getStart(); - for (TourActivity act : route.getActivities()) { - costs += vrp.getTransportCosts().getTransportCost(prevAct.getLocation(), act.getLocation(), prevAct.getEndTime(), route.getDriver(), route.getVehicle()); - costs += vrp.getActivityCosts().getActivityCost(act, act.getArrTime(), route.getDriver(), route.getVehicle()); - prevAct = act; - } - costs += vrp.getTransportCosts().getTransportCost(prevAct.getLocation(), route.getEnd().getLocation(), prevAct.getEndTime(), route.getDriver(), route.getVehicle()); - } - costs += solution.getUnassignedJobs().size() * 200; - return costs; - } - }) - .buildAlgorithm(); - } - }; - VehicleRoutingAlgorithm vra = algorithmFactory.createAlgorithm(vrp); + VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp); vra.setMaxIterations(2000); vra.addListener(new AlgorithmSearchProgressChartListener("output/search")); VehicleRoutingProblemSolution solution = Solutions.bestOf(vra.searchSolutions()); diff --git a/jsprit-examples/src/main/java/jsprit/examples/WaitingTimeExample2.java b/jsprit-examples/src/main/java/jsprit/examples/WaitingTimeExample2.java new file mode 100644 index 00000000..905da16c --- /dev/null +++ b/jsprit-examples/src/main/java/jsprit/examples/WaitingTimeExample2.java @@ -0,0 +1,90 @@ +package jsprit.examples; + +import jsprit.analysis.toolbox.AlgorithmSearchProgressChartListener; +import jsprit.analysis.toolbox.Plotter; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.box.Jsprit; +import jsprit.core.problem.Location; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.solution.route.activity.TimeWindow; +import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleTypeImpl; +import jsprit.core.reporting.SolutionPrinter; +import jsprit.core.util.Solutions; + +/** + * Created by schroeder on 23/07/15. + */ +public class WaitingTimeExample2 { + + static interface AlgorithmFactory { + VehicleRoutingAlgorithm createAlgorithm(VehicleRoutingProblem vrp); + } + + public static void main(String[] args) { + + VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("type").setCostPerDistance(1.5).setCostPerWaitingTime(1.).build(); +// VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("type1").setCostPerDistance(1.5).setCostPerWaitingTime(.0).build(); + + VehicleImpl v2 = VehicleImpl.Builder.newInstance("v2").setType(type).setReturnToDepot(true) + .setStartLocation(Location.newInstance(0, 0)).build(); + + VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance(); + + + Service s1 = Service.Builder.newInstance("s12").setLocation(Location.newInstance(-1, 5)).setTimeWindow(TimeWindow.newInstance(100, 110)).build(); + Service s4 = Service.Builder.newInstance("s13").setLocation(Location.newInstance(0, 10)).build(); + Service s2 = Service.Builder.newInstance("s10").setLocation(Location.newInstance(1, 12)).build(); + Service s3 = Service.Builder.newInstance("s11").setLocation(Location.newInstance(4, 10)).build(); + Service s5 = Service.Builder.newInstance("s14").setLocation(Location.newInstance(6, 5)).setTimeWindow(TimeWindow.newInstance(110,220)).build(); + vrpBuilder.addJob(s1).addJob(s2).addJob(s3).addJob(s4).addJob(s5).addVehicle(v2); + vrpBuilder.setFleetSize(VehicleRoutingProblem.FleetSize.FINITE); + final VehicleRoutingProblem vrp = vrpBuilder.build(); + +// AlgorithmFactory algorithmFactory = new AlgorithmFactory() { +// @Override +// public VehicleRoutingAlgorithm createAlgorithm(final VehicleRoutingProblem vrp) { +// StateManager stateManager = new StateManager(vrp); +// stateManager.addStateUpdater(new UpdateFutureWaitingTimes(stateManager,vrp.getTransportCosts())); +// ConstraintManager constraintManager = new ConstraintManager(vrp,stateManager); +// +// return Jsprit.Builder.newInstance(vrp) +// .addCoreStateAndConstraintStuff(true) +// .setStateAndConstraintManager(stateManager, constraintManager) +//// .setProperty(Jsprit.Parameter.THRESHOLD_INI, "0.1") +//// .setProperty(Jsprit.Parameter.THRESHOLD_ALPHA, "0.3") +//// .setProperty(Parameter.) +//// .setProperty(Jsprit.Parameter.CONSTRUCTION, Jsprit.Construction.BEST_INSERTION.toString()) +// .setObjectiveFunction(new SolutionCostCalculator() { +// @Override +// public double getCosts(VehicleRoutingProblemSolution solution) { +// double costs = 0.; +// for (VehicleRoute route : solution.getRoutes()) { +// costs += route.getVehicle().getType().getVehicleCostParams().fix; +// TourActivity prevAct = route.getStart(); +// for (TourActivity act : route.getActivities()) { +// costs += vrp.getTransportCosts().getTransportCost(prevAct.getLocation(), act.getLocation(), prevAct.getEndTime(), route.getDriver(), route.getVehicle()); +// costs += vrp.getActivityCosts().getActivityCost(act, act.getArrTime(), route.getDriver(), route.getVehicle()); +// prevAct = act; +// } +// costs += vrp.getTransportCosts().getTransportCost(prevAct.getLocation(), route.getEnd().getLocation(), prevAct.getEndTime(), route.getDriver(), route.getVehicle()); +// } +// costs += solution.getUnassignedJobs().size() * 200; +// return costs; +// } +// }) +// .buildAlgorithm(); +// } +// }; + VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp); + vra.setMaxIterations(1000); + vra.addListener(new AlgorithmSearchProgressChartListener("output/search")); + VehicleRoutingProblemSolution solution = Solutions.bestOf(vra.searchSolutions()); + System.out.println("c: " + solution.getCost()); + SolutionPrinter.print(vrp, solution, SolutionPrinter.Print.VERBOSE); + + new Plotter(vrp,solution).setLabel(Plotter.Label.ID).plot("output/plot","plot"); + } +}