1
0
Fork 0
mirror of https://github.com/graphhopper/jsprit.git synced 2020-01-24 07:45:05 +01:00

relax API

This commit is contained in:
Stefan Schroeder 2013-10-02 15:37:37 +02:00
parent 7fd1f90164
commit 08bb31c4f5
21 changed files with 112 additions and 25 deletions

View file

@ -22,7 +22,7 @@ package algorithms;
import basics.route.TourActivity; import basics.route.TourActivity;
interface MarginalsCalculus { interface ActivityInsertionCostCalculator {
class Marginals { class Marginals {
@ -51,5 +51,7 @@ interface MarginalsCalculus {
} }
Marginals calculate(InsertionContext iContext, TourActivity prevAct, TourActivity nextAct, TourActivity newAct, double depTimeAtPrevAct); Marginals calculate(InsertionContext iContext, TourActivity prevAct, TourActivity nextAct, TourActivity newAct, double depTimeAtPrevAct);
} }

View file

@ -0,0 +1,34 @@
package algorithms;
import basics.VehicleRoutingProblem;
import algorithms.HardConstraints.HardActivityLevelConstraint;
import algorithms.HardConstraints.HardRouteLevelConstraint;
public class BestInsertionBuilder implements InsertionStrategyBuilder{
private VehicleRoutingProblem vrp;
private StateManager stateManager;
public BestInsertionBuilder(VehicleRoutingProblem vrp, StateManager stateManager) {
super();
this.vrp = vrp;
this.stateManager = stateManager;
}
public void addConstraint(HardActivityLevelConstraint hardActvitiyLevelConstraint){};
public void addConstraint(HardRouteLevelConstraint hardRouteLevelConstraint){};
public void setRouteLevel(int forwardLooking, int memory){};
public void setLocalLevel(){};
public void setActivityInsertionCostCalculator(ActivityInsertionCostCalculator costCalc){};
@Override
public InsertionStrategy build() {
return null;
}
}

View file

@ -16,7 +16,7 @@ import org.apache.log4j.Logger;
import util.Neighborhood; import util.Neighborhood;
import algorithms.HardConstraints.HardRouteLevelConstraint; import algorithms.HardConstraints.HardRouteLevelConstraint;
import algorithms.MarginalsCalculus.Marginals; import algorithms.ActivityInsertionCostCalculator.Marginals;
import basics.Job; import basics.Job;
import basics.Service; import basics.Service;
import basics.costs.VehicleRoutingTransportCosts; import basics.costs.VehicleRoutingTransportCosts;
@ -47,7 +47,7 @@ final class CalculatesServiceInsertion implements JobInsertionCalculator{
} }
}; };
private MarginalsCalculus marginalCalculus; private ActivityInsertionCostCalculator marginalCalculus;
private VehicleRoutingTransportCosts transportCosts; private VehicleRoutingTransportCosts transportCosts;
@ -58,7 +58,7 @@ final class CalculatesServiceInsertion implements JobInsertionCalculator{
logger.info("initialise neighborhood " + neighborhood); logger.info("initialise neighborhood " + neighborhood);
} }
public CalculatesServiceInsertion(VehicleRoutingTransportCosts routingCosts, MarginalsCalculus marginalsCalculus, HardRouteLevelConstraint hardRouteLevelConstraint) { public CalculatesServiceInsertion(VehicleRoutingTransportCosts routingCosts, ActivityInsertionCostCalculator marginalsCalculus, HardRouteLevelConstraint hardRouteLevelConstraint) {
super(); super();
this.marginalCalculus = marginalsCalculus; this.marginalCalculus = marginalsCalculus;
this.hardRouteLevelConstraint = hardRouteLevelConstraint; this.hardRouteLevelConstraint = hardRouteLevelConstraint;

View file

@ -219,7 +219,7 @@ class CalculatorBuilder {
private CalculatorPlusListeners createStandardLocal(VehicleRoutingProblem vrp, StateManager statesManager){ private CalculatorPlusListeners createStandardLocal(VehicleRoutingProblem vrp, StateManager statesManager){
if(constraintManager == null) throw new IllegalStateException("constraint-manager is null"); if(constraintManager == null) throw new IllegalStateException("constraint-manager is null");
MarginalsCalculus defaultCalc = new MarginalsCalculusTriangleInequality(vrp.getTransportCosts(), vrp.getActivityCosts(), constraintManager); ActivityInsertionCostCalculator defaultCalc = new MarginalsCalculusTriangleInequality(vrp.getTransportCosts(), vrp.getActivityCosts(), constraintManager);
JobInsertionCalculator standardServiceInsertion = new CalculatesServiceInsertion(vrp.getTransportCosts(), defaultCalc, constraintManager); JobInsertionCalculator standardServiceInsertion = new CalculatesServiceInsertion(vrp.getTransportCosts(), defaultCalc, constraintManager);
((CalculatesServiceInsertion) standardServiceInsertion).setNeighborhood(vrp.getNeighborhood()); ((CalculatesServiceInsertion) standardServiceInsertion).setNeighborhood(vrp.getNeighborhood());

View file

@ -23,7 +23,7 @@ class EuclideanServiceDistance implements JobDistance {
} }
@Override @Override
public double calculateDistance(Job i, Job j) { public double getDistance(Job i, Job j) {
double avgCost = 0.0; double avgCost = 0.0;
if (i instanceof Service && j instanceof Service) { if (i instanceof Service && j instanceof Service) {
if (i.equals(j)) { if (i.equals(j)) {

View file

@ -27,7 +27,7 @@ import basics.route.VehicleRoute;
* *
*/ */
interface InsertionStrategy { public interface InsertionStrategy {
class Insertion { class Insertion {

View file

@ -0,0 +1,7 @@
package algorithms;
public interface InsertionStrategyBuilder {
public InsertionStrategy build();
}

View file

@ -16,8 +16,8 @@ import basics.Job;
interface JobDistance { public interface JobDistance {
public double calculateDistance(Job i, Job j); public double getDistance(Job i, Job j);
} }

View file

@ -45,7 +45,7 @@ class JobDistanceAvgCosts implements JobDistance {
* <p>If the distance between two jobs cannot be calculated with input-transport costs, it tries the euclidean distance between these jobs. * <p>If the distance between two jobs cannot be calculated with input-transport costs, it tries the euclidean distance between these jobs.
*/ */
@Override @Override
public double calculateDistance(Job i, Job j) { public double getDistance(Job i, Job j) {
double avgCost = 0.0; double avgCost = 0.0;
if (i instanceof Service && j instanceof Service) { if (i instanceof Service && j instanceof Service) {
if (i.equals(j)) { if (i.equals(j)) {
@ -72,7 +72,7 @@ class JobDistanceAvgCosts implements JobDistance {
// now try the euclidean distance between these two services // now try the euclidean distance between these two services
} }
EuclideanServiceDistance euclidean = new EuclideanServiceDistance(); EuclideanServiceDistance euclidean = new EuclideanServiceDistance();
distance = euclidean.calculateDistance(s_i, s_j); distance = euclidean.getDistance(s_i, s_j);
return distance; return distance;
} }

View file

@ -29,7 +29,7 @@ class JobDistanceBeeline implements JobDistance {
} }
@Override @Override
public double calculateDistance(Job i, Job j) { public double getDistance(Job i, Job j) {
double avgCost = 0.0; double avgCost = 0.0;
if (i instanceof Service && j instanceof Service) { if (i instanceof Service && j instanceof Service) {
if (i.equals(j)) { if (i.equals(j)) {

View file

@ -25,7 +25,7 @@ import basics.costs.VehicleRoutingActivityCosts;
import basics.costs.VehicleRoutingTransportCosts; import basics.costs.VehicleRoutingTransportCosts;
import basics.route.TourActivity; import basics.route.TourActivity;
class MarginalsCalculusTriangleInequality implements MarginalsCalculus{ class MarginalsCalculusTriangleInequality implements ActivityInsertionCostCalculator{
private HardActivityLevelConstraint hardConstraint; private HardActivityLevelConstraint hardConstraint;

View file

@ -0,0 +1,22 @@
package algorithms;
import basics.VehicleRoutingProblem;
public class RadialRuinStrategyFactory implements RuinStrategyFactory{
private double fraction;
private JobDistance jobDistance;
public RadialRuinStrategyFactory(double fraction, JobDistance jobDistance) {
super();
this.fraction = fraction;
this.jobDistance = jobDistance;
}
@Override
public RuinStrategy createStrategy(VehicleRoutingProblem vrp) {
return new RuinRadial(vrp,fraction,jobDistance);
}
}

View file

@ -0,0 +1,19 @@
package algorithms;
import basics.VehicleRoutingProblem;
public class RandomRuinStrategyFactory implements RuinStrategyFactory{
private double fraction;
public RandomRuinStrategyFactory(double fraction) {
super();
this.fraction = fraction;
}
@Override
public RuinStrategy createStrategy(VehicleRoutingProblem vrp) {
return new RuinRandom(vrp, fraction);
}
}

View file

@ -30,7 +30,7 @@ import basics.algo.InsertionListener;
import basics.algo.SearchStrategyModule; import basics.algo.SearchStrategyModule;
import basics.algo.SearchStrategyModuleListener; import basics.algo.SearchStrategyModuleListener;
class RuinAndRecreateModule implements SearchStrategyModule{ public class RuinAndRecreateModule implements SearchStrategyModule{
private InsertionStrategy insertion; private InsertionStrategy insertion;
@ -49,9 +49,13 @@ class RuinAndRecreateModule implements SearchStrategyModule{
public VehicleRoutingProblemSolution runAndGetSolution(VehicleRoutingProblemSolution vrpSolution) { public VehicleRoutingProblemSolution runAndGetSolution(VehicleRoutingProblemSolution vrpSolution) {
Collection<Job> ruinedJobs = ruin.ruin(vrpSolution.getRoutes()); Collection<Job> ruinedJobs = ruin.ruin(vrpSolution.getRoutes());
insertion.insertJobs(vrpSolution.getRoutes(), ruinedJobs); insertion.insertJobs(vrpSolution.getRoutes(), ruinedJobs);
scoreSolution(vrpSolution);
return vrpSolution;
}
private void scoreSolution(VehicleRoutingProblemSolution vrpSolution) {
double totalCost = RouteUtils.getTotalCost(vrpSolution.getRoutes()); double totalCost = RouteUtils.getTotalCost(vrpSolution.getRoutes());
vrpSolution.setCost(totalCost); vrpSolution.setCost(totalCost);
return vrpSolution;
} }
@Override @Override

View file

@ -106,7 +106,7 @@ final class RuinRadial implements RuinStrategy {
}); });
distanceNodeTree.put(i.getId(), treeSet); distanceNodeTree.put(i.getId(), treeSet);
for (Job j : vrp.getJobs().values()) { for (Job j : vrp.getJobs().values()) {
double distance = jobDistance.calculateDistance(i, j); double distance = jobDistance.getDistance(i, j);
ReferencedJob refNode = new ReferencedJob(j, distance); ReferencedJob refNode = new ReferencedJob(j, distance);
treeSet.add(refNode); treeSet.add(refNode);
nuOfDistancesStored++; nuOfDistancesStored++;

View file

@ -26,7 +26,7 @@ import basics.route.VehicleRoute;
* *
*/ */
interface RuinStrategy { public interface RuinStrategy {
/** /**
* Listener that listens to the ruin-process. It informs whoever is interested about start, end and about a removal of a job. * Listener that listens to the ruin-process. It informs whoever is interested about start, end and about a removal of a job.

View file

@ -22,7 +22,7 @@ package algorithms;
import basics.VehicleRoutingProblem; import basics.VehicleRoutingProblem;
interface RuinStrategyFactory { public interface RuinStrategyFactory {
public RuinStrategy createStrategy(VehicleRoutingProblem vrp); public RuinStrategy createStrategy(VehicleRoutingProblem vrp);

View file

@ -23,7 +23,7 @@ package algorithms;
import basics.route.TourActivity; import basics.route.TourActivity;
import basics.route.VehicleRoute; import basics.route.VehicleRoute;
interface StateManager { public interface StateManager {
interface State { interface State {
double toDouble(); double toDouble();

View file

@ -62,7 +62,7 @@ public class BuildCVRPAlgoFromScratchTest {
return true; return true;
} }
}; };
MarginalsCalculus marginalCalculus = new MarginalsCalculusTriangleInequality(vrp.getTransportCosts(), vrp.getActivityCosts(), hardActLevelConstraint); ActivityInsertionCostCalculator marginalCalculus = new MarginalsCalculusTriangleInequality(vrp.getTransportCosts(), vrp.getActivityCosts(), hardActLevelConstraint);
CalculatesServiceInsertion serviceInsertion = new CalculatesServiceInsertion(vrp.getTransportCosts(), marginalCalculus, new HardConstraints.HardLoadConstraint(stateManager)); CalculatesServiceInsertion serviceInsertion = new CalculatesServiceInsertion(vrp.getTransportCosts(), marginalCalculus, new HardConstraints.HardLoadConstraint(stateManager));
VehicleFleetManager fleetManager = new InfiniteVehicles(vrp.getVehicles()); VehicleFleetManager fleetManager = new InfiniteVehicles(vrp.getVehicles());

View file

@ -78,7 +78,7 @@ public class BuildPDVRPAlgoFromScratchTest {
actLevelConstraintAccumulator.addConstraint(new HardConstraints.HardPickupAndDeliveryActivityLevelConstraint(stateManager)); actLevelConstraintAccumulator.addConstraint(new HardConstraints.HardPickupAndDeliveryActivityLevelConstraint(stateManager));
actLevelConstraintAccumulator.addConstraint(new HardConstraints.HardTimeWindowActivityLevelConstraint(stateManager, vrp.getTransportCosts())); actLevelConstraintAccumulator.addConstraint(new HardConstraints.HardTimeWindowActivityLevelConstraint(stateManager, vrp.getTransportCosts()));
MarginalsCalculus marginalCalculus = new MarginalsCalculusTriangleInequality(vrp.getTransportCosts(), vrp.getActivityCosts(), actLevelConstraintAccumulator); ActivityInsertionCostCalculator marginalCalculus = new MarginalsCalculusTriangleInequality(vrp.getTransportCosts(), vrp.getActivityCosts(), actLevelConstraintAccumulator);
CalculatesServiceInsertion serviceInsertion = new CalculatesServiceInsertion(vrp.getTransportCosts(), marginalCalculus, new HardConstraints.HardPickupAndDeliveryLoadConstraint(stateManager)); CalculatesServiceInsertion serviceInsertion = new CalculatesServiceInsertion(vrp.getTransportCosts(), marginalCalculus, new HardConstraints.HardPickupAndDeliveryLoadConstraint(stateManager));
// CalculatesServiceInsertion serviceInsertion = new CalculatesServiceInsertion(vrp.getTransportCosts(), marginalCalculus, new HardConstraints.HardLoadConstraint(stateManager)); // CalculatesServiceInsertion serviceInsertion = new CalculatesServiceInsertion(vrp.getTransportCosts(), marginalCalculus, new HardConstraints.HardLoadConstraint(stateManager));
@ -104,8 +104,7 @@ public class BuildPDVRPAlgoFromScratchTest {
strategyManager.addStrategy(randomStrategy, 0.5); strategyManager.addStrategy(randomStrategy, 0.5);
vra = new VehicleRoutingAlgorithm(vrp, strategyManager); vra = new VehicleRoutingAlgorithm(vrp, strategyManager);
vra.getAlgorithmListeners().addListener(new StateUpdates.ResetStateManager(stateManager)); vra.getAlgorithmListeners().addListener(new StateUpdates.ResetStateManager(stateManager));
final IterateRouteForwardInTime iterateForward = new IterateRouteForwardInTime(vrp.getTransportCosts()); final IterateRouteForwardInTime iterateForward = new IterateRouteForwardInTime(vrp.getTransportCosts());

View file

@ -60,7 +60,7 @@ public class TestJobDistanceAvgCosts {
} }
}; };
JobDistanceAvgCosts c = new JobDistanceAvgCosts(costs); JobDistanceAvgCosts c = new JobDistanceAvgCosts(costs);
c.calculateDistance(Service.Builder.newInstance("1", 1).setLocationId("foo").build(), Service.Builder.newInstance("2", 2).setLocationId("foo").build()); c.getDistance(Service.Builder.newInstance("1", 1).setLocationId("foo").build(), Service.Builder.newInstance("2", 2).setLocationId("foo").build());
} }
@Test(expected=NullPointerException.class) @Test(expected=NullPointerException.class)
@ -96,7 +96,7 @@ public class TestJobDistanceAvgCosts {
} }
}; };
JobDistanceAvgCosts c = new JobDistanceAvgCosts(costs); JobDistanceAvgCosts c = new JobDistanceAvgCosts(costs);
c.calculateDistance(Service.Builder.newInstance("1", 1).setLocationId("loc").build(), Service.Builder.newInstance("2", 2).setLocationId("loc").build()); c.getDistance(Service.Builder.newInstance("1", 1).setLocationId("loc").build(), Service.Builder.newInstance("2", 2).setLocationId("loc").build());
} }
} }