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

Merge branch 'master' into bicycle-messenger

Conflicts:
	jsprit-examples/src/main/java/jsprit/examples/BicycleMessenger.java
This commit is contained in:
Stefan Schroeder 2013-12-03 17:16:20 +01:00
commit 70ff6a83d7
24 changed files with 1904 additions and 212 deletions

View file

@ -1,31 +0,0 @@
item id pickup_x pickup_y deliver_x deliver_y
envelope 1 13745 55419 13883 55756
envelope 2 8406 53246 13937 55854
envelope 3 15738 57396 35996 79499
envelope 4 12045 60418 19349 57118
envelope 5 13750 56416 35733 78403
envelope 6 13190 57068 11860 59749
envelope 7 15021 55768 14098 57379
envelope 8 11513 58543 11501 59683
envelope 9 12013 64155 14120 59301
envelope 10 15006 57578 35511 78426
envelope 11 11450 58819 11916 58338
envelope 12 13728 56304 35524 79013
envelope 13 15104 60923 17937 57066
envelope 14 11373 58388 13983 53804
envelope 15 18575 55186 18718 54381
envelope 16 11639 50071 17363 58375
envelope 17 11273 53410 10860 60441
envelope 18 13766 59041 13963 57769
envelope 19 16138 55801 16183 56024
envelope 20 13728 56146 14301 61694
envelope 21 12848 57059 13586 59734
envelope 22 13645 56488 13955 55859
envelope 23 12896 56838 13937 55908
envelope 24 13341 58150 35709 78924
envelope 25 13483 57303 13614 57820
envelope 26 12741 63478 15230 59838
envelope 27 14676 51691 16501 48361
envelope 28 13748 54933 14120 56110
envelope 29 17875 59565 20453 61903
envelope 30 9772 56424 6404 55601

View file

@ -1,6 +0,0 @@
type id x y
messenger A 13750 57578
messenger B 15104 53410
messenger C 13728 55801
messenger D 12741 63478
messenger E 14676 18575

File diff suppressed because it is too large Load diff

View file

