From d817c763d28db771702aab61017f4e10bfa892ff Mon Sep 17 00:00:00 2001 From: oblonski Date: Tue, 2 Aug 2016 20:15:34 +0200 Subject: [PATCH] add utility to add core constraints from everywhere --- .../jsprit/core/algorithm/AlgorithmUtil.java | 75 +++++++++++++++++++ .../algorithm/PrettyAlgorithmBuilder.java | 42 ++--------- 2 files changed, 83 insertions(+), 34 deletions(-) create mode 100644 jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/AlgorithmUtil.java diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/AlgorithmUtil.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/AlgorithmUtil.java new file mode 100644 index 00000000..94d61119 --- /dev/null +++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/AlgorithmUtil.java @@ -0,0 +1,75 @@ +/* + * Licensed to GraphHopper GmbH under one or more contributor + * license agreements. See the NOTICE file distributed with this work for + * additional information regarding copyright ownership. + * + * GraphHopper GmbH licenses this file to you 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 com.graphhopper.jsprit.core.algorithm; + +import com.graphhopper.jsprit.core.algorithm.state.*; +import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem; +import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager; +import com.graphhopper.jsprit.core.problem.constraint.SwitchNotFeasible; +import com.graphhopper.jsprit.core.problem.solution.route.VehicleRoute; +import com.graphhopper.jsprit.core.problem.vehicle.Vehicle; +import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeKey; +import com.graphhopper.jsprit.core.util.ActivityTimeTracker; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +/** + * Created by schroeder on 02/08/16. + */ +public class AlgorithmUtil { + + public static void addCoreConstraints(ConstraintManager constraintManager, StateManager stateManager, final VehicleRoutingProblem vrp){ + constraintManager.addTimeWindowConstraint(); + constraintManager.addLoadConstraint(); + constraintManager.addSkillsConstraint(); + constraintManager.addConstraint(new SwitchNotFeasible(stateManager)); + stateManager.updateLoadStates(); + stateManager.updateTimeWindowStates(); + UpdateVehicleDependentPracticalTimeWindows twUpdater = new UpdateVehicleDependentPracticalTimeWindows(stateManager, vrp.getTransportCosts(), vrp.getActivityCosts()); + twUpdater.setVehiclesToUpdate(new UpdateVehicleDependentPracticalTimeWindows.VehiclesToUpdate() { + + 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); + } + } + } + Collection vehicles = new ArrayList(); + vehicles.addAll(uniqueTypes.values()); + return vehicles; + } + + }); + stateManager.addStateUpdater(new UpdateEndLocationIfRouteIsOpen()); + stateManager.addStateUpdater(twUpdater); + stateManager.updateSkillStates(); + + stateManager.addStateUpdater(new UpdateActivityTimes(vrp.getTransportCosts(), ActivityTimeTracker.ActivityPolicy.AS_SOON_AS_TIME_WINDOW_OPENS, vrp.getActivityCosts())); + stateManager.addStateUpdater(new UpdateVariableCosts(vrp.getActivityCosts(), vrp.getTransportCosts(), stateManager)); + stateManager.addStateUpdater(new UpdateFutureWaitingTimes(stateManager, vrp.getTransportCosts())); + } +} diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/PrettyAlgorithmBuilder.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/PrettyAlgorithmBuilder.java index 522edced..7d6c4e17 100644 --- a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/PrettyAlgorithmBuilder.java +++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/PrettyAlgorithmBuilder.java @@ -58,6 +58,8 @@ public class PrettyAlgorithmBuilder { private boolean coreStuff = false; + private SolutionCostCalculator objectiveFunction = null; + public static PrettyAlgorithmBuilder newInstance(VehicleRoutingProblem vrp, VehicleFleetManager fleetManager, StateManager stateManager, ConstraintManager constraintManager) { return new PrettyAlgorithmBuilder(vrp, fleetManager, stateManager, constraintManager); } @@ -88,41 +90,9 @@ public class PrettyAlgorithmBuilder { public VehicleRoutingAlgorithm build() { if (coreStuff) { - constraintManager.addTimeWindowConstraint(); - constraintManager.addLoadConstraint(); - constraintManager.addSkillsConstraint(); - constraintManager.addConstraint(new SwitchNotFeasible(stateManager)); - stateManager.updateLoadStates(); - stateManager.updateTimeWindowStates(); - UpdateVehicleDependentPracticalTimeWindows twUpdater = new UpdateVehicleDependentPracticalTimeWindows(stateManager, vrp.getTransportCosts(), vrp.getActivityCosts()); - twUpdater.setVehiclesToUpdate(new UpdateVehicleDependentPracticalTimeWindows.VehiclesToUpdate() { - - 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); - } - } - } - Collection vehicles = new ArrayList(); - vehicles.addAll(uniqueTypes.values()); - return vehicles; - } - - }); - stateManager.addStateUpdater(new UpdateEndLocationIfRouteIsOpen()); - stateManager.addStateUpdater(twUpdater); - stateManager.updateSkillStates(); - - stateManager.addStateUpdater(new UpdateActivityTimes(vrp.getTransportCosts(), ActivityTimeTracker.ActivityPolicy.AS_SOON_AS_TIME_WINDOW_OPENS, vrp.getActivityCosts())); - stateManager.addStateUpdater(new UpdateVariableCosts(vrp.getActivityCosts(), vrp.getTransportCosts(), stateManager)); - stateManager.addStateUpdater(new UpdateFutureWaitingTimes(stateManager, vrp.getTransportCosts())); + AlgorithmUtil.addCoreConstraints(constraintManager,stateManager,vrp); } - VehicleRoutingAlgorithm vra = new VehicleRoutingAlgorithm(vrp, searchStrategyManager); + VehicleRoutingAlgorithm vra = new VehicleRoutingAlgorithm(vrp, searchStrategyManager, objectiveFunction); vra.addListener(stateManager); RemoveEmptyVehicles removeEmptyVehicles = new RemoveEmptyVehicles(fleetManager); ResetAndIniFleetManager resetAndIniFleetManager = new ResetAndIniFleetManager(fleetManager); @@ -175,4 +145,8 @@ public class PrettyAlgorithmBuilder { } + public PrettyAlgorithmBuilder withObjectiveFunction(SolutionCostCalculator objectiveFunction) { + this.objectiveFunction = objectiveFunction; + return this; + } }