@ -4,9 +4,7 @@ import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
@ -19,8 +17,10 @@ import jsprit.core.problem.VehicleRoutingProblem;
import jsprit.core.problem.VehicleRoutingProblem.Builder;
import jsprit.core.problem.VehicleRoutingProblem.FleetSize;
import jsprit.core.problem.constraint.HardActivityStateLevelConstraint;
import jsprit.core.problem.constraint.HardRouteStateLevelConstraint;
import jsprit.core.problem.cost.VehicleRoutingTransportCosts;
import jsprit.core.problem.driver.DriverImpl;
import jsprit.core.problem.io.VrpXMLWriter;
import jsprit.core.problem.job.Job;
import jsprit.core.problem.job.Shipment;
import jsprit.core.problem.misc.JobInsertionContext;
@ -39,42 +39,22 @@ public class BicycleMessenger {
static class ThreeTimesLessThanDirectRouteConstraint implements HardActivityStateLevelConstraint {
private VehicleRoutingTransportCosts vrpCosts;
private VehicleRoutingTransportCosts routingCosts;
//jobId map direct-distance by nearestMessenger
private Map<String,Double> bestMessengers = new HashMap<String, Double>();
public ThreeTimesLessThanDirectRouteConstraint(VehicleRoutingTransportCosts vrpCosts, Collection<Job> envelopes, Collection<Vehicle> messengers) {
super();
this.vrpCosts = vrpCosts;
determineNearestMessenger(envelopes,messengers);
}
private void determineNearestMessenger(Collection<Job> envelopes,Collection<Vehicle> messengers) {
for(Job envelope : envelopes){
double minDirect = Double.MAX_VALUE;
for(Vehicle m : messengers){
double direct = getDirectRouteDistance(envelope,m);
if(direct < minDirect){
minDirect = direct;
}
}
bestMessengers.put(envelope.getId(), minDirect);
}
}
private double getDirectRouteDistance(Job job, Vehicle v) {
Shipment envelope = (Shipment) job;
double direct = vrpCosts.getTransportTime(v.getLocationId(), envelope.getPickupLocation(), 0.0, DriverImpl.noDriver(), v) +
vrpCosts.getTransportTime(envelope.getPickupLocation(), envelope.getDeliveryLocation(), 0.0, DriverImpl.noDriver(), v);
return direct;
public ThreeTimesLessThanDirectRouteConstraint(Map<String, Double> nearestMessengers, VehicleRoutingTransportCosts routingCosts) {
this.bestMessengers = nearestMessengers;
this.routingCosts = routingCosts;
}
@Override
public ConstraintsStatus fulfilled(JobInsertionContext iFacts,TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime) {
if(newAct instanceof DeliverShipment){
double deliveryTime = prevActDepTime + vrpCosts.getTransportTime(prevAct.getLocationId(), newAct.getLocationId(), prevActDepTime, iFacts.getNewDriver(), iFacts.getNewVehicle());
if(deliveryTime > 3 * bestMessengers.get(((DeliverShipment) newAct).getJob().getId())){
double deliveryTime = prevActDepTime + routingCosts.getTransportTime(prevAct.getLocationId(), newAct.getLocationId(), prevActDepTime, iFacts.getNewDriver(), iFacts.getNewVehicle());
double directTimeOfNearestMessenger = bestMessengers.get(((DeliverShipment) newAct).getJob().getId());
if(deliveryTime > 3 * directTimeOfNearestMessenger){
return ConstraintsStatus.NOT_FULFILLED_BREAK;
}
}
@ -83,21 +63,52 @@ public class BicycleMessenger {
}
static class IgnoreMessengerThatCanNeverMeetTimeRequirements implements HardRouteStateLevelConstraint {
private Map<String,Double> bestMessengers = new HashMap<String, Double>();
private VehicleRoutingTransportCosts routingCosts;
public IgnoreMessengerThatCanNeverMeetTimeRequirements(Map<String, Double> bestMessengers,VehicleRoutingTransportCosts routingCosts) {
super();
this.bestMessengers = bestMessengers;
this.routingCosts = routingCosts;
}
@Override
public boolean fulfilled(JobInsertionContext insertionContext) {
double timeOfDirectRoute = getTimeOfDirectRoute(insertionContext.getJob(), insertionContext.getNewVehicle(), routingCosts);
double timeOfNearestMessenger = bestMessengers.get(insertionContext.getJob().getId());
if(timeOfDirectRoute > 3 * timeOfNearestMessenger){
return false;
}
return true;
}
}
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
VehicleRoutingProblem.Builder problemBuilder = VehicleRoutingProblem.Builder.newInstance();
readEnvelopes(problemBuilder);
readMessengers(problemBuilder);
VehicleRoutingTransportCosts routingCosts = new CrowFlyCosts(problemBuilder.getLocations());
Map<String,Double> nearestMessengers = getNearestMessengers(routingCosts, problemBuilder.getAddedJobs(), problemBuilder.getAddedVehicles());
problemBuilder.setFleetSize(FleetSize.FINITE);
// problemBuilder.addConstraint(new ThreeTimesLessThanDirectRouteConstraint(new CrowFlyCosts(problemBuilder.getLocations()),problemBuilder.getAddedJobs(),problemBuilder.getAddedVehicles()));
problemBuilder.addConstraint(new ThreeTimesLessThanDirectRouteConstraint(nearestMessengers, routingCosts));
problemBuilder.addConstraint(new IgnoreMessengerThatCanNeverMeetTimeRequirements(nearestMessengers, routingCosts));
VehicleRoutingProblem bicycleMessengerProblem = problemBuilder.build();
VehicleRoutingAlgorithm algorithm = VehicleRoutingAlgorithms.readAndCreateAlgorithm(bicycleMessengerProblem, 5,"input/algorithmConfig_open.xml");
// algorithm.setPrematureAlgorithmTermination(new IterationWithoutImprovementTermination(200));
VehicleRoutingAlgorithm algorithm = VehicleRoutingAlgorithms.readAndCreateAlgorithm(bicycleMessengerProblem,"input/algorithmConfig_open.xml");
algorithm.setPrematureAlgorithmTermination(new IterationWithoutImprovementTermination(200));
Collection<VehicleRoutingProblemSolution> solutions = algorithm.searchSolutions();
SolutionPrinter.print(Solutions.bestOf(solutions));
@ -113,9 +124,33 @@ public class BicycleMessenger {
// plotter1.setBoundingBox(10000, 47500, 20000, 67500);
plotter1.plot("output/bicycleMessengerSolution.png", "bicycleMessenger");
new VrpXMLWriter(bicycleMessengerProblem, solutions).write("output/bicycleMessenger.xml");
}
static Map<String,Double> getNearestMessengers(VehicleRoutingTransportCosts routingCosts, Collection<Job> envelopes, Collection<Vehicle> messengers) {
Map<String,Double> nearestMessengers = new HashMap<String, Double>();
for(Job envelope : envelopes){
double minDirect = Double.MAX_VALUE;
for(Vehicle m : messengers){
double direct = getTimeOfDirectRoute(envelope, m, routingCosts);
if(direct < minDirect){
minDirect = direct;
}
}
nearestMessengers.put(envelope.getId(), minDirect);
}
return nearestMessengers;
}
static double getTimeOfDirectRoute(Job job, Vehicle v, VehicleRoutingTransportCosts routingCosts) {
Shipment envelope = (Shipment) job;
double direct = routingCosts.getTransportTime(v.getLocationId(), envelope.getPickupLocation(), 0.0, DriverImpl.noDriver(), v) +
routingCosts.getTransportTime(envelope.getPickupLocation(), envelope.getDeliveryLocation(), 0.0, DriverImpl.noDriver(), v);
return direct;
}
private static void readEnvelopes(Builder problemBuilder) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader(new File("input/bicycle_messenger_demand.txt")));
String line = null;
@ -134,7 +169,7 @@ public class BicycleMessenger {
BufferedReader reader = new BufferedReader(new FileReader(new File("input/bicycle_messenger_supply.txt")));
String line = null;
boolean firstLine = true;
VehicleType messengerType = VehicleTypeImpl.Builder.newInstance("messengerType", Integer.MAX_VALUE).setCostPerDistance(1).build();
VehicleType messengerType = VehicleTypeImpl.Builder.newInstance("messengerType", 15).setCostPerDistance(1).build();
while((line = reader.readLine()) != null){
if(firstLine) { firstLine = false; continue; }
String[] tokens = line.split("\\s+");

View file

@ -27,7 +27,6 @@ import jsprit.core.algorithm.selector.SelectBest;
import jsprit.core.problem.VehicleRoutingProblem;
import jsprit.core.problem.io.VrpXMLReader;
import jsprit.core.problem.solution.VehicleRoutingProblemSolution;
import jsprit.instance.reader.SolomonReader;
public class SolomonOpenExample {

View file

@ -28,6 +28,7 @@ import jsprit.core.algorithm.io.VehicleRoutingAlgorithms;
import jsprit.core.algorithm.selector.SelectBest;
import jsprit.core.problem.VehicleRoutingProblem;
import jsprit.core.problem.VehicleRoutingProblem.Constraint;
import jsprit.core.problem.constraint.ServiceDeliveriesFirstConstraint;
import jsprit.core.problem.io.VrpXMLReader;
import jsprit.core.problem.solution.VehicleRoutingProblemSolution;
@ -62,7 +63,8 @@ public class VRPWithBackhaulsExample {
/*
* Finally, the problem can be built. By default, transportCosts are crowFlyDistances (as usually used for vrp-instances).
*/
vrpBuilder.addProblemConstraint(Constraint.DELIVERIES_FIRST);
// vrpBuilder.addProblemConstraint(Constraint.DELIVERIES_FIRST);
vrpBuilder.addConstraint(new ServiceDeliveriesFirstConstraint());
VehicleRoutingProblem vrp = vrpBuilder.build();

View file

@ -28,6 +28,7 @@ import jsprit.core.algorithm.io.VehicleRoutingAlgorithms;
import jsprit.core.algorithm.selector.SelectBest;
import jsprit.core.problem.VehicleRoutingProblem;
import jsprit.core.problem.VehicleRoutingProblem.Constraint;
import jsprit.core.problem.constraint.ServiceDeliveriesFirstConstraint;
import jsprit.core.problem.io.VrpXMLReader;
import jsprit.core.problem.solution.VehicleRoutingProblemSolution;
@ -62,7 +63,7 @@ public class VRPWithBackhaulsExample2 {
/*
* add the backhaul constraint to the problem
*/
vrpBuilder.addProblemConstraint(Constraint.DELIVERIES_FIRST);
vrpBuilder.addConstraint(new ServiceDeliveriesFirstConstraint());
/*
* Finally, the problem can be built. By default, transportCosts are crowFlyDistances (as usually used for vrp-instances